使用 stm32f407 與電腦主機進(jìn)行串口通信時,串口助手打印亂碼,主要從以下方面進(jìn)行排查:
- 檢查傳輸協(xié)議設(shè)置是否一致(波特率、數(shù)據(jù)位、停止位、校驗位)
- 檢查MCU外部晶振頻率是否和庫函數(shù)設(shè)置的一致
最終發(fā)現(xiàn)是外部晶振頻率和庫函數(shù)不一致的問題。
一、時鐘分析
1、認(rèn)識時鐘源
我們要檢查的是 APB2總線的時鐘源是否設(shè)置正常,因為我們當(dāng)前使用的串口 USART1 與 APB2 總線(高速總線)相連,從下圖看,時鐘源有三個:
- HSI:高速內(nèi)部時鐘,RC振蕩器,頻率為16MHz
- HSE:高速外部時鐘,接外部時鐘源,頻率范圍為4MHz~26MHz
- PLL:鎖相環(huán)倍頻輸出,其時鐘輸入源可選擇為?HSI/M、HSE/M(本質(zhì)還是 由HSE或HSI控制)
就結(jié)果而言,選擇的時鐘源是 PLLCLK。(若想了解,可以參考最后一部分)
2、計算系統(tǒng)時鐘
現(xiàn)在已經(jīng)知道了選擇的是 PLLCLK 作為時鐘源,那么我們就可以順著這條路線計算系統(tǒng)時鐘的值。正點原子 stm32f407 的外設(shè)時鐘頻率 HSE = 8 M
① 輸入 HSE
②?經(jīng)過 M 分頻,得到的結(jié)果為 HSE / M = 8 / M
③ ④ ⑤ ⑥ 經(jīng)過 N 倍頻,VCO的輸出為 (HSE / M ) * N
⑦ 再次 P 分頻就得到?SYSCLK =?(HSE / M ) * N / P
二、解決外部晶振頻率和庫函數(shù)不一致的問題
從上面可知,選擇的系統(tǒng)時鐘頻率? SYSCLK =?(HSE / M ) * N / P,配置文件預(yù)期的 SYSCLK = 144MHz,其余參數(shù)也都指定了
實際上 HSE 需要視開發(fā)板具體情況而定,stm32f4?的 HSE 為 8 MHz,然而配置文件中配置的頻率是 25 M,為了不影響原本的SYSCLK,我們需要修改 HSE 和 PLL_M。
- HSE =?8 M = 8000000
- PLL_M = (HSE / SYSCLK ) * N / P = 8
1、修改 HSE
HSE 在程序中的體現(xiàn)為宏定義 HSE_VALUE ,該宏定義在?stm32f4xx.h 文件中
這里有兩種修改方法,可任選一種修改
2、修改 PLL_M
分頻數(shù) M 在程序中的體現(xiàn)是宏定義?PLL_M,該宏定義在?system_stm32f4xx.c 文件中
?
三、為什么可以確定時鐘源為 PLLCLK 而不是 HSE
stm32 在啟動的時候就會調(diào)用?SystemInit 函數(shù),這個函數(shù)就包含了初始化外設(shè)的時鐘源。這個函數(shù)定義在 system_stm32f4xx.c 中。我們直接找到 SetSysClock 函數(shù),這之前的都是將控制寄存器位清零的操作。
我們進(jìn)入到 SetSysClock 函數(shù),首先是HSE使能,等待時鐘準(zhǔn)備就緒。剛上電的時候 HSE 晶振不穩(wěn)定,需要等待 6 個晶振時鐘周期。
PLL 使能,等待時鐘準(zhǔn)備就緒。一開始 PLL 處于被鎖定狀態(tài),這里需要等待 PLL 解鎖。
一切準(zhǔn)備就緒,然后將 PLL 設(shè)為系統(tǒng)時鐘。?
?
參考文章:文章來源:http://www.zghlxwxcb.cn/news/detail-663532.html
在串口通信實驗中出現(xiàn)通信亂碼怎么辦-電子發(fā)燒友網(wǎng) (elecfans.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-663532.html
到了這里,關(guān)于【STM32】串口通信亂碼(認(rèn)識系統(tǒng)時鐘來源)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!