日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

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

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

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

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

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

最后如果設(shè)備使用了中斷功能,則還需要填寫相應(yīng)的中斷服務(wù)程序,在服務(wù)程序中進(jìn)行相應(yīng)操作。

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

2.1、打開時(shí)鐘

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

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);

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è)置切換速率。最后通過GPIO_Init()使能IO口。

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

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:波特率,視具體設(shè)備而定

USART_WordLength:字長(zhǎng)

USART_StopBits:停止位

USART_Parity:校驗(yàn)方式

USART_HardwareFlowControl:硬件流控制

USART_Mode:?jiǎn)?雙工

最后設(shè)置。實(shí)例代碼為:

//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()來啟動(dòng)設(shè)備UART1。

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

intfputc(intch,FILE*f){USART1->SR;//USART_GetFlagStatus(USART1,USART_FLAG_TC)解決第一個(gè)字符發(fā)送失敗的問題//一個(gè)一個(gè)發(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的配置步驟(中斷方式)

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

3.1、中斷優(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ù),通過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。最后通過NVIC_Init()來使能這一中斷向量。實(shí)例代碼如下:

//配置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、中斷的服務(wù)程序的設(shè)計(jì)

目前使用了UART的兩個(gè)中斷USART_IT_RXNE(接收緩存補(bǔ)空中斷)和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ù)確定;采用USART_ReceiveData()函數(shù)接收一個(gè)字節(jié)數(shù)據(jù),采用USART_SendData()函數(shù)發(fā)送一個(gè)字節(jié)數(shù)據(jù),當(dāng)關(guān)閉中斷時(shí)采用USART_ITConfig()失能響應(yīng)的中斷。實(shí)例程序:

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ā)送字符的時(shí)候,首字符丟失解決辦法

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

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

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

具體代碼如下:

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

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

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

本實(shí)驗(yàn)所有程序《STM32串口USART1的查詢和中斷方式程序》

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


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

在嵌入式開發(fā)中,STM32的時(shí)鐘系統(tǒng)因其靈活性和復(fù)雜性成為開發(fā)者關(guān)注的焦點(diǎn)。然而,看似簡(jiǎn)單的時(shí)鐘配置背后,隱藏著諸多易被忽視的陷阱,輕則導(dǎo)致系統(tǒng)不穩(wěn)定,重則引發(fā)硬件損壞。本文從時(shí)鐘源選擇、PLL配置、總線時(shí)鐘分配等關(guān)鍵環(huán)...

關(guān)鍵字: STM32 時(shí)鐘系統(tǒng)

在嵌入式系統(tǒng)開發(fā)中,STM32系列微控制器的內(nèi)部溫度傳感器因其低成本、高集成度特性,廣泛應(yīng)用于設(shè)備自檢、環(huán)境監(jiān)測(cè)等場(chǎng)景。然而,受芯片工藝差異和電源噪聲影響,其原始數(shù)據(jù)存在±1.5℃的固有誤差。本文從硬件配置、校準(zhǔn)算法、軟...

關(guān)鍵字: STM32 溫度傳感器

在能源效率與智能化需求雙重驅(qū)動(dòng)下,AC-DC轉(zhuǎn)換器的數(shù)字控制技術(shù)正經(jīng)歷從傳統(tǒng)模擬方案向全數(shù)字架構(gòu)的深刻變革?;赟TM32微控制器的PFM(脈沖頻率調(diào)制)+PWM(脈沖寬度調(diào)制)混合調(diào)制策略,結(jié)合動(dòng)態(tài)電壓調(diào)整(Dynam...

關(guān)鍵字: AC-DC STM32

當(dāng)前智能家居產(chǎn)品需求不斷增長(zhǎng) ,在這一背景下 ,對(duì)現(xiàn)有澆花裝置缺陷進(jìn)行了改進(jìn) ,設(shè)計(jì)出基于STM32單片機(jī)的全 自動(dòng)家用澆花機(jī)器人。該設(shè)計(jì)主要由機(jī)械結(jié)構(gòu)和控制系統(tǒng)構(gòu)成 ,機(jī)械結(jié)構(gòu)通過麥克納姆輪底盤與噴灑裝置的結(jié)合實(shí)現(xiàn)機(jī)器...

關(guān)鍵字: STM32 麥克納姆輪 安全可靠 通過性強(qiáng)

用c++編程似乎是讓你的Arduino項(xiàng)目起步的障礙嗎?您想要一種更直觀的微控制器編程方式嗎?那你需要了解一下Visuino!這個(gè)圖形化編程平臺(tái)將復(fù)雜電子項(xiàng)目的創(chuàng)建變成了拖動(dòng)和連接塊的簡(jiǎn)單任務(wù)。在本文中,我們將帶您完成使...

關(guān)鍵字: Visuino Arduino ESP32 STM32

基于STM32與LoRa技術(shù)的無線傳感網(wǎng)絡(luò)憑借其低功耗、廣覆蓋、抗干擾等特性,成為環(huán)境監(jiān)測(cè)、工業(yè)自動(dòng)化等場(chǎng)景的核心解決方案。然而,如何在復(fù)雜電磁環(huán)境中實(shí)現(xiàn)高效休眠調(diào)度與動(dòng)態(tài)信道優(yōu)化,成為提升網(wǎng)絡(luò)能效與可靠性的關(guān)鍵挑戰(zhàn)。本...

關(guān)鍵字: STM32 LoRa

在實(shí)時(shí)控制系統(tǒng)、高速通信協(xié)議處理及高精度數(shù)據(jù)采集等對(duì)時(shí)間敏感的應(yīng)用場(chǎng)景中,中斷響應(yīng)延遲的優(yōu)化直接決定了系統(tǒng)的可靠性與性能上限。STM32系列微控制器憑借其靈活的嵌套向量中斷控制器(NVIC)、多通道直接內(nèi)存訪問(DMA)...

關(guān)鍵字: STM32 DMA

數(shù)字電源技術(shù)向高功率密度、高效率與高動(dòng)態(tài)響應(yīng)方向加速演進(jìn),STM32微控制器憑借其基于DSP庫(kù)的算法加速能力與對(duì)LLC諧振變換器的精準(zhǔn)控制架構(gòu),成為優(yōu)化電源動(dòng)態(tài)性能的核心平臺(tái)。相較于傳統(tǒng)模擬控制或通用型數(shù)字控制器,STM...

關(guān)鍵字: STM32 數(shù)字電源

STM32微控制器憑借其針對(duì)電機(jī)控制場(chǎng)景的深度優(yōu)化,成為高精度、高可靠性驅(qū)動(dòng)系統(tǒng)的核心選擇。相較于通用型MCU,STM32在電機(jī)控制領(lǐng)域的核心優(yōu)勢(shì)集中體現(xiàn)在FOC(磁場(chǎng)定向控制)算法的硬件加速引擎與PWM死區(qū)時(shí)間的動(dòng)態(tài)補(bǔ)...

關(guān)鍵字: STM32 電機(jī)控制

無線充電技術(shù)加速滲透消費(fèi)電子與汽車電子領(lǐng)域,基于Qi協(xié)議的無線充電發(fā)射端開發(fā)成為智能設(shè)備能量補(bǔ)給的核心課題。傳統(tǒng)模擬控制方案存在響應(yīng)滯后、參數(shù)調(diào)整困難等問題,而基于STM32的數(shù)字PID控制結(jié)合FOD(Foreign O...

關(guān)鍵字: STM32 無線充電
關(guān)閉