參考了文章:《stm32串列埠中斷接收方式詳細比較》
借鑑了第四種中斷方式
串列埠的配置這裡不做說明,僅對stm32接收中斷中的資料進行解析。
資料幀協議:
幀頭1幀頭2
資料長度
有效資料
crc_1
crc_2
b5 5b
0300
570b
幀頭1+幀頭2+資料長度(包含有效資料、crc_1、crc_2)+有效資料 + crc_1 + crc_2(校驗為幀頭到有效資料)
協議採用小端模式,低位元組在前,高位元組在後。
crc16校驗未深入學習,**也不是自己寫的,我僅是拿來用,所以未給出,也可以選擇其他校驗方法。
crc16函式宣告:uint16_t crc16(uint8_t * buf, uint16_t len); 返回值為uint16_t校驗值
**如下:
/****************************
函式名稱: usart2_irqhandler
功 能:串列埠2接收中斷
參 數:無
返 回 值:無
作 者:yao
***************************
*/uint8_t uart2_buffer[
256]; //
接收緩衝區
uint8_t uart2_rx = 0; //
uart2_buffer下標
uint8_t uart2_head1; //
幀頭1uint8_t uart2_head2; //
幀頭2uint8_t uart2_len; //
資料長度(第三位元組以後包含crc)
uint16_t uart2_temp; //
crc16()返回值
uint8_t uart2_sta; //
資料幀正確標誌
uint8_t uart2_tx2; //
傳送計數
uint16_t crc16(uint8_t * buf, uint16_t len); //
crc16函式宣告,定義未給出。返回uint16_t校驗值
void
usart2_irqhandler()
if(uart2_buffer[uart2_rx-1] == 0xb5) //
判斷幀頭1
uart2_head1 = uart2_rx-1
;
else
if((uart2_rx-1 == uart2_head1+1)&&(uart2_buffer[uart2_rx-1] == 0x5b)) //
判斷幀頭1資料後是否為幀頭2
uart2_head2 = uart2_rx-1;
else
if(uart2_rx-1 == uart2_head2+1) //
得到資料長度
uart2_len = uart2_buffer [uart2_rx-1
];
else
if(uart2_rx-1 == uart2_head1 + uart2_len+2) //
確保接收一幀資料
}if(usart_getflagstatus(usart2,usart_flag_ore) ==set)
if(uart2_sta) //
檢測到標誌
}
STM32串列埠接收策略
如果我們需要接收乙個序列協議,怎麼做呢?先放到緩衝區然後再檢查標誌位是一種思路。道理簡單,關鍵要看怎麼設計。這裡介紹的方法是巧妙利用定時器,與串列埠中斷進行耦合,得到一種魯棒的接收方法。具體 開啟定時器與串列埠中斷 首先用示波器檢視完整幀所需要的時間,並且設定為timmax。定時器以適當的中斷頻率開...
STM32串列埠接收中斷BUG
除錯串列埠時,發現串列埠會出現頻繁跳中斷,導致無法執行主迴圈的問題!除錯發現是串列埠中斷硬體bug 1.usart itconfig usart 1,usart it rxne,enable 使能了接收中斷,那麼ore中斷也同時被開啟了。2.ore中斷只能使用usart getflagstatus ...
STM32串列埠通訊中斷接收
串列埠的時序和工作原理就不寫了,主要寫如何應用 串列埠的設定除了gpio外,需要設定的引數有波特率 資料位 停止位,校驗方式 gpio輸出配置af pp復用推挽輸出 gpio出入配置in flaoting浮空輸入 usart的配置為115200的波特率,8位資料長度,1位停止位,無校驗,無硬體流控制...