上一篇我們已經(jīng)實現(xiàn)了不改硬件,只改軟件情況下將STM32F103C8T6替換為AT32F403ACGT7的過程,但畢竟STM32F103C8T6已經(jīng)是10多年前的東西了,用現(xiàn)在的AT32F403ACGT7替換實在是大材小用了,畢竟這顆是主頻能到240M的M4。
上篇我們解決了替換能用的問題,本篇我們來結(jié)合AT32F403ACGT7的優(yōu)勢,實現(xiàn)不改硬件只改BOM降成本的方法。
從接觸MCU開始,MCU外圍電路中就缺少不了很重要的器件,那就晶振,晶振是MCU的時鐘源。隨著技術(shù)的不斷發(fā)展,越來越多的MCU將晶振集成到了MCU內(nèi)部,但集成到內(nèi)部后真的就能夠省略掉外部晶振嗎,當(dāng)然不是,由于技術(shù)和工藝問題,前些年的MCU還無法完全擺脫外部晶振,而近幾年的MCU才算真正能夠擺脫外部晶振,STM32F103系列和AT32F403A系列正好代表了這兩個階段的產(chǎn)品。
我們先來看看STM32F103系列內(nèi)部晶振的參數(shù)
蕩器精度大多數(shù)情況下都大于1%,最大時大于了2%,用在串口應(yīng)用中都覺得不靠譜,更何況是在USB應(yīng)用當(dāng)中了,所以,官方文檔對使用內(nèi)部晶振時做了明確的使用說明:
我們再來看看AT32F403A系列的內(nèi)部晶振參數(shù)
在使用RCC_CTRL寄存器校準(zhǔn)情況下,能夠達到最大值偏差1%的精度,已經(jīng)能夠滿足大多數(shù)的精度要求,RCC_CTRL寄存器校準(zhǔn)是在系統(tǒng)啟動后自動完成的,不需要人為干預(yù),如果想再提到精度,可以再修改相關(guān)寄存器,以提高到更高的精度。
并且在USB應(yīng)用中,為保證內(nèi)部晶振能夠滿足精度要求,還提供了ACC校準(zhǔn)功能,可以提高進度到0.25%。
在這些校準(zhǔn)方式下,AT32F403A系列的內(nèi)部晶振已經(jīng)能都替換掉外部晶振了。另外,在省略掉外部晶振后,還能夠讓芯片多出2個IO腳,在ST32F103系列中,使用內(nèi)部晶振時空出的2個管腳只能做IO用,沒有中斷功能,而AT32F403A系列則沒有這個限制。
接下來,本篇內(nèi)容的重點就是在使用ST32F103標(biāo)準(zhǔn)庫情況下最小的改動實現(xiàn)開啟AT32F403A內(nèi)部晶振,讓BOM成本降低,并且增加了性能。在上一篇中我在標(biāo)準(zhǔn)庫的系統(tǒng)時鐘初始化函數(shù)void SystemInit (void)內(nèi)添加的開啟FPU代碼。
同樣在這個函數(shù)內(nèi)還有一行代碼SetSysClock(),它負(fù)責(zé)設(shè)置系統(tǒng)內(nèi)的各條總線時鐘。STM32這里一般是設(shè)置使用外部晶振,總線時鐘為72M。
因為我們要使用內(nèi)部晶振,所以要將外部晶振相關(guān)的宏定義關(guān)掉,這里我們只需將#define SYSCLK_FREQ_72MHz 72000000關(guān)掉即可。
這樣所有和外部晶振相關(guān)的時鐘配置都將關(guān)閉,總線時鐘將被配置為內(nèi)部時鐘。
因為原來的程序都是建立在總線時鐘是72M情況下的,我們需要使用內(nèi)部晶振重新創(chuàng)建各個總線的時鐘與原程序的總線時鐘一致,才能保證系統(tǒng)能夠正常運行。
我們在AT32F402A系列的BSP的system_at32f4xx.c文件內(nèi)找到#define SYSCLK_FREQ_72MHz_HSI 72000000所對應(yīng)的函數(shù),這個函數(shù)內(nèi)實現(xiàn)了再使用內(nèi)部晶振情況下,配置總線為72M的操作(注意,BSP要用1.xx版本的,2.xx版本的庫風(fēng)格改變了,不再兼容STM32標(biāo)準(zhǔn)庫風(fēng)格)。
因為原來的程序都是建立在總線時鐘是72M情況下的,我們需要使用內(nèi)部晶振重新創(chuàng)建各個總線的時鐘與原程序的總線時鐘一致,才能保證系統(tǒng)能夠正常運行。
我們在AT32F402A系列的BSP的system_at32f4xx.c文件內(nèi)找到#define SYSCLK_FREQ_72MHz_HSI 72000000所對應(yīng)的函數(shù),這個函數(shù)內(nèi)實現(xiàn)了再使用內(nèi)部晶振情況下,配置總線為72M的操作(注意,BSP要用1.xx版本的,2.xx版本的庫風(fēng)格改變了,不再兼容STM32標(biāo)準(zhǔn)庫風(fēng)格)。
將static void SetSysClockTo72MHSI(void)函數(shù),拷貝到現(xiàn)在的代碼中(位置根據(jù)自己習(xí)慣),我放在main函數(shù)這里。
由于缺少宏定義和寄存器名差異問題,會有很多報錯,先不管,先將函數(shù)內(nèi)精簡一下,只保留我們使用型號的先關(guān)定義。
然后我們對照STM32F103的參考手冊和AT32F403A的參考手冊中關(guān)于RCC寄存器的名稱定義,用STM32F103的寄存器名和宏定義替換AT32F403A的寄存器名和宏定義,修改后名稱后如下:
依然報錯的位置是因為這3個宏是STM32F103庫里沒有定義的,需要我們重新定義一下,我們可以在AT32F403A的BSP庫里找到,拷貝過來就行。
接下來我們將SetSysClockTo72MHSI();添加的main函數(shù)開始的位置,也就是實現(xiàn)了原來void SystemInit (void)內(nèi)SetSysClock();的工作。
重新編譯,沒有錯誤。
至此,使用AT32F403A內(nèi)部晶振替換原STM32F103外部晶振的配置就完成了,省去了外部晶振和電容,增加了2個能實現(xiàn)中斷的管腳,實現(xiàn)了通過修改BOM降低層本增加性能的目的。
注意:在這種配置下,多數(shù)外設(shè)模塊是能夠正常工作的,但部分外設(shè)會有問題,我會再后面的文章中繼續(xù)為大家分享相關(guān)的問題。
本
-
mcu
+關(guān)注
關(guān)注
146文章
17123瀏覽量
350975 -
STM32F103
+關(guān)注
關(guān)注
33文章
477瀏覽量
63600 -
MDK
+關(guān)注
關(guān)注
4文章
209瀏覽量
32063
原文標(biāo)題:STM32F103移植到AT32F403A之MDK(二)
文章出處:【微信號:創(chuàng)易棧,微信公眾號:創(chuàng)易?!繗g迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論