在篇2當中,我們已經實現了使用內部晶振使主頻達到72M,使各總線時鐘也達到了和使用外部晶振一樣的頻率。
但部分模塊在使用STM32標準庫時還是會有些問題,本篇就針對常用的外設遇到的問題予以說明并解決。
首先,串口是我們最常用的外設,在使用內部晶振使各總線與使用外部晶振達到一樣的頻率時,使用串口時會存在數據收發亂碼的問題。
我們來分析一下問題點,因為串口在使用外部晶振時,都是正常的,說明串口配置是沒錯的。再改為使用內部時鐘后就出現串口異常問題,那問題一定來自時鐘這塊的問題,我們通過代碼仿真看一下。在串口初始化過程中有和時鐘相關的操作,在void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)函數中。
通過仿真看一下RCC_ClocksStatus中各總線的時鐘值,發現總線時鐘都不對
經過對RCC_GetClocksFreq(&RCC_ClocksStatus)函數的分析發現,獲取的倍頻系數竟然是3,這是怎么回事?
通過看AT32F403A的用戶手冊發現,PLL倍頻系數是兩部分組成的,我們在總線時鐘初始化時使用的是倍頻18倍,正好兩部分都用到的,而ST的庫在取值時只取了其中的一部分,導致倍頻系數在計算時出現了錯誤。
好了,現在問題的原因找到了,我們該怎么解決呢?
有兩種方式解決,第一種是改宏定義,使CFGR_PLLMull_Mask能夠完整的取到正確的倍頻系數(本人沒有采用這種方式,因為倍頻系數不連續,處理起來比較麻煩,而且容易出現其他調用問題)。
第二種是,不改宏,而是改串口初始化函數,因為獲取各總線頻率后用來計算波特率,我們人為將用到的總線頻率改成正確的值就行了,我是這么改的。
通過修改此處,串口通信恢復正常。串口問題就此解決。
注意:其他外設如果也有通過獲取總線時鐘用于計算的,都要注意這個問題!!!
接著我們要處理個很容易忽略的問題,那就是FLASH問題,這里要說的不是廠家手冊里說過的零等待啊,FLASH延時等問題。而是頁大小問題,這個問題不是在所以的AT32F403A替換STM32F103系列都會遇到的問題。
我們先來看看STM32F103系列FLASH頁大小的定義。
? ?
我們再來看看AT32F403A系列FLASH頁大小的定義。
在使用AT32F403A替換STM32F103系列小容量和中容量時,由于頁大小定義不同,在進行FLASH操作時要注意頁大小問題,此問題多會出現在IAP,或將FLASH用于存儲數據時會出現問題,而STM32F103大容量和互聯型者不會有問題。
至此,我在使用AT32F403A替換STM32F103過程中遇到的問題就都介紹完了,如果在后續使用過程中再發現其他問題,請點擊下方圖片打開問個芯小程序進行咨詢哦
本文來自創易棧平臺用戶@峰@投稿
審核編輯:湯梓紅
-
STM32
+關注
關注
2266文章
10873瀏覽量
354832 -
移植
+關注
關注
1文章
377瀏覽量
28111 -
STM32F103
+關注
關注
33文章
476瀏覽量
63481 -
MDK
+關注
關注
4文章
209瀏覽量
32039 -
USART
+關注
關注
1文章
195瀏覽量
30795
原文標題:STM32F103移植到AT32F403A之MDK(三)
文章出處:【微信號:創易棧,微信公眾號:創易棧】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論