前言
目前很多用戶在使用 STM8 的時候使用了 16MHz 的內部振蕩或者外部晶體來作為時鐘源。事實上,STM8 家族中有些系列是支持最高 24MHz 主頻的,比如 STM8S207、STM8AF52,等等。那么,需要更快的運行速度時,是否只需要使用更高的主頻就可以直接運行了呢?
問題
某客戶在其產品的設計中,使用了 STM8AF52A9。客戶工程師稱其一段以前已經驗證過的代碼,使用 STVP 下載后無法正常運行。但是他試過在 IAR for STM8 中是可以正常調試的,不知道為何使用 STVP 后就無法正常工作了呢?
調研
1.了解問題
使用編譯好的.s19 文件使用 STVP 燒寫到 STM8AF52A9,發現上電后是無法正常工作的。觀察用戶代碼,在 IAR 中進入調試狀態,可以斷點調試,單步調試,都可以。不過,最后發現在線調試時,一旦運行到以下代碼時,程序就死掉了。
status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE,CLK_CURRENTCLOCKSTATE_DISABLE);
2.分析問題
STM8 上電后默認的主時鐘源為內部 HSI RC 時鐘的 8 分頻,即 fHSI/8。原因是 HSI 時鐘的穩定時間短,而 8 分頻可保證系統在較差的 VDD條件下安全啟動。等主時鐘源穩定后,用戶可以自行將主時鐘切換到其他時鐘源上。
先來看一下剛才這個函數的原型:
ErrorStatus CLK_ClockSwitchConfig(CLK_SwitchMode_TypeDef CLK_SwitchMode,CLK_Source_TypeDef CLK_NewClock, FunctionalState ITState, CLK_CurrentClockState_TypeDefCLK_CurrentClockState)
它的作用在于切換時鐘源。CLK_SwitchMode 代表使用的切換方式,有自動切換和手動切換;CLK_NewClock 代表新的時鐘源;ITState 代表是否使能或禁用中斷;CLK_CurrentClockState 代表切換后原時鐘源的狀態是否保持或關閉。所以,用戶代碼的意思就是:使用自動切換方式,切換主時鐘到 HSE,不產生中斷,切換后原主時鐘源關閉。
切換主時鐘源后程序就出問題這種情況,看來問題很可能出在 HSE 上,必須對外部晶振進行檢測。原本思考是否 HSE 外部晶體的振蕩是否存在什么問題,但是在使用示波器進行檢測后發現 HSE 已經是在正常的振蕩當中了,而且波形很漂亮。但是,在示波器上看到頻率是 24MHz。檢查晶體上的標記,果然是 24MHz 的頻率。所以,客戶在使用 STM8AF52A9 時,為了提高性能,使用了最高主頻 24MHz。
客戶所遇到的問題應該就出在 24MHz 的使用上了。客戶以前使用都是 16MHz 的主頻。STM8 要求,如果用戶使用的主時鐘頻率超過了 16MHz,那么 Flash 以及 EEPROM 的訪問需要配置 1 個等待周期。
STM8AF52A9 數據手冊可見如下:
參考手冊 RM0016 在 HSE 的描述中,也提到了:
對于選擇 0 等待周期還是 1 等待周期,必須在選項字節中選擇。檢查芯片的選項字節,發現選擇的是 0 等待周期,所以問題就是就出在這了。
3.問題解決
使用 STVP,在 OPTION BYTE 頁面修改選項字節,將等待周期設置為 1 個等待周期,如下:
下載更新芯片的選項字節,使用之前的.hex 文件,可以正常工作了。
結論
由于使用的 24MHz 主頻已經超出 16MHz,而在選項字節中并沒有修改等待周期為 1 等待周期,導致在 Flash 訪問上存在問題,無法正常運行程序。
處理
需要修改選項字節,將等待周期修改為 1 等待周期。
-
STM32
+關注
關注
2270文章
10921瀏覽量
356965 -
時鐘源
+關注
關注
0文章
93瀏覽量
16011
原文標題:STM8使用24MHz外部晶振無法正常運行
文章出處:【微信號:mcugeek,微信公眾號:MCU開發加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論