CIU32M010、CIU32M030華大電子MCU通用輸入輸出、同步串行接口
參考價: | 面議 |
- 產品型號
- 品牌
- 代理商 廠商性質
- 沈陽市 所在地
訪問次數(shù):237更新時間:2021-08-18 10:32:03
1 | 1 |
---|
客戶在用華大MCU systick做延時,表示系統(tǒng)延時不準確,差距很大。
看一下systick的initial函數(shù) SysTick_Init:
發(fā)現(xiàn)輸入到SysTick_Config中的SystemCoreClock,客戶打印或者debug發(fā)現(xiàn)SystemCoreClock為8M,實際客戶使用200Mhz運行。
那么這個systick timer的計數(shù)時基就不對了,所以看一下SystemCoreClock是哪里配置的。
發(fā)現(xiàn)是在系統(tǒng)剛啟動start.s調用的SystemInit內再調用SystemCoreClockUpdate函數(shù)中根據(jù)實際系統(tǒng)時鐘設置情況賦值。
而實際程序中我們往往需要使用到PLL把MCU系統(tǒng)時鐘變更到更高的頻率上,比如200Mhz。
通常我們會在main函數(shù)內加一個ClkInit類似函數(shù),在ClkInit中設置PLL 提高系統(tǒng)時鐘。
那么startup_hc32f46x.s文件中在main函數(shù)執(zhí)行之前,會調用SystemInit:
而SystemCoreClock就在SystemInit內設置,所以也就是說.s文件在我們main函數(shù)設置系統(tǒng)clk之前就已經(jīng)根據(jù)MCU剛剛啟動時的時鐘配置把SystemCoreClock賦值了。
而MCU剛啟動的時候,都時默認內部8M RC振蕩器,SystemCoreClock為8Mhz也就不奇怪了。
得出結論,我們在驅動或者其他程序運行的地方用到SystemCoreClock變量的地方 都會出現(xiàn)我們不想要的8Mhz時鐘。(在main運行后 變更了系統(tǒng)時鐘)
所以,請在main調用類似ClkInit函數(shù)后,再次調用一下SystemInit或者SystemCoreClockUpdate來更新全局變量SystemCoreClock。
這樣比如systick等用到變量SystemCoreClock初始化的功能都會正確設置時基。
這里我建議使用SystemCoreClockUpdate來更新全局變量SystemCoreClock。