使用、參考STM32標(biāo)準(zhǔn)外設(shè)庫(kù),寄存器開發(fā)的朋友也需要注意一些細(xì)節(jié)問題。
1USART串口預(yù)分頻
許多朋友用寄存器開發(fā),就需要對(duì)寄存器中每一位十分熟悉才行。
但是在STM32中外設(shè)的寄存器很多,不像51這類單片機(jī),就那么為數(shù)不多的寄存器,而且寄存器也能很容易理解。
有朋友其實(shí)已經(jīng)發(fā)現(xiàn),UART波特率設(shè)置太高,或太低就不能實(shí)現(xiàn)了。看下圖波特率計(jì)算公式:
從上圖可以看得出,波特率與fCK和USARTDIV。其中USARTDIV是一個(gè)無(wú)符號(hào)的定點(diǎn)數(shù),這12位的值設(shè)置在USART_BRR寄存器。
結(jié)合上面圖文,大家應(yīng)該可以知道,波特率也是有一個(gè)范圍的,而且波特率是存在誤差的。
舉一個(gè)例子:fCK = 36M,波特率 = 100,那么計(jì)算出USARTDIV = 36M / 1600 =22500.
然而,12位的數(shù)最大為4095,所以,越界了。
寫這些其實(shí)希望不管你使用寄存器,還是庫(kù)開發(fā),其實(shí)都需要了解這些,避免入坑。
2
前面有朋友問了我關(guān)于TIM定時(shí)器的問題,說(shuō)自己參考STM32標(biāo)準(zhǔn)外設(shè)庫(kù),配置定時(shí)器,但是定時(shí)卻不準(zhǔn)確。
經(jīng)過交談,他把配置代碼截圖給我看了。我一看,就看出問題出在預(yù)分頻值上。
而這位朋友是使用STM32F407,主頻168M,他想讓定時(shí)器每秒計(jì)數(shù)1000個(gè),就是上面“SystemCoreClock / 1000”。
然而,他卻沒有考慮溢出問題:168M / 1000 = 168K,PrescalerValue最大值為65535.
另一個(gè)關(guān)于APB1、APB2時(shí)鐘問題
有朋友發(fā)現(xiàn)自己配置的定時(shí)會(huì)相差一倍,其實(shí)原因也是在于預(yù)分頻值不對(duì)造成的。
讓大家看一下下圖兩個(gè)預(yù)分頻宏定義:
原因在于:有的TIM定時(shí)器時(shí)鐘是APB1,有的是APB2。這兩個(gè)時(shí)鐘一般默認(rèn)配置是相差一倍,所以定時(shí)也就會(huì)相差一倍。
關(guān)于TIM使用的APB時(shí)鐘差異,大家可以通過查看“參考手冊(cè)”RCC章節(jié),或結(jié)合STM32Cube工具理解。
定時(shí)器RCC時(shí)鐘:
定時(shí)器Cbue時(shí)鐘配置:
-
STM32
+關(guān)注
關(guān)注
2290文章
11018瀏覽量
362977 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3297瀏覽量
117450 -
Tim
+關(guān)注
關(guān)注
0文章
83瀏覽量
18269 -
USART
+關(guān)注
關(guān)注
1文章
201瀏覽量
31718
發(fā)布評(píng)論請(qǐng)先 登錄
CAN總線十萬(wàn)個(gè)為什么 | CAN自定義波特率有什么用?

RS232通信的波特率設(shè)置說(shuō)明
波特率設(shè)置中的常見問題解析
波特率與串行通信的關(guān)系 各種設(shè)備波特率轉(zhuǎn)換的方法
常見的波特率標(biāo)準(zhǔn)和協(xié)議
Wi-Fi與藍(lán)牙的波特率對(duì)比分析
波特率的定義和計(jì)算方法 波特率與數(shù)據(jù)傳輸速度的關(guān)系
MCU串口自動(dòng)識(shí)別波特率原理分析

波特率9600和115200的區(qū)別
波特率與比特率有何關(guān)系 波特率與數(shù)據(jù)傳輸速率的關(guān)系
uart波特率和傳輸頻率的關(guān)系 UART串口的常用波特率為多少

串口通信中的波特率你真的了解嗎?差距竟如此重要!

評(píng)論