教你使用stm32接收串列埠的一幀資料!

2021-08-22 19:13:07 字數 2811 閱讀 3174

stm32支援接受單個資料或者一幀資料,若配置單個資料接收中斷的話,會出現接收包丟包,資料不完整的情況!因此在stm32的串列埠中斷中,還有乙個idle中斷,用來產生串列埠接受一幀資料而產生的中斷,比如說串列埠發來n個資料,會產生n次接收中斷和一次idle中斷,因此方便使用者來接收主機傳送或者從機返回的資料!若想傳送一幀資料到串列埠請參照我部落格中的另一篇文章——教你如何使用stm32傳送一幀資料! 為了方便大家移植,提醒大家此次**中的**不需要任何修改,只需要複製貼上即可!

第一步:首先配置串列埠中斷!

(我配置的是串列埠3,可根據自己的使用情況更改配置。需要更改的地方:時 鐘rcc,gpio_pin,中斷入口,將所   有的usart3改為你配置的串列埠即可)

gpio_inittypedef gpio_initstructure;

nvic_inittypedef nvic_initstructure;

usart_inittypedef usart_initstructure;

rcc_apb2periphclockcmd(rcc_apb2periph_gpiob|rcc_apb2periph_afio,enable);

rcc_apb1periphclockcmd(rcc_apb1periph_usart3,enable);

gpio_initstructure.gpio_pin=gpio_pin_10;//tx

gpio_initstructure.gpio_speed=gpio_speed_10mhz;

gpio_initstructure.gpio_mode=gpio_mode_af_pp;

gpio_init(gpiob,&gpio_initstructure);

gpio_initstructure.gpio_speed=gpio_speed_10mhz;

gpio_initstructure.gpio_pin=gpio_pin_11;//rx

gpio_initstructure.gpio_mode=gpio_mode_in_floating;

gpio_init(gpiob,&gpio_initstructure);

nvic_prioritygroupconfig(nvic_prioritygroup_1);

nvic_initstructure.nvic_irqchannel = usart3_irqn;

nvic_initstructure.nvic_irqchannelpreemptionpriority = 0;

nvic_initstructure.nvic_irqchannelsubpriority = 1;

nvic_initstructure.nvic_irqchannelcmd = enable;

nvic_init(&nvic_initstructure);

usart_initstructure.usart_baudrate=2400;

usart_initstructure.usart_wordlength=usart_wordlength_8b;

usart_initstructure.usart_stopbits=usart_stopbits_1;

usart_initstructure.usart_parity=usart_parity_no;

usart_initstructure.usart_hardwareflowcontrol=usart_hardwareflowcontrol_none;

usart_initstructure.usart_mode=usart_mode_rx|usart_mode_tx;

usart_init(usart3,&usart_initstructure);

usart_cmd(usart3, enable);

usart_itconfig(usart3, usart_it_rxne, enable);

usart_itconfig(usart3, usart_it_idle, enable);

usart_itconfig(usart3, usart_it_rxne, enable);
usart_itconfig(usart3, usart_it_idle, enable);
至此,串列埠配置完成,下面進入中斷入口函式中!

第二步:寫中斷處理函式

void usart3_irqhandler(void)

else if(usart_getflagstatus(usart3,usart_flag_idle)!=bit_reset)

}

至此串列埠配置完成,程式執行時,只需要將配置串列埠函式放到主函式中,當串列埠發來一幀資料後即可將所有資料存到接受緩衝陣列中!

STM32串列埠接收策略

如果我們需要接收乙個序列協議,怎麼做呢?先放到緩衝區然後再檢查標誌位是一種思路。道理簡單,關鍵要看怎麼設計。這裡介紹的方法是巧妙利用定時器,與串列埠中斷進行耦合,得到一種魯棒的接收方法。具體 開啟定時器與串列埠中斷 首先用示波器檢視完整幀所需要的時間,並且設定為timmax。定時器以適當的中斷頻率開...

STM32使用HAL庫寫串列埠接收中斷

硬體 正點原子戰艦開發板 stm32f103zet6 軟體 mdk5,stm32cubemx 下面講解使用hal庫配置串列埠1,使串列埠1可以使用中斷接收位元組並原樣返回。uint8 t uart1 rxbuf 10 用於存放接收到的資料 void mx usart1 uart init void ...

STM32 一直進入串列埠接收中斷

串列埠初始化配置時,需要開啟ore 溢位中斷,否則串列埠中斷沒有及時讀取資料會觸發溢位中斷 開啟接收中斷預設開啟溢位中斷,但是為了讀取溢位標誌位還需要明確執行以下開啟溢位中斷 如果沒有清溢位中斷就會一直進串列埠中斷。usart itconfig usart2,usart it ore,enable ...