使用、參考STM32標(biāo)準(zhǔn)外設(shè)庫(kù),寄存器開發(fā)的朋友也需要注意一些細(xì)節(jié)問(wèn)題。
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
前面有朋友問(wèn)了我關(guān)于TIM定時(shí)器的問(wèn)題,說(shuō)自己參考STM32標(biāo)準(zhǔn)外設(shè)庫(kù),配置定時(shí)器,但是定時(shí)卻不準(zhǔn)確。
經(jīng)過(guò)交談,他把配置代碼截圖給我看了。我一看,就看出問(wèn)題出在預(yù)分頻值上。

而這位朋友是使用STM32F407,主頻168M,他想讓定時(shí)器每秒計(jì)數(shù)1000個(gè),就是上面“SystemCoreClock / 1000”。
然而,他卻沒(méi)有考慮溢出問(wèn)題:168M / 1000 = 168K,PrescalerValue最大值為65535.
另一個(gè)關(guān)于APB1、APB2時(shí)鐘問(wèn)題
有朋友發(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í)鐘差異,大家可以通過(guò)查看“參考手冊(cè)”RCC章節(jié),或結(jié)合STM32Cube工具理解。
定時(shí)器RCC時(shí)鐘:

定時(shí)器Cbue時(shí)鐘配置:

-
STM32
+關(guān)注
關(guān)注
2309文章
11162瀏覽量
373426 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3368瀏覽量
123606 -
Tim
+關(guān)注
關(guān)注
0文章
85瀏覽量
19038 -
USART
+關(guān)注
關(guān)注
1文章
202瀏覽量
33161
發(fā)布評(píng)論請(qǐng)先 登錄
是否可以將 visionfive2 的 uart 配置為 1Mb 波特率?
碩博電子IO模塊修改波特率和節(jié)點(diǎn)ID操作步驟
FDCAN 數(shù)據(jù)段波特率增加后發(fā)送失敗的問(wèn)題分析
支持小數(shù)波特率的意義是什么
請(qǐng)問(wèn)支持小數(shù)波特率接收數(shù)據(jù)的意義在哪兒?
UART波特率計(jì)算及UART收發(fā)回顯實(shí)驗(yàn)
115200的波特率,為啥實(shí)際速度只有11KB/s?
請(qǐng)問(wèn)如何使用低功耗 UART (LP UART) 波特率補(bǔ)償?
波特率是什么
可編程電源的通信波特率應(yīng)如何設(shè)置?
基于瑞薩64位MPU RZ/G2L的uboot串口多波特率支持介紹
第二十章 TIM——基本定時(shí)器
第十四章 USART——串口通訊
關(guān)于USART波特率 TIM的外設(shè)預(yù)分頻值
評(píng)論