久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

STM32F107VCT6開發(fā)板學(xué)習(xí)問題筆記

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月18日   【字體:

1:使用開發(fā)板的USART作為UART通信,在前調(diào)用BSP_Init()函數(shù)初始化開發(fā)板,串口上傳輸?shù)臄?shù)據(jù)出錯(cuò):'a'變成0xfa或0xfe;

   【在這個(gè)問題解決之后,回頭總結(jié)下,在解決問題時(shí):1.預(yù)計(jì)有可能造成出錯(cuò)的原因(這個(gè)可能需要一些經(jīng)驗(yàn),但是思維方式需要這樣的猜測,從系統(tǒng)內(nèi)外,可以先羅列出盡可能有的原因,后面再一一排除) 2.盡可能的定位出錯(cuò)的地方(比如這里通過在線調(diào)試,確定在修改時(shí)鐘后,可以解決數(shù)據(jù)發(fā)送的不正確) 3.推測并排除次因,找出主因,往深一步探測 】
   1:猜測原因。   外因:串口接收的過程受干擾
                  內(nèi)因:A.端口設(shè)置有問題 B.USART的波特率設(shè)置有問題
   2:定位錯(cuò)誤  
     在剛開始時(shí)通過屏蔽BSP_Init()發(fā)現(xiàn)功能正常,再具體定位到BSP_Init()里面的SYSCLK_Frequency時(shí)鐘設(shè)置,發(fā)現(xiàn)例程中默認(rèn)的是72M,但是改為36M,就沒有問題,應(yīng)該是時(shí)鐘方面的設(shè)置問題,具體的問題做何解析?
   3:推測排除,深究
     外因內(nèi)因很好排除,數(shù)據(jù)既然在波特率低時(shí)能正常通信,可能不是端口設(shè)置的問題,應(yīng)該是波特率的問題,常看用戶手冊該節(jié)的資料: 
注: 1.  CPU 的時(shí)鐘頻率越低,則某一特定波特率的誤差也越低。可以達(dá)到的波特率上限可以由這組數(shù)據(jù)得到。 
     2.  只有USART1 使用PCLK2(最高72MHz)。其它USART使用PCLK1(最高36MHz)。
     USART的波特率的計(jì)算公式:
       USARTDIV是一個(gè)無符號的定點(diǎn)數(shù)。這12位的值設(shè)置在USART_BRR寄存器。那么USARTDIV與USART_BRR的關(guān)系又是怎么樣的?
      加入USARTDIV = 27.75;那么 USART_BRR = 0x1B(27) + 0XC(0.75 * 16) = 0X1BC;同理可以從USART_BRR 推出USARTDIV的值;
     假設(shè)fck = 36000000; Tx=115200; =>USARTDIV = 19.53125;所以0x13 + (0.53125 * 16 = 8.5) =>0x13 + 0x9 = 0x139; 所以實(shí)際上是0x139產(chǎn)生的波特率:115015.97(誤差率為 0.15%);
===》理論最大波特率:36000000 / (16 * 1.0) = 2.25M(USARTDIV最小為1.0)
   繼續(xù)往下查,對于SYSCLK_Frequency最高72M,運(yùn)行應(yīng)該沒有問題,但是目前有問題;順藤摸瓜,查看各個(gè)時(shí)鐘控制器,發(fā)現(xiàn)時(shí)鐘設(shè)置路徑: HSE-->PREDIV2-->PLL2-->PREDIV1-->PLL-->SYSCLK;
發(fā)現(xiàn)其中有問題:HSE(25M),PREDIV2(源代碼設(shè)置是2分頻),PLL2(8倍頻),PREDIV1(9倍頻),SYSCLK是算不出72M的,這時(shí)72M的算法其實(shí)已經(jīng)超過72M,所以給USART2時(shí),波特率計(jì)算時(shí)會(huì)出現(xiàn)問題;將PREDIV2(改為5分頻就對了);
   這就是為什么調(diào)用BSP_Init()或者SystemInit會(huì)出問題,他們都調(diào)用SetSysClock(),再調(diào)用SetSysClockTo72()【宏定義72M】,同時(shí)將系統(tǒng)時(shí)鐘改為36M時(shí)不會(huì)出問題,因?yàn)榇藭r(shí)調(diào)用的不是出問題的SetSysClockTo72(),而在之前用的是出錯(cuò)的SetSysClockTo72()卻沒有發(fā)現(xiàn)問題,是因?yàn)橄到y(tǒng)時(shí)鐘雖沒有在預(yù)設(shè)值,但是系統(tǒng)還足以正常工作,但是一旦添加串口,波特率設(shè)置就會(huì)有很大的偏差,數(shù)據(jù)傳輸就出錯(cuò)。
    1:參考代碼其實(shí)里面是有很多問題的
    2:我們應(yīng)該盡可能的多閱讀參考代碼,利用其中的資源,避免重復(fù)造輪子。
                           
2:用串口終端軟件顯示字符串,連續(xù)發(fā)送幾個(gè)字符串時(shí),“xxxx\n”,包含了換行轉(zhuǎn)義字符,但是就是不會(huì)換行?
   通過調(diào)試,發(fā)現(xiàn)在存儲(chǔ)空間,轉(zhuǎn)義字符‘\n’是正確的0x0a,
   USART_SendString(USART2,Menu[0]);
   USART_SendString(USART2,Menu[1]);
   USART_SendString(USART2,Menu[2]);
   USART_SendString(USART2,Menu[3]);

    但是不連續(xù)發(fā)送就不會(huì)出現(xiàn)這種現(xiàn)象,或者一句句調(diào)試打印也不會(huì)出現(xiàn)不換行的現(xiàn)象,斷定是連續(xù)發(fā)送的時(shí)間間隔太短,軟件還沒來得及換行,就又重新顯示新數(shù)據(jù),那么就在USART_SendString的尾部加了延時(shí),就解決問題了。

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 91伊人 | 中文字幕不卡在线88 | 黄色一级毛片免费看 | 麻豆久久久久久久 | 日韩一区二区三区视频 | 久久亚洲欧美日韩精品专区 | 欧美 日韩 综合 | 国产精品99久久久久久久久久久久 | 精品自拍视频在线观看 | 国产乱性 | 久久av网 | av日韩在线播放 | 玖玖玖av | 国产91久久久久蜜臀青青天草二 | 亚洲一区在线日韩在线深爱 | 国产欧美精品在线 | 欧美精品video| 黄色片亚洲 | 久久日韩粉嫩一区二区三区 | 欧美亚洲国产一区二区三区 | 免费激情 | 欧洲精品码一区二区三区免费看 | 亚洲精品乱码久久久久久9色 | 国产一区二区三区久久 | 欧美国产日韩精品 | 国产精品亚洲一区二区三区在线 | 国产精品18hdxxxⅹ在线 | 中文字幕一区二区三区在线视频 | 亚洲色图综合 | 成人在线免费观看 | 亚洲国产精品一区二区第一页 | 色视频网站 | www日本在线播放 | 伊人久久麻豆 | 欧美成人精品一区二区三区 | 国产中文字幕在线观看 | 欧美成人精品一区二区三区 | 精品一区二区三区在线观看 | 久久久www | 91精品国产色综合久久不卡蜜臀 | 亚洲一区成人 |