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