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
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
举报