STM32 串列埠通訊學習

2021-10-08 17:55:00 字數 3664 閱讀 6791

1)初始化gpio。

2)中斷和串列埠1配置。

3)寫串列埠中斷服務函式。

4)寫主函式。

不管是初始化gpio口還是定時器,串列埠等等,都需要先進行宣告。

gpio_inittypedef gpio_initstructure;

usart_inittypedef usart_initstructure;

nvic_inittypedef nvic_initstructure;

tx:傳送資料輸出引腳—對應gpioa.9

rx:接收資料輸入引腳—對應gpioa.10

因為我們需要用到的gpio口是pa9和10。所以我們只需要初始化這兩個口。先使能串列埠1和gpiaoa。pa9是傳送端,所以設定為復用推挽輸出。pa10是接收端,設定為浮空輸入模式。其速度一般設定為最大。

rcc_apb2periphclockcmd(rcc_apb2periph_usart1|rcc_apb2periph_gpioa, enable);	//使能usart1,gpioa時鐘
//usart1_tx   gpioa.9

gpio_initstructure.gpio_pin = gpio_pin_9;

gpio_initstructure.gpio_speed = gpio_speed_50mhz;

gpio_initstructure.gpio_mode = gpio_mode_af_pp; //復用推挽輸出

gpio_init(gpioa, &gpio_initstructure);//初始化gpioa.9

//usart1_rx gpioa.10初始化

gpio_initstructure.gpio_pin = gpio_pin_10;//pa10

gpio_initstructure.gpio_mode = gpio_mode_in_floating;//浮空輸入

gpio_init(gpioa, &gpio_initstructure);//初始化gpioa.10

對中斷進行分級,和使能相關通道。我覺得這些原始碼裡面都有只有我們理解它怎麼用就好。

//usart1 nvic 配置

nvic_initstructure.nvic_irqchannel = usart1_irqn;

nvic_initstructure.nvic_irqchannelpreemptionpriority=3 ;//搶占優先順序3

nvic_initstructure.nvic_irqchannelsubpriority = 3; //子優先順序3

nvic_initstructure.nvic_irqchannelcmd = enable; //irq通道使能

nvic_init(&nvic_initstructure); //根據指定的引數初始化vic暫存器

//usart 初始化設定

usart_initstructure.usart_baudrate = bound;//串列埠波特率

usart_initstructure.usart_wordlength = usart_wordlength_8b;//字長為8位資料格式

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(usart1, &usart_initstructure); //初始化串列埠1

usart_itconfig(usart1, usart_it_rxne, enable);//開啟串列埠接受中斷

usart_cmd(usart1, enable); //使能串列埠1

這部分就是比較重要的一部分了,每當你在電腦給串列埠發生資料,它就會進入一次串列埠中斷實行串列埠中斷服務函式,這些我以學習原始碼為例。

void usart1_irqhandler(void)                	//串列埠1中斷服務程式

else //還沒收到0x0d

}}

} #if system_support_os //如果system_support_os為真,則需要支援os.

osintexit();

#endif

}

這個中斷服務函式是為了判斷我們的資料是否接收成功。usart_rx_sta是判斷資料是否接收成功的函式,一般用完之後要清除,這樣下乙個資料才能進行接收。接收到的資料都會放在資料快取區usart_rx_buf中,如果不清除快取區,下乙個接收的資料會覆蓋原來的資料(也有可能前面的是七位字元,而後面接收的只是五位,這樣子就只是覆蓋了前五位,還有兩位是沒有覆蓋的)

一般我們需要使用串列埠實現的功能,其**都會放在主函式中,除非使用了串列埠中斷,並在串列埠中斷服務函式中寫了功能的相關**。

int main(void)

{ u16 i;

u16 a=300;

u16 t;

u16 len;

u16 times=0;

delay_init(); //延時函式初始化

nvic_prioritygroupconfig(nvic_prioritygroup_2); //設定nvic中斷分組2:2位搶占優先順序,2位響應優先順序

uart_init(115200); //串列埠初始化為115200

led_init(); //led埠初始化

key_init(); //初始化與按鍵連線的硬體介面

while(1)

{ if(usart_rx_sta&0x8000)

{

len=usart_rx_sta&0x3fff;//得到此次接收到的資料長度

printf("\r\n您傳送的訊息為:\r\n\r\n");

for(t=0;t以上主函式要實現的功能為:如果我們沒有傳送資料,則開發板上的燈會一直閃爍,提示程式正在執行中,並在串列埠除錯助手介面每隔一段時間列印出「請輸入資料,以回車建結束」,知道我們傳送了資料,例如我們傳送:stm32學習資料,給微控制器,系統就會先進入中斷看是否接收成功,如果接收成功就回到主函式執行程式,判斷接收到的資料的長度,並把資料列印到串列埠除錯助手,使用for語句和usart_senddata函式將接收到的資料,一位一位的發回串列埠1中。這個大概是乙個實現功能的流程,如有說得不對的請各位大佬指出。

我也是剛剛開始學習的菜鳥,在學習這個串列埠通訊之後呢,對於我自己的收穫就是加深了一些基礎知識的印象,如gpio的初始化和配置各個引數都是比較基礎的,相當重溫。新知識的收穫就是關於串列埠通訊各個函式的使用,它們都有什麼功能,怎麼使用的,這些都了解了,也知道了如何在實現其他功能的時候加入串列埠通訊進去一起控制程式。我覺得串列埠通訊知識,是乙個非常重要的內容,它廣泛的應用到很多專案中,所以學習32的人必須要搞清楚串列埠通訊這個知識點。分享到此,謝謝大家。

stm32串列埠通訊

通訊方式 1 同步通訊 帶時鐘同步訊號傳輸 spi,iic等 2 非同步通訊 不帶時鐘用途訊號 usrt,單匯流排 stm32串列埠引腳表 串口號 rxd txd 1 pa10 pa9 2 pa3pa2 3 pb11 pb10 4 pc11 pc10 5 pd2pc12 通訊過程 接收過程 由rx入...

STM32串列埠通訊

1.常用的串列埠相關暫存器 1 usart sr狀態暫存器,對應的庫函式 flagstatus usart getflagstatus usart typedef usartx,uint16 t usart flag 2 usart dr資料暫存器,對應的庫函式 void usart senddat...

STM32串列埠通訊

串列埠作為mcu最重要的外部介面,同時也是軟體開發重要的除錯手段,其重要性不言而喻。在這裡我們主要從庫函式的角度來講述如何設定串列埠,來達到最基本的通訊功能。串列埠的設定一般可以歸結為以下幾個步驟 1 串列埠時鐘使能,gpio時鐘使能。2 設定引腳復用器對映,呼叫gpio pinafconfig函式...