AWU——STM8中的精簡RTC
-
今天使用STM8L001進行了類似RTC定時從停止模式喚醒MCU的實驗。不知爲何,在STM8S系列部分芯片(我沒一個個去查看)和STM8L001、STM8L101等個別芯片上是沒有RTC模塊的,取而代之的是其閹割版 —— AWU模塊。
- 因爲只能配置自動喚醒鬧鐘,沒有設置日曆的功能。
-
這個AWU看文檔配置起來極其簡單,但實際操作起來還是有些坑的。我以實驗用的STM8L001爲例。
- 文檔說第一步要測量LSI的時鐘頻率。 後面的步驟在庫文件的
AWU_Init
函數中都已經有了過程。
怎麼測量LSI的時鐘頻率呢?
這寫的一堆是幹嘛呢…我比較懶,就去庫文件中找了找,發現了幾個好東西。
- 在
stm8l10x_tim2.c
中有TIM2_ComputeLsiClockFreq
函數直接用於測量LSI的頻率。 - 在
stm8l10x_awu.c
中有AWU_LSICalibrationConfig
函數用於使用測得的LSI頻率配置AWU_APR
寄存器 - TIM2_ComputeLsiClockFreq的原型是:
/**
* @brief Compute the frequency of the LSI clock expressed in Hertz.
* @note The timer clock must be a high speed clock: HSI or HSE
* @note It is recommended to use the maximum clock frequency, that is 10 MHz,
* to obtain a more precise result.
* @param TIM2_TimerClockFreq The TIM2 clock frequency expressed in Hertz.
* @retval LSI Clock Frequency value.
*/
uint32_t TIM2_ComputeLsiClockFreq(uint32_t TIM2_TimerClockFreq)
{
...
}
註釋中寫明參數是:TIM2用Hz表示的時鐘頻率。
- 而剛開始我就腦抽的以爲是自己配置分頻的TIM頻率,結果怎麼傳都得不到數值。這裏應該是系統時鐘
CLK_GetClockFreq
函數獲得的值傳進去。
-
在
TIM2_ComputeLsiClockFreq
的前面需要做上圖步驟的第一步,把AWU_CSR
的MSR bit
置有效;測量後失能MSR bit
。 -
用
AWU_LSICalibrationConfig
配置好AWU_APR
寄存器。 -
用
AWU_Init
函數初始化AWU的喚醒間隔時間。 -
每次自動喚醒後都會進入
INTERRUPT_HANDLER(AWU_IRQHandler,4)
中斷服務函數,所以需要在這裏使用AWU_GetFlagStatus
清除標誌。 -
使用
halt
函數讓MCU進入類似STOP
模式,就可以等它到了設定的間隔時間自動喚醒了。
- 這裏說一點比較坑的,我使用例程的同時,自己寫了
AWU_Config()
函數。由於並不知道例程的GPIO_Config()
裏打開了一次全局中斷,於是我在GPIO_Config()
後面加上了自己的AWU_Config()
函數,開始也沒什麼問題,但調試時發現時不時出現測量的LSI頻率值在檢查參數合法性時就會報錯。- 一直很納悶,起初以爲是測量的步驟有問題,還在上述第①步之後加了延時,發現沒有效果。
- 於是嘗試把
AWU_Config()
換個地方初始化,當放到TIM4_Config()
前面時調試就沒出現問題了,我又以爲是TIM4的1ms中斷引起的問題,而放到TIM4_Config()
後面發現也沒問題,進去GPIO_Config()
看了看終於知道了…
- 如下圖中把對AWU的初始化放在箭頭位置都不合適,兩個地方的全局中斷都已開啓,會對LSI的測量結果有影響
- 從
halt
執行後的功耗消耗、留下運行的外設和支持喚醒的方式,我認爲是讓MCU進入類似STM32的STOP
模式了,有沒有小夥伴有其他看法呢?可以評論中說說想法 ~,放上STM8和STM32
的低功耗模式詳情表作參考。
STM8部分的Low power modes
STM32F1的Low power modes