串列埠作為mcu最重要的外部介面,同時也是軟體開發重要的除錯手段,其重要性不言而喻。
在這裡我們主要從庫函式的角度來講述如何設定串列埠,來達到最基本的通訊功能。
串列埠的設定一般可以歸結為以下幾個步驟:
1)串列埠時鐘使能,gpio時鐘使能。
2)設定引腳復用器對映,呼叫gpio_pinafconfig函式。
3)gpio初始化設定:設定為復用模式。
4)串列埠引數初始化,包括波特率,字長,奇偶校驗位等。
5)開啟中斷並且初始化nvic,使能中斷。
6)使能串列埠。
7)編寫中斷處理函式:函式名稱格式為usartxirqhandler 。
下面,我們依次對照庫函式來進行串列埠的配置。
1)串列埠時鐘使能和gpio時鐘使能。
rcc_apb2periphclockcmd(rcc_apb2periph_usart1,enable);//
使能usart1
時鐘rcc_ahb1periphclockcmd(rcc_ahb1periph_gpioa,enable); //
使能gpioa
時鐘2)設定引腳復用
gpio_pinafconfig(gpioa,gpio_pinsource9,gpio_af_usart1); //pa9
復用為
usart1
gpio_pinafconfig(gpioa,gpio_pinsource10,gpio_af_usart1);//pa10
復用為usart1
3)gpio口模式設定
gpio_initstructure.gpio_pin = gpio_pin_9 | gpio_pin_10; //gpioa9
與 gpioa10
gpio_initstructure.gpio_mode = gpio_mode_af;//
復用功能
gpio_initstructure.gpio_speed = gpio_speed_50mhz; //
速度50mhz
gpio_initstructure.gpio_otype = gpio_otype_pp; //
推挽復用輸出
gpio_initstructure.gpio_pupd = gpio_pupd_up; //
上拉gpio_init(gpioa,&gpio_initstructure); //
初始化pa9
, pa10
4)串列埠引數初始化
usart_initstructure.usart_baudrate = bound;//
一般設定為
9600;
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); //
初始化串列埠
5)使能串列埠
usart_cmd(usart1, enable); //
使能串列埠
6)串列埠資料傳送與接收
void usart_senddata(usart_typedef* usartx, uint16_t data); // 向串列埠寫入乙個資料
uint16_t usart_receivedata(usart_typedef* usartx); // 從串列埠讀入乙個資料
7)讀取串列埠狀態
flagstatus usart_getflagstatus(usart_typedef* usartx, uint16_t usart_flag)
;第二個引數標示我們所要檢視串列埠的哪種狀態,如rxne(讀資料暫存器非空),tc(傳送完成)等。
8)開啟中斷並且初始化nvic,使能相應中斷。
先要配置nvic中斷優先順序分組
nvic_initstructure.nvic_irqchannel = usart1_irqn;
nvic_initstructure.nvic_irqchannelpreemptionpriority=3;//
搶占優先順序
3nvic_initstructure.nvic_irqchannelsubpriority =3; //
響應優先順序
3nvic_initstructure.nvic_irqchannelcmd = enable; //irq
通道使能
nvic_init(&nvic_initstructure); //
根據指定的引數初始化
vic
暫存器接下來需要使能相應中斷函式
void usart_itconfig(usart_typedef* usartx, uint16_t usart_it,functionalstate newstate)
第二個入口引數標示使能的串列埠型別,如
usart_itconfig(usart1, usart_it_rxne, enable);//
開啟中斷,接收到資料中斷
usart_itconfig(usart1
,usart_it_tc
, enable); //傳送資料結束產生中斷
需要注意的是,我們在使用中斷之前必須先設定系統中斷優先分組
nvic_prioritygroupconfig(nvic_prioritygroup_2);//
設定系統中斷優先順序分組
2 9)獲取相應中斷狀態
itstatus usart_getitstatus(usart_typedef* usartx, uint16_t usart_it)
比如我們使能了串列埠傳送完成中斷,那麼我們在中斷處理函式中,需要判斷該中斷是不是串列埠傳送完成中斷,
usart_getitstatus(usart1, usart_it_tc)
10)中斷服務函式
void usart1_irqhandler(void) ; //串列埠1的中斷服務函式
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串列埠通訊
stm32串列埠通訊主要是配置相應的引數 1 初始化串列埠引腳 void usartgpioconfigure void 2 初始化串列埠的一些引數 void usartconfigure void 3 初始化串列埠時鐘 void usartrccinit void 5 實現中斷函式 void us...