娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年09月04日(星期三)

正在發(fā)生

2019年09月04日 | stm32串口通信調(diào)試總結

發(fā)布者:zeta16 來源: eefocus關鍵字:stm32  串口通信  調(diào)試總結 手機看文章 掃描二維碼
隨時隨地手機看文章

本文分為兩部分,即”以USART1為例的串口初始化”和“調(diào)試中遇到的問題”


以USART1為例的串口初始化

程序調(diào)用了stm32自帶的固件庫,工程中具體的文件見下圖: 

這里寫圖片描述

一.GPIO及USART1初始化結構體變量定義


GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;


二.串口時鐘及GPIO端口時鐘使能 

USART1是掛在APB2總線上的外設。 

TX,RX分別是PA9,PA10端口的復用。


TX,RX分別對應PA9,PA10

要使用到端口復用,就要使能端口的時鐘,并使能相應外設的時鐘。這里可使用|同時使能這兩個時鐘。


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);


三.TX,RX配置 

GPIO端口模式的配置包括


確定需要配置的引腳

確定端口速度

確定端口工作模式

初始化該引腳

    //USART1 Tx(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);

    //USART1 Rx(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);


四.串口參數(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_Tx | USART_Mode_Rx; //收發(fā)模式

USART_Init(USART1, &USART_InitStructure);//初始化USART1

USART_Cmd(USART1, ENABLE); //USART1使能


至此,串口相關的配置已全部完成,接下來可以寫串口程序了。


五.串口程序 

這里以stm32與PC通信為例。 

例1.PC向stm32發(fā)送一個字符,stm32再將該字符發(fā)回去。


while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=SET);//等待PC的消息

order=USART_ReceiveData(USART1);//讀取收到的消息

USART_SendData(USART1,order);//發(fā)送消息

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待數(shù)據(jù)發(fā)送完


關于兩次等待的說明: 

RXNE和TC都是寄存器USART_SR中的位。當寄存器收到消息后,RXNE會置1,此時讀取消息可令其清零。當數(shù)據(jù)發(fā)送完成后,TC會置1,此時讀取狀態(tài)可令其清零。


例2.stm32向PC發(fā)一個字符串


字符串內(nèi)容如下:


#define SENDBUF_LEN 23

unsigned char order[SENDBUF_LEN]="0 1 06 1111/1 1 05 2121";


發(fā)送程序如下:


for(i=0;i{   

    USART1->SR;//防止首字符丟失

    USART_SendData(USART1,order[i]);

    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

}


關于USART1->SR作用的解釋: 

stm32在復位時TC位被置1,因此while語句中的內(nèi)容直接成立,while語句直接跳出,第一個字符還沒發(fā)送完,寄存器就發(fā)送了第二個字符,導致第一個字符被掩蓋。解決方法是在發(fā)送前先將TC為清零,方法是讀USART->SR。由此可知,在發(fā)字符串時,一定要先讀一次USART->SR,而例1中發(fā)一個字符時就不必要了,因為不會有第二個字符來覆蓋第一個字符。


調(diào)試中遇到的問題

無論PC發(fā)什么,stm32都沒有回應。調(diào)試過程:我把初始化的程序與網(wǎng)上眾多程序員寫的初始化程序做了比較,沒有發(fā)現(xiàn)不一樣的地方。接著我就懷疑USART_SendData(USART1,order)這句代碼中的order的數(shù)據(jù)類型有問題。這個函數(shù)的定義如下:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

{

  /* Check the parameters */

  assert_param(IS_USART_ALL_PERIPH(USARTx));

  assert_param(IS_USART_DATA(Data)); 


  /* Transmit Data */

  USARTx->DR = (Data & (uint16_t)0x01FF);

}


可知Data的數(shù)據(jù)類型是uint16_t,我就試著把order的數(shù)據(jù)類型分別改成了char,uint8_t,uint16_t,但問題仍無法解決(實際上,這個數(shù)據(jù)類型是沒有任何影響的)。


值得一提的是,之前我們設置USART1的參數(shù)時,一次發(fā)送的數(shù)據(jù)長度設置的是8位USART_InitStructure.USART_WordLength = USART_WordLength_8b;,那么為什么這里寫的卻是16位的無符號整型呢?看這句話USARTx->DR = (Data & (uint16_t)0x01FF);,可知理論上發(fā)送的內(nèi)容應該是Data的低9位。然而,由于之前設置了數(shù)據(jù)長度為8位,故實際發(fā)送的內(nèi)容只有低8位。那么為什么Data會&0x01ff呢?其實這多余的一位是用于奇偶校驗的,當需要配置奇偶校驗時,需要將數(shù)據(jù)長度設置為9位即USART_InitStructure.USART_WordLength = USART_WordLength_9b;,記住,stm32的數(shù)據(jù)位是包括奇偶校驗位的,而PC上調(diào)試助手上的數(shù)據(jù)位仍需設置為8位,這樣互發(fā)數(shù)據(jù)才不會出問題。


回到之前的問題上來——更改完發(fā)現(xiàn)仍解決不了問題后,我在程序中加了一個LED閃爍程序,即接收數(shù)據(jù)之前LED亮,發(fā)送完數(shù)據(jù)后LED滅,結果發(fā)現(xiàn)LED始終是亮的。后改成LED先滅后亮,發(fā)現(xiàn)LED始終是滅的。故猜想程序卡死在了這兩句程序之間,接著懷疑到函數(shù)delay_ms()上,接著發(fā)現(xiàn)這個由淘寶賣家提供的delay_ms()函數(shù)需要先初始化才能使用。(這個延時函數(shù)不是簡單的for循環(huán)延時,比較復雜和精準,初始化函數(shù)為delay_init();)由于沒有初始化,導致程序死在這條語句上。 

2. stm32發(fā)回來的內(nèi)容與PC發(fā)送的內(nèi)容不一致。調(diào)試過程:用示波器觀測數(shù)據(jù),發(fā)現(xiàn)收發(fā)的數(shù)據(jù)都是正確的,但電平寬度不一致,由此得知兩者的波特率不一致,進一步計算得知是stm32的串口波特率不對。后發(fā)現(xiàn)程序默認的外部高速時鐘是8MHz,而我的板子上的晶振是11.0592MHz,故波特率計算錯誤。解決方法是更改頭文件stm32f10x.h中的HSE_VAULE,見下圖


 

需要說明的是,博主更改這里后仍不能接受到正確消息,當時我設置的波特率是1200,后來改成9600就正常了。博主沒有去深入了解寄存器,只能猜想stm32應該不支持過低的波特率吧。 

3.當stm32向c51發(fā)送字符串時,c51接收不到正確的數(shù)據(jù)。我用示波器看了下PC向c51發(fā)送的波形,又看了下stm32向c51發(fā)送的波形,發(fā)送數(shù)據(jù)所用時間差不多,所以波特率應該是對的,波形由于太長,每個脈沖太窄,不好觀察,看起來也差不多。最后我讓stm32把之前發(fā)的數(shù)據(jù)發(fā)給PC,發(fā)現(xiàn)了問題——那就是之前提到的首字符丟失問題。

關鍵字:stm32  串口通信  調(diào)試總結 引用地址: stm32串口通信調(diào)試總結

上一篇:RTC--根據(jù)年月日計算[星期]的函數(shù)
下一篇:STM32 PA6引腳輸出低電平不正常的問題

推薦閱讀

? ?作為小米生態(tài)下的其中一款產(chǎn)品,黑鯊手機以相對低廉的價格為廣大米粉提供了一款不錯的驍龍845芯片組游戲手機。不過,黑鯊手機后續(xù)的名氣似乎并沒有很好的堅持,而且隨著新變化其優(yōu)勢也開始減少。開通黑鯊手機JoyUI內(nèi)測的用戶最近收到一個新的推送,該推送顯示下一個固件開始,使用黑鯊外設手柄的玩家在刺激戰(zhàn)場吃雞游戲當中將會被歸類到模擬器匹配。...
ITP發(fā)布的這份報告《Public Report 6 Lithium Ion Battery Testing》,給之前儲能電池測試的一個總結,整個實驗跨度為3年4個月,預算為87萬美金。測試分為兩個階段,涵蓋了以下這些電芯 壽命實驗中涉及了不少的問題,包括部分電芯失效。 第一階段測試結果我把這六份報告的結果統(tǒng)一來看,我們看到500次循環(huán)的數(shù)據(jù):這個階段大部分儲能電芯都在90%的...
Maxim Integrated Products, Inc (NASDAQ: MXIM)宣布推出兩款業(yè)界領先的基礎模擬IC,為冷鏈物流(包括醫(yī)藥品等)及其他溫度監(jiān)測應用提供高精度、高可靠性解決方案。MAX31889數(shù)字溫度傳感器是高精度和低功耗的完美組合,用于代替高精度溫度測量應用中昂貴的電阻溫度檢測器(RTD)。MAX31825數(shù)字傳感器允許在每條總線上掛接多達64片傳感器,全部由1-Wire?...
文/陳根兩周前,造車的特斯拉突然成為了機器人圈內(nèi)的熱點,馬斯克在特斯拉AI Day的結尾以一個彩蛋的形式宣布特斯拉正在開發(fā)的人形機器人,立時引起人們的熱議。馬斯克提到,這款人型機器人最早會在2022年投放市場,而就機器人行業(yè)發(fā)展現(xiàn)狀來看,這無疑又是一個激進的目標。上周,特斯拉公開招聘與機器人相關的職位,包括機械工程師-執(zhí)行器集成、機械工程師-制動器...

史海拾趣

問答坊 | AI 解惑

4種實時操作系統(tǒng)實時性的分析對比

4種實時操作系統(tǒng)實時性的分析對比,與大家分享   喜歡就頂一下…

查看全部問答∨

http協(xié)議詳解介紹

http 協(xié)議詳細解…

查看全部問答∨

頻譜儀

本帖最后由 paulhyde 于 2014-9-15 03:32 編輯 搜集的頻譜儀資料 !!!!!!!!!!!!!!!!!!!!!!!! [ 本帖最后由 yushiqian 于 2009-8-15 23:33 編輯 ]  …

查看全部問答∨

我想?yún)⒓印禡ATLAB+DSP快速原型設計》活動

如題,不知道怎么參加啊,咱們論壇有QQ群嗎?…

查看全部問答∨

軟件測試術語

Unit testing(單元測試),指一段代碼的基本測試,其實際大小是未定的,通常是一個函數(shù)或子程序,一般由開發(fā)者執(zhí)行。 Integration testing(集成測試),被測試系統(tǒng)的所有組件都集成在一起,找出被測試系統(tǒng)組件之間關系和接口中的錯誤。該測試一 ...…

查看全部問答∨

Proteus入門教程

[ 本帖最后由 wzt 于 2010-5-12 16:10 編輯 ]…

查看全部問答∨

求教三星6410中otg相關問題!

6410+wince6.0,我用的是華恒的bsp,發(fā)現(xiàn)otg驅(qū)動中,只有作為device的驅(qū)動,而沒有作為host的驅(qū)動,請教各位的otg驅(qū)動也是如此嘛? 參照6410的spec,發(fā)現(xiàn)otg phy可以通過配置寄存器給usb host用,這點我已經(jīng)實現(xiàn),otg的口可以正常用于u盤,usb鼠標 ...…

查看全部問答∨

急!!U盤驅(qū)動問題

我在內(nèi)核配置中選擇了加載U盤的相關驅(qū)動選項,但是不正確,U盤沒有識別,是不是我的目標板的U盤驅(qū)動程序針對指定的u盤芯片,對我這個U盤不識別,和這個有關嗎?我試了好幾個U盤都不行,請求高手解答!謝謝…

查看全部問答∨

匯編語言設計題

匯編語言設計題:從鍵盤輸入一組不超過3位的十進制數(shù),并保存到Array內(nèi)存單元中,并判斷其中的奇數(shù),同時顯示到屏幕。(用子程序做)…

查看全部問答∨
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 廊坊市| 佳木斯市| 棋牌| 西乡县| 东丽区| 吕梁市| 正定县| 上虞市| 宁德市| 盈江县| 澄迈县| 新疆| 武汉市| 田东县| 清镇市| 平凉市| 陵川县| 武强县| 安平县| 吴堡县| 枝江市| 肥城市| 繁昌县| 丹阳市| 阿尔山市| 土默特左旗| 余江县| 泰州市| 台湾省| 丰顺县| 周口市| 浙江省| 黄陵县| 涟源市| 彰武县| 永宁县| 仁怀市| 锡林郭勒盟| 英吉沙县| 碌曲县| 雷州市|