STM32學習筆記 串列埠的初始設定

2021-08-14 03:26:01 字數 3302 閱讀 2540

1. 宣告結構體變數

gpio_inittypedef gpio_initstructure;

-gpio_inittypedef是乙個結構體變數,包括gpio_pin(u16型別),gpiospeed(gpiospeed_typedef 型別)和gpiomode(gpiomode_typedef 型別),之後在設定引腳時會再用到。

2. rcc時鐘設定

rcc_apb2periphclockcmd(rcc_apb2periph_gpioa|rcc_apb2periph_usart1,enable);

rcc_apb1periphclockcmd(rcc_apb1periph_usart2,enable);

-串列埠1模組時鐘暫存器:rcc_apb2periph_usart1;

-串列埠1埠(pa9/pa10)的時鐘暫存器:rcc_apb2periph_gpioa;

-串列埠2的模組時鐘暫存器:rcc_apb1periph_usart2;

-串列埠2埠(pa2/pa3)的時鐘暫存器:rcc_apb2periph_gpioa;

3. 設定引腳的io功能模式和speed

/* 定義usart1-tx引腳 pa9 */

gpio_initstructure.gpio_pin = gpio_pin_9; //io口第9腳

gpio_initstructure.gpio_speed = gpio_speed_50mhz; //io口速度

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

gpio_init(gpioa, &gpio_initstructure);

/* 定義usart1-rx引腳 pa10 */

gpio_initstructure.gpio_pin = gpio_pin_10; //io口第10腳

gpio_initstructure.gpio_mode = gpio_mode_in_floating; //io口懸空輸入

gpio_init(gpioa, &gpio_initstructure);

/* 定義usart2-tx引腳 pa2 */

gpio_initstructure.gpio_pin = gpio_pin_2; //io口第2腳

gpio_initstructure.gpio_speed = gpio_speed_50mhz;

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

gpio_init(gpioa, &gpio_initstructure);

/* 定義usart2-rx引腳 pa3 */

gpio_initstructure.gpio_pin = gpio_pin_3; //io口第3腳

gpio_initstructure.gpio_mode = gpio_mode_in_floating; //io口懸空輸入

gpio_init(gpioa, &gpio_initstructure);

4. io重對映

stm32的管腳功能可以重對映,將串列埠2的tx和rx埠從預設的pa2/pa3,重新定義到pd2/pd3上。

io重對映的時鐘暫存器:rcc_apb2periph_afio;

rcc_apb2periphclockcmd(rcc_apb2periph_afio,enable);

寫入控制io重定義功能的暫存器:

gpio_pinremapconfig(gpio_remap_usart2,enable);

5. 串列埠初始化設定

usart_initstructure.usart_baudrate = 115200;//波特率

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(usart1, &usart_initstructure); //把以上設定寫入暫存器中(串列埠1)

usart_itconfig(usart1, usart_it_rxne, enable);//接收中斷

//usart_itconfig(usart1, usart_it_txe, enable);//傳送中斷

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

usart_init(usart2, &usart_initstructure); //把以上設定寫入暫存器中(串列埠2)

usart_itconfig(usart2, usart_it_rxne, enable);//接收中斷

//usart_itconfig(usart2, usart_it_txe, enable);//傳送中斷

usart_cmd(usart2, enable); //使能串列埠2

6. 中斷設定

nvic_initstructure.nvic_irqchannel = usart1_irqchannel;

nvic_initstructure.nvic_irqchannelpreemptionpriority = 2;//主優先順序

nvic_initstructure.nvic_irqchannelsubpriority = 0;//次優先順序

nvic_initstructure.nvic_irqchannelcmd = enable;//中斷使能

nvic_init(&nvic_initstructure);

STM32之串列埠通訊 學習筆記

並行通訊 按位傳輸 序列通訊 按乙個位元來傳輸 單工 單向傳輸,一根訊號線 半雙工 雙向傳輸,某一時刻只能往乙個方向傳輸,一根訊號線就可以了 全雙工 雙向傳輸,同時往兩個方向傳輸,一般需要有兩根訊號線 同步通訊 必須有同步時鐘訊號線 非同步通訊 設定相同的波特率不需要時鐘訊號線 常見的串列埠通訊介面...

STM32 的串列埠

一 串列埠使用 原則 盡量中斷中不要有延時 比如自定義delay 和自定義printf串列埠列印,明顯找事啊這麼慢能不發生溢位error嘛 接收和傳送盡量分開處理 1.串列埠傳送資料丟失 1 通常是因為傳送之前未檢測tc狀態位之前是否處於傳送完成標誌導致,關於stm32之 的測試程式來講會導致第乙個...

STM32串列埠筆記

參考原子的程式 基本照抄o o 串列埠設定的一般步驟可以總結為如下幾個步驟 1 串列埠時鐘使能,gpio 時鐘使能 2 串列埠復位 3 gpio 埠模式設定 4 串列埠引數初始化 5 開啟中斷並且初始化 nvic 如果需要開啟中斷才需要這個步驟 6 使能串列埠 7 編寫中斷處理函式 時鐘設定,埠模式...