本篇博文最後修改時間:2017年07月10日 21:48。
一、簡介
本文以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.初始化串口
UART1_DeInit();
UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
UART1_Cmd(ENABLE);
enableInterrupts();
3.編寫主函數
void main(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
Init_UART1();
enableInterrupts();
/* Infinite loop */
while (1)
{
if(flagpacker)
{
flagpacker = 0;
for(unsigned char num = 0; num < length;num++)
Send(Rxpacker[num]);
}
}
}
4.編寫中斷服務函數
unsigned char flagpacker; //全局變量 是否完整接收一個數據包
unsigned char Rxpacker[255]; //全局變量 完整數據包
unsigned char length; //數據長度
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
unsigned char RxBuf; //臨時接收
static unsigned char RxData[255];//接收數據緩存區
static unsigned char count; //串口接收數據長度
static unsigned char rec; // 判斷是否正在接收數據
UART1_ClearITPendingBit(UART1_IT_RXNE);
RxBuf = UART1_ReceiveData8();
if(RxBuf == (0xcc)) //幀頭
{
rec= 1;
count = 0;
flagpacker = 0;
return ;
}
if(RxBuf == (0xcd)) //幀尾
{
rec= 0;
//此處可以添加校驗碼
length = count;
for(unsigned char i = 0; i<count;i++)
{
Rxpacker[i] =RxData[i];
}
flagpacker = 1;//告訴系統已接收一個完整的數據包
return ;
}
if(rec) //判斷是否處於接收狀態
{
RxData[count++] = RxBuf;
}
}