當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]USART作為一種標(biāo)準(zhǔn)接口在應(yīng)用中十分常見(jiàn)。1、STM32固件庫(kù)使用外圍設(shè)備的主要思路在STM32中,外圍設(shè)備的配置思路比較固定。首先是使能相關(guān)的時(shí)鐘,一方面是設(shè)備本身的時(shí)鐘,如果設(shè)備是通過(guò)IO口輸入輸出則還需要使能對(duì)

USART作為一種標(biāo)準(zhǔn)接口在應(yīng)用中十分常見(jiàn)。

1、STM32固件庫(kù)使用外圍設(shè)備的主要思路

在STM32中,外圍設(shè)備的配置思路比較固定。

首先是使能相關(guān)的時(shí)鐘,一方面是設(shè)備本身的時(shí)鐘,如果設(shè)備是通過(guò)IO口輸入輸出則還需要使能對(duì)應(yīng)IO口的時(shí)鐘。

其次是配置對(duì)應(yīng)外設(shè)的各項(xiàng)相關(guān)參數(shù),如果設(shè)備是通過(guò)IO口輸入輸出則還需要配置相關(guān)的GPIO。

最后是使能對(duì)應(yīng)外設(shè)。

如果相關(guān)設(shè)備需要使用中斷功能,則還需要配置對(duì)應(yīng)外設(shè)中斷通道的中斷優(yōu)先級(jí),然后使能相應(yīng)設(shè)備的中斷,最后還要填寫(xiě)相應(yīng)的中斷服務(wù)程序,在服務(wù)程序中進(jìn)行相應(yīng)的操作。

2、UART的配置步驟

2.1、打開(kāi)時(shí)鐘

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

2.2、GPIO初始化

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

以下是TX引腳設(shè)置的實(shí)例代碼:

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、中斷優(yōu)先級(jí)的配置

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

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

/* 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、配置USART相關(guān)屬性

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

USART_BaudRate:波特率,視具體設(shè)備而定

USART_WordLength:字長(zhǎng)

USART_StopBits:停止位

USART_Parity:校驗(yàn)方式

USART_HardwareFlowControl:硬件流控制

USART_Mode:?jiǎn)?雙工

最后通過(guò)USART_Init()來(lái)設(shè)置。實(shí)例代碼為:

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()來(lái)啟動(dòng)設(shè)備UART。

2.5、中斷的服務(wù)程序的設(shè)計(jì)

目前使用了UART的兩個(gè)中斷USART_IT_RXNE(接收緩存非空中斷)和USART_IT_TXE(發(fā)送緩存空中斷),前一個(gè)中斷保證了一旦有數(shù)據(jù)接收到就進(jìn)入中斷以接收特定長(zhǎng)度的數(shù)據(jù),后一個(gè)中斷表示一旦發(fā)完一個(gè)數(shù)據(jù)就進(jìn)入中斷函數(shù),保證連續(xù)發(fā)送一段數(shù)據(jù)。一個(gè)設(shè)備的所有中斷都包含在一個(gè)中斷服務(wù)程序中,因此必須首先分清楚這次響應(yīng)的是哪一個(gè)中斷,使用USART_GetITStatus()函數(shù)查看標(biāo)志位來(lái)確定進(jìn)入的是哪個(gè)中斷;采用USART_ReceiveData()函數(shù)接收一個(gè)字節(jié)數(shù)據(jù),采用USART_SendData()函數(shù)發(fā)送一個(gè)字節(jié)數(shù)據(jù),當(dāng)關(guān)閉串口的某一個(gè)中斷時(shí)采用USART_ITConfig()失能響應(yīng)的中斷。實(shí)例程序:

voidUART4_IRQHandler(void)
{

if(USART_GetITStatus(UART4,USART_IT_RXNE) != RESET)
{//當(dāng)檢測(cè)掉讀入中斷
RxBuffer[RxCounter++] = USART_ReceiveData(UART4);

if (RxCounter ==NbrOfDataToRead)
{
USART_ITConfig(UART4, USART_IT_RXNE, DISABLE); //禁止中斷
}
}
if(USART_GetITStatus(UART4, USART_IT_TXE) != RESET)
{
/* Write one byte to the transmit data register */
USART_SendData(UART4, TxBuffer[TxCounter++]);

if(TxCounter ==NbrOfDataToTransfer)
{
//TxCounter = 0;
/* Disable the USARTy Transmit interrupt */
USART_ITConfig(UART4, USART_IT_TXE, DISABLE);
}
}
}

其中主程序與中斷服務(wù)程序通過(guò)全局變量來(lái)通信,這也是一種多進(jìn)程共享存儲(chǔ)區(qū)的體現(xiàn)形式。

下面分析一下串口相關(guān)的寄存器。

STM32有數(shù)個(gè)串口,每個(gè)串口都有一個(gè)自己獨(dú)立的波特率寄存器USART_BRR,通過(guò)設(shè)置該寄存器就可以達(dá)到配置不同波特率的目的,由于STM32采用了分?jǐn)?shù)波特率,所以STM32的串口波特率設(shè)置范圍很寬,而且誤差很小。



由上表可知:USART_BRR的最低4位(位[3:0])用來(lái)存放小數(shù)部分DIV_Fraction,緊接著的12位(位[15:4])用來(lái)存放整數(shù)部分DIV_Mantissa,最高16位保留。

STM32的串口波特率計(jì)算公式如下:

上式中,F(xiàn)pclk是給串口的時(shí)鐘(PCLK1用于USART2、3、4、5,PCLK2用于USART1,以前說(shuō)過(guò),PCLK1是由系統(tǒng)時(shí)鐘分頻得來(lái),最大36MHZ,PCLK2是直接由系統(tǒng)時(shí)鐘得來(lái),最大72MHZ。)

USARTDIV是一個(gè)無(wú)符號(hào)定點(diǎn)數(shù),我們已知要設(shè)置的波特率及系統(tǒng)時(shí)鐘,這樣就可以算出USARTDIV的值,并把它的整數(shù)和小數(shù)分離開(kāi)來(lái),分別寫(xiě)入U(xiǎn)SART_BRR寄存器里的對(duì)應(yīng)位就行了,假設(shè)我們的串口1要設(shè)置為115200的波特率,而PCLK2的時(shí)鐘為72M。這樣,我們根據(jù)上面的公式有:

USARTDIV=72000000/(115200*16)=39.0625

那么得到:

DIV_Fraction=16*0.0625=1=0X01;

DIV_Mantissa=468=0X27;

這樣,我們就得到了USART1->BRR的值為0X27。只要設(shè)置串口1的BRR寄存器值為

0X27就可以得到115200的波特率。

以上是串口最重要的比特率設(shè)置,下面是串口的一些其他寄存器。

1:首先是使能串口時(shí)鐘,串口作為STM32的一個(gè)外設(shè),其時(shí)鐘由外設(shè)時(shí)鐘使能寄存器控制,串口1是在APB2ENR寄存器的第14位,除了串口1的時(shí)鐘使能在APB2ENR寄存器,其他串口的時(shí)鐘使能位都在APB1ENR寄存器。

2:復(fù)位串口,一般在系統(tǒng)剛開(kāi)始配置外設(shè)的時(shí)候,都會(huì)先執(zhí)行復(fù)位該外設(shè)的操作。串口1的復(fù)位是通過(guò)配置APB2RSTR寄存器的第14位來(lái)實(shí)現(xiàn)的,通過(guò)向該位寫(xiě)1復(fù)位串口1,寫(xiě)0結(jié)束復(fù)位。其他串口的復(fù)位位在APB1RSTR里面設(shè)置。

APB2RSTR寄存器描述:

3:串口功能控制,串口控制寄存器有三個(gè):USATR_CR1-3,串口的很多配置都是通過(guò)這3個(gè)寄存器來(lái)設(shè)置的,這里我們只要用到USART_CR1就可以實(shí)現(xiàn)我們的功能了,該寄存器的各位描述如下圖所示:





該寄存器的高18位未使用,低14位用于串口的功能設(shè)置,。

UE為串口使能位,通過(guò)該位置1,以使能串口。

M為字長(zhǎng)選擇位,當(dāng)該位為0的時(shí)候設(shè)置串口為8個(gè)字長(zhǎng)外加n個(gè)停止位,停止位的個(gè)數(shù)(n)是根據(jù)USART_CR2的[13:12]位設(shè)置來(lái)決定的,默認(rèn)為0。PCE為校驗(yàn)使能位,設(shè)置為0,則禁止校驗(yàn),否則使能校驗(yàn)。

PS為校驗(yàn)位選擇,設(shè)置為0則為偶校驗(yàn),否則為奇校驗(yàn)。

TXIE為發(fā)送緩沖區(qū)空中斷使能位,設(shè)置該位為1,當(dāng)USART_SR中的TXE位為1時(shí),將產(chǎn)生串口中斷。

TCIE為發(fā)送完成中斷使能位,設(shè)置該位為1,當(dāng)USART_SR中的TC位為1時(shí),將產(chǎn)生串口中斷。

RXNEIE為接收緩沖區(qū)非空中斷使能,設(shè)置該位為1,當(dāng)USART_SR中的ORE或者RXNE位為1時(shí),將產(chǎn)生串口中斷。

TE為發(fā)送使能位,設(shè)置為1,將開(kāi)啟串口的發(fā)送功能。

RE為接收使能位,用法同TE。

RWU為接收喚醒,該位用來(lái)決定是否把USART置于靜默模式。軟件對(duì)該位置位或者清零。當(dāng)喚醒序列到來(lái)時(shí),硬件也會(huì)將其清零。


4:數(shù)據(jù)發(fā)送與接收。STM32的發(fā)送與接收是通過(guò)數(shù)據(jù)寄存器USART_DR來(lái)實(shí)現(xiàn)的,這是一個(gè)雙寄存器,包含了TDR和RDR。當(dāng)向該寄存器寫(xiě)數(shù)據(jù)的時(shí)候,串口就會(huì)自動(dòng)發(fā)送,當(dāng)收到收據(jù)的時(shí)候,也是存在該寄存器內(nèi)。該寄存器的各位描述如下圖所示:


雖然是一個(gè)32位寄存器,但是只用了低9位(DR[8:0]),其他都是保留。

DR[8:0]為串口數(shù)據(jù),包含了發(fā)送或接收的數(shù)據(jù)。由于它是由兩個(gè)寄存器組成的,一個(gè)給發(fā)送用(TDR),一個(gè)給接收用(RDR),該寄存器兼具讀和寫(xiě)的功能。

5:串口狀態(tài)。串口的狀態(tài)可以通過(guò)狀態(tài)寄存器USART_SR讀取。





這里有兩個(gè)位,比較常用第5、6位RXNE和TC。

RXNE(讀數(shù)據(jù)寄存器非空),當(dāng)該位被置1的時(shí)候,就是提示已經(jīng)有數(shù)據(jù)被接收到了,如果設(shè)置了這個(gè)位的中斷,則會(huì)產(chǎn)生中斷。。這時(shí)候我們要做的就是盡快去讀取USART_DR,通過(guò)讀USART_DR可以將該位清零,也可以向該位寫(xiě)0,直接清除。

TC(發(fā)送完成),當(dāng)該位被置位的時(shí)候,表示USART_DR內(nèi)的數(shù)據(jù)已經(jīng)被發(fā)送完成了。如果設(shè)置了這個(gè)位的中斷,則會(huì)產(chǎn)生中斷。該位也有兩種清零方式:1)讀USART_SR,寫(xiě)USART_DR。2)直接向該位寫(xiě)0。


串口初始化函數(shù):

voiduart_init(u32pclk2,u32bound)

{

floattemp;

u16mantissa;

u16fraction;

temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV

mantissa=temp; //得

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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