本篇博文最後修改時間:2017年08月04日 18:29。
一、簡介
本文以STM8S103F3P6編程爲例,介紹STM8S103F3P6串口中斷髮送。
二、實驗平臺
電腦平臺:Windows7 64位旗艦
編譯軟件:IAR
硬件平臺:STM8S103F3P6
三、版權聲明
博主:_懵懂
聲明:此博客僅供參考不做任何商業用途,最終解釋權歸原博主所有。
原文地址:http://blog.csdn.NET/qq_18842031
懵懂之MCU交流羣:136384801
四、實驗前提
1、在進行本文步驟前,請先安裝IAR EWSTM8-EV-1311版本;準備好STM8S103F3P6硬件平臺。
五、基礎知識
暫無
六、源碼地址
暫無
七、實驗內容
1.系統時鐘初始化爲內部16M】
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //時鐘 初始化時鐘爲1分頻 16M 2分頻8M
2.初始化串口
void Init_UART1(void)
{
UART1_DeInit(); //恢復串口所有寄存器
UART1_Init((u32)9600, //波特率9600
UART1_WORDLENGTH_8D, //8位
UART1_STOPBITS_1, //停止位1
UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE,
UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE); //使能接收中斷
// UART1_ITConfig(UART1_IT_TC, ENABLE); //使能發送中斷 發送中斷使能是那裏需要才使能
UART1_Cmd(ENABLE);
}
3.編寫查詢方式發送數據入口
void UART1_Send(uint8_t *dat,uint8_t len)
{
uint8_t i = 0;
for(i=0; i<len; i++)
{
while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
UART1_SendData8(*dat++);
}
}
4.編寫中斷方式發送數據入口
uint8_t Rxd_buf[20]; //接收數組
uint8_t Rxd_len; //接收長度
uint8_t Rxd_F; //接收標誌位
uint8_t Txd_buf[20]; //發送數組
uint8_t Txd_len; //發送長度
uint8_t Txd_F; //發送標誌位
void Send(uint8_t dat)
{
while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
UART1_SendData8(dat);
}
uint8_t Set_UART1Interrupt(uint8_t *lV_dat,uint8_t lV_len)
{
if(Txd_len != 0)
{
return FALSE;
}
for(Txd_len=0;Txd_len <lV_len;Txd_len++) //將數據裝到全局變量中
Txd_buf[Txd_len]=lV_dat[Txd_len];
UART1_ITConfig(UART1_IT_TC, ENABLE); //使能發送中斷
return TRUE;
}
5.編寫主函
void main(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //內部時鐘16M
Init_UART1();
enableInterrupts();
UART1_Send("Hi\n",3); //查詢發送
Set_UART1Interrupt("Hello\n",6); //中斷髮送數據
while(1);
}
6.編寫中斷服務函數
INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
{
static uint8_t lV_num; //記錄已經發送數據的長度
Send(Txd_buf[lV_num++]);
if(lV_num == Txd_len) //發送數據的長度和需要發送數據的長度相等 就關閉發送中斷
{
lV_num = 0;
(void) memset(Txd_buf,0,Txd_len);
Txd_len = 0;
UART1_ITConfig(UART1_IT_TC, DISABLE); //禁止發送中斷
}
return;
}