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