usart作為一種標準介面在應用中十分常見。本文著重分析其作為uart的配置和應用方法。
1、stm32韌體庫使用外圍裝置的主要思路
在stm32中,外圍裝置的配置思路比較固定。首先是使能相關的時鐘,一方面是裝置本身的時鐘,另一方面如果裝置通過io口輸出還需要使能io口的時鐘;最後如果對應的io口是復用功能的io口,則還必須使能afio的時鐘。
其次是配置gpio,gpio的各種屬性由硬體手冊的afio一章詳細規定,較為簡單。
接著相關裝置需要如果需要使用中斷功能,必須先配置中斷優先順序,後文詳述。
然後是配置外圍裝置的相關屬性,視具體裝置而定,如果裝置需要使用中斷方式,必須使能相應裝置的中斷,之後需要使能相關裝置。
最後如果裝置使用了中斷功能,則還需要填寫相應的中斷服務程式,在服務程式中進行相應操作。
2、uart的配置步驟
2.1、開啟時鐘
由於uart的tx和rx和afio都掛在apb2橋上,因此採用韌體庫函式rcc_apb2periphclockcmd()進行初始化。uartx需要分情況討論,如果是uart1,則掛在apb2橋上,因此採用rcc_apb2periphclockcmd()進行初始化,其餘的uart2~5均掛在apb1上。
2.2、gpio初始化
gpio的屬性包含在結構體gpio_inittypedef,其中對於tx引腳,gpio_mode欄位設定為gpio_mode_af_pp(復用推挽輸出),gpio_speed切換速率設定為gpio_speed_50mhz;對於rx引腳,gpio_mode欄位設定為gpio_mode_in_floating(浮空輸入),不需要設定切換速率。最後通過gpio_init()使能io口。
以下是tx引腳設定的例項**:
gpio_initstructure.gpio_mode= gpio_mode_af_pp;
gpio_initstructure.gpio_pin = uart_tx_pin[com];
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(uart_tx_port[com], &gpio_initstructure);
2.3、中斷優先順序的配置
這是stm32比較奇怪的地方,在只有乙個中斷的情況下,仍然需要配置優先順序,其作用是使能某條中斷的觸發通道。stm32的中斷有至多兩個層次,分別是先佔優先順序和從優先順序,而整個優先順序設定引數的長度為4位,因此需要首先劃分先佔優先順序位數和從優先順序位數,通過nvic_prioritygroupconfig()實現;
特定裝置的中斷優先順序nvic的屬性包含在結構體nvic_inittypedef中,其中欄位nvic_irqchannel包含了裝置的中斷向量,儲存在啟動**中;欄位nvic_irqchannelpreemptionpriority為主優先順序,nvic_irqchannelsubpriority為從優先順序,取值的範圍應根據位數劃分的情況而定;最後nvic_irqchannelcmd欄位是是否使能,一般定位enable。最後通過nvic_init()來使能這一中斷向量。例項**如下:
/* configure thenvic preemption priority bits */
nvic_prioritygroupconfig(nvic_prioritygroup_0);
/* enable the usarty interrupt */
nvic_initstructure.nvic_irqchannel = uart4_irqn;
nvic_initstructure.nvic_irqchannelsubpriority = 0;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
2.4、配置uart相關屬性
通過結構體usart_inittypedef來確定。uart模式下的字段如下
usart_baudrate:波特率,視具體裝置而定
usart_wordlength:字長
usart_stopbits:停止位
usart_parity:校驗方式
usart_hardwareflowcontrol:硬體流控制
usart_mode:單/雙工
最後通過usart_init()來設定。例項**為:
usart_initstructure.usart_baudrate= 9600;
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);
最後還要使用usart_cmd()來啟動裝置uart。
2.5、中斷的服務程式的設計
目前使用了uart的兩個中斷usart_it_rxne(接收快取補空中斷)和usart_it_txe(傳送快取空中斷),前乙個中斷保證了一旦有資料接收到就進入中斷以接收特定長度的資料,後乙個中斷表示一旦發完乙個資料就進入中斷函式,保證連續傳送一段資料。乙個裝置的所有中斷都包含在乙個中斷服務程式中,因此必須首先分清楚這次響應的是哪乙個中斷,使用usart_getitstatus()函式確定;採用usart_receivedata()函式接收乙個位元組資料,採用usart_senddata()函式傳送乙個位元組資料,當關閉中斷時採用usart_itconfig()失能響應的中斷。例項程式:
voiduart4_irqhandler(void) }
if(usart_getitstatus(uart4, usart_it_txe) != reset) }
}其中主程式與中斷服務程式通過全域性變數來通訊,這也是一種多程序共享儲存區的體現形式。
STM32配置外部中斷
stm32 中斷非常強大,每個外設都可以產生中斷,核心水平上搭載了乙個異常響應系統,分為 系統異常和外部中斷。nvic相當於乙個中斷總開關,總開關開啟,相應的中斷才能使用。在講如何配置中斷優先順序之前,我們需要先了解下 nvic。nvic 是巢狀向量中斷控制 器,控制著整個晶元中斷相關的功能,是核心...
stm32外部中斷配置步驟
外部中斷配置步驟 初始化io口為復用 afio void gpio init gpio typedef gpiox,gpio inittypedef gpio initstruct 開啟io口復用時鐘 void rcc apb2periphclockcmd uint32 t rcc apb2peri...
stm32外部中斷的配置
void user exit init void exti0 irqhandler 需要在main函式中設定中斷優先組 nvic prioritygroupconfig nvic prioritygroup 1 void userexitinit void exti0 irqhandler 同樣也需...