當前位置:首頁 > 單片機 > 單片機
[導讀]通用同步異步收發(fā)器(USART)提供了一種靈活的方法來與使用工業(yè)標準NR 異步串行數(shù)據(jù)格式的外部設備之間進行全雙工數(shù)據(jù)交換。 USART利用分數(shù)波特率發(fā)生器提供寬范圍的波特率選擇,支持同步單向通信和半雙工單線通信。

通用同步異步收發(fā)器(USART)提供了一種靈活的方法來與使用工業(yè)標準NR 異步串行數(shù)據(jù)格式的外部設備之間進行全雙工數(shù)據(jù)交換。 USART利用分數(shù)波特率發(fā)生器提供寬范圍的波特率選擇,支持同步單向通信和半雙工單線通信。

1、STM32固件庫使用外圍設備的主要思路

在STM32中,外圍設備的配置思路比較固定。首先是使能相關(guān)的時鐘,一方面是設備本身的時鐘,另一方面如果設備通過IO口輸出還需要使能IO口的時鐘;最后如果對應的IO口是復用功能的IO口,則還必須使能AFIO的時鐘。

其次是配置GPIO,GPIO的各種屬性由硬件手冊的AFIO一章詳細規(guī)定,較為簡單。

接著相關(guān)設備需要如果需要使用中斷功能,必須先配置中斷優(yōu)先級,后文詳述。

然后是配置外圍設備的相關(guān)屬性,視具體設備而定,如果設備需要使用中斷方式,必須使能相應設備的中斷,之后需要使能相關(guān)設備。

最后如果設備使用了中斷功能,則還需要填寫相應的中斷服務程序,在服務程序中進行相應操作。

2、UART的配置步驟(查詢方式)

2.1、打開時鐘

由于UART的TX和RX和AFIO都掛在APB2橋上,因此采用固件庫函數(shù)RCC_APB2PeriphClockCmd()進行初始化。UARTx需要分情況討論,如果是UART1,則掛在APB2橋上,因此采用RCC_APB2PeriphClockCmd()進行初始化,其余的UART2~5均掛在APB1上。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);

2.2、GPIO初始化

GPIO的屬性包含在結(jié)構(gòu)體GPIO_InitTypeDef,其中對于TX引腳,GPIO_Mode字段設置為GPIO_Mode_AF_PP(復用推挽輸出),GPIO_Speed切換速率設置為GPIO_Speed_50MHz;對于RX引腳,GPIO_Mode字段設置為GPIO_Mode_IN_FLOATING(浮空輸入),不需要設置切換速率。最后通過GPIO_Init()使能IO口。

以下是GPIO設置的實例代碼:

GPIO_InitTypeDefGPIO_InitStructure;//USART1Tx(PA.09)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);//USART1Rx(PA.10)GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);

2.3、配置UART相關(guān)屬性

通過結(jié)構(gòu)體USART_InitTypeDef來確定。UART模式下的字段如下

USART_BaudRate:波特率,視具體設備而定

USART_WordLength:字長

USART_StopBits:停止位

USART_Parity:校驗方式

USART_HardwareFlowControl:硬件流控制

USART_Mode:單/雙工

最后設置。實例代碼為:

//USART1配置  USART_InitTypeDefUSART_InitStructure; 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_Tx|USART_Mode_Rx;USART_Init(USART1,&USART_InitStructure);USART_Cmd(USART1,ENABLE);

別忘了最后要使用USART_Cmd()來啟動設備UART1。

2.4、重定向print()函數(shù)。

intfputc(intch,FILE*f){USART1->SR;//USART_GetFlagStatus(USART1,USART_FLAG_TC)解決第一個字符發(fā)送失敗的問題//一個一個發(fā)送字符USART_SendData(USART1,(unsignedchar)ch);//等待發(fā)送完成while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);return(ch);}


intmain(void){//USART1config96008-N-1USART1_Config();printf("helloworld!");}

3、UART的配置步驟(中斷方式)

打開時鐘、GPIO初始化、配置UART相關(guān)屬性、重定向print()函數(shù) 與上面的相同。

3.1、中斷優(yōu)先級的配置

這是STM32比較奇怪的地方,在只有一個中斷的情況下,仍然需要配置優(yōu)先級,其作用是使能某條中斷的觸發(fā)通道。STM32的中斷有至多兩個層次,分別是先占優(yōu)先級和從優(yōu)先級,而整個優(yōu)先級設置參數(shù)的長度為4位,因此需要首先劃分先占優(yōu)先級位數(shù)和從優(yōu)先級位數(shù),通過NVIC_PriorityGroupConfig()實現(xiàn);

特定設備的中斷優(yōu)先級NVIC的屬性包含在結(jié)構(gòu)體NVIC_InitTypeDef中,其中字段NVIC_IRQChannel包含了設備的中斷向量,保存在啟動代碼中;字段NVIC_IRQChannelPreemptionPriority為主優(yōu)先級,NVIC_IRQChannelSubPriority為從優(yōu)先級,取值的范圍應根據(jù)位數(shù)劃分的情況而定;最后NVIC_IRQChannelCmd字段是是否使能,一般定位ENABLE。最后通過NVIC_Init()來使能這一中斷向量。實例代碼如下:

//配置UART1接收中斷voidNVIC_Configuration(void){NVIC_InitTypeDefNVIC_InitStructure;/*ConfiguretheNVICPreemptionPriorityBits*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/*EnabletheUSARTyInterrupt*/NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}

3.2、中斷的服務程序的設計

目前使用了UART的兩個中斷USART_IT_RXNE(接收緩存補空中斷)和USART_IT_TXE(發(fā)送緩存空中斷),前一個中斷保證了一旦有數(shù)據(jù)接收到就進入中斷以接收特定長度的數(shù)據(jù),后一個中斷表示一旦發(fā)完一個數(shù)據(jù)就進入中斷函數(shù),保證連續(xù)發(fā)送一段數(shù)據(jù)。一個設備的所有中斷都包含在一個中斷服務程序中,因此必須首先分清楚這次響應的是哪一個中斷,使用USART_GetITStatus()函數(shù)確定;采用USART_ReceiveData()函數(shù)接收一個字節(jié)數(shù)據(jù),采用USART_SendData()函數(shù)發(fā)送一個字節(jié)數(shù)據(jù),當關(guān)閉中斷時采用USART_ITConfig()失能響應的中斷。實例程序:

voidUSART1_IRQHandler(void){uint8_tch;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){//ch=USART1->DR;ch=USART_ReceiveData(USART1);//接受數(shù)據(jù)printf("%c",ch);//返回打印}}


3.3、接收數(shù)據(jù)函數(shù):


//重定向scanf函數(shù)到USART1intfgetc(FILE*f){/*等待串口1輸入數(shù)據(jù)*/while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);return(int)USART_ReceiveData(USART1);}

4、STM32串口在首次發(fā)送字符的時候,首字符丟失解決辦法

網(wǎng)上關(guān)于發(fā)送字符的代碼大多如下:

USART_SendData(USART1,(uint8_t)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

其實咋一看是說的通的,但是在仔細看手冊的時候發(fā)現(xiàn)TC和TXE標志位在復位的時候被置1,這樣第一次while循環(huán)就是沒有用的。這樣導致了首次第一個字符還沒有被輸出,就被后面的字符覆蓋掉,造成實際看到的丟失現(xiàn)象。解決辦法就很簡單:在前面加上一句USART1->SR;

具體代碼如下:

USART1->SR;
USART_SendData(USART1,(uint8_t)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

下面我來說說原因:第一句讀取SR寄存器,第二句寫DR寄存器剛好清除了TC標志位。第一次while循環(huán)就起作用了。

也可將USART1->SR;替換為USART_GetFlagStatus(USART1,USART_FLAG_TC)

本實驗所有程序《STM32串口USART1的查詢和中斷方式程序》

補充:一直有一個疑問是關(guān)于接受和發(fā)送數(shù)據(jù)的問題:對于“hello”這樣的字符串是一個一個接受還是整個接受顯示,下面的實驗可以驗證是一個一個進行的。


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉