历史上的今天
今天是:2024年09月29日(星期日)
2021年09月29日 | STM8S(105K4)使用笔记——活跃停机模式的配置与AWU唤醒
2021-09-29 来源:eefocus
STM8S提供的可编程的电源管理
等待(Wait)模式:
通过WFI指令进入。该模式下CPU将停止运行,但外设与中断控制器仍保持运行。
该模式下可以通过外设时钟门控、降低CPU时钟频率、选择低功耗时钟源(LSI,HSI)进一步降低功耗。
在等待模式下,所有寄存器与RAM的内容不变,进入等待模式前所定义的时钟配置也不会在进入等待模式后改变。
当一个内部或外部中断产生时,CPU从等待模式唤醒并恢复工作。
停机(Halt)模式:
通过HALT指令进入。该模式下主时钟停止,即由fMASTER提供时钟的CPU及所有外设均被关闭。
该模式下可以通过关闭主电压调节器、进一步降低功耗。需注意,主电压调节器关闭后,仅LSI时钟源可用,HSE时钟源对于低功耗电压调节器来说电流消耗太大。
该模式下,FLASH是处于POWERDOWN状态的,此时FLASH处于低功耗状态,唤醒时间较长。可以通过配置FLASH_CR1的HALT位置1,使FLASH在进入停机模式时处于STANDBY状态,此时FLASH处于等待状态,唤醒时间短,但功耗较高。
在等待模式下,所有寄存器与RAM的内容不变,进入停机模式前所定义的时钟配置也不会在进入等待模式后改变。
HSI RC的启动速度比HSE快,可以通过进入停机模式前将时钟切换为HSI作为fMASTER的时钟源,减少MCU的唤醒时间。
当一个外部中断产生时,CPU从停机模式唤醒并恢复工作。
活跃停机(Active Halt)模式:
使能AWU后,通过HALT指令进入。该模式下主振荡器、CPU及几乎所有外设都被停止。如果AWU和IWD已被使能,则只有LSI RC与HSE仍处于运行状态,以驱动AWU和IWD计数器。
该模式下可以通过关闭主电压调节器、进一步降低功耗。需注意,主电压调节器关闭后,仅LSI时钟源可用,HSE时钟源对于低功耗电压调节器来说电流消耗太大。
该模式下,FLASH是处于STANDBY状态的,此时FLASH处于等待状态,唤醒时间短,但功耗较高。可以通过配置FLASH_CR1的AHALT位置1,使FLASH在进入停机模式时处于POWERDOWN状态,此时FLASH处于低功耗状态,唤醒时间较长。
在活跃等待模式下,所有寄存器与RAM的内容不变,进入活跃停机模式前所定义的时钟配置也不会在进入等待模式后改变。
HSI RC的启动速度比HSE快,可以通过进入活跃停机模式前将时钟切换为HSI作为fMASTER的时钟源,减少MCU的唤醒时间。
当一个外部中断产生,或AWU中断产生时,CPU从活跃停机模式唤醒并恢复工作。
0、文章简介
本文章仅讲述活跃停机模式配置与通过AWU中断的唤醒。
1、AWU的时间间隔介绍
AWU的时间间隔取决于AWU_TBR寄存器的AWUTB[3:0]位的值与AWU_PAR寄存器的APR[5:0]位的值。
AWUTB[3:0]配置参考表

APR[5:0]配置参考表

时间间隔配置
假设此时fLS=128kHz,需要的时间间隔为175ms,选择时间范围应为128 ms - 256 ms
则AWUTB[3:0]的值为0b1010。
APRDIV = 175 ms × 128kHz / 2AWUTB[3:0] - 1
= 0.175 s × 128000Hz / 29
= 43.75 ≈ 44
则APR[5:0]的值为2Ah。
2、AWU的配置
进入活跃停机模式,首先需要配置AWU。
通过官方库"stm8s_awu"提供的函数初始化AWU
/**
* @brief AWU Initialization Function
* @param None
* @retval None
*/
void _AWU_Init(void)
{
/* Initialization of AWU */
/* The delay corresponds to the time we will stay in Halt mode */
AWU_Init(AWU_TIMEBASE_30S);
// 官方库共提供16档预设的唤醒中断触发时长与1档无唤醒中断,作为AWU_Init()的参数,它们分别是:
// AWU_TIMEBASE_NO_IT:无自动唤醒中断
// AWU_TIMEBASE_250US,AWU_TIMEBASE_500US,AWU_TIMEBASE_1MS,AWU_TIMEBASE_2MS
// AWU_TIMEBASE_4MS,AWU_TIMEBASE_8MS,AWU_TIMEBASE_16MS,AWU_TIMEBASE_32MS
// AWU_TIMEBASE_64MS, AWU_TIMEBASE_128MS,AWU_TIMEBASE_256MS,AWU_TIMEBASE_512MS
// AWU_TIMEBASE_1S,AWU_TIMEBASE_2S,AWU_TIMEBASE_12S,AWU_TIMEBASE_30S
}
以175 ms时间间隔为例,通过寄存器初始化AWU(可以自定义唤醒时长)
/**
* @brief AWU Initialization Function
* @param None
* @retval None
*/
void _AWU_Init(void)
{
/* Initialization of AWU */
/* Set the TimeBase */
AWU->TBR &= (uint8_t)(~0x0F);
AWU->TBR |= 0x0A;
/* Set the APR divider */
AWU->APR &= (uint8_t)(~0x3F);
AWU->APR |= 0x2A;
/* Enable the AWU peripheral */
AWU->CSR |= 0x10;
}
3、配置软件中断
在活跃停机模式中触发AWU中断,AWU_CSR的AWUF将会置1。
AWU_CSR的AWUF置1,将进入INTERRUPT_HANDLER(AWU_IRQHandler, 1)中断函数中,通过读取AWU->CSR寄存器清除该标志位。
/**
* @brief Auto Wake Up Interrupt routine.
* @param None
* @retval None
*/
INTERRUPT_HANDLER(AWU_IRQHandler, 1)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
/* Clear AWU peripheral pending bit */
AWU_GetFlagStatus();
// AWU->CSR;
}
4、低功耗可选项
主电压调节器控制
主电压调试器关闭后,功耗将进一步降低。此时仅LSI时钟可用,且CPU唤醒时长增加。
// 通过官方库"stm8s_clk"提供的函数关闭主电压调试器
/* Enable Slow Active Halt Wake Up Moed*/
CLK_SlowActiveHaltWakeUpCmd(ENABLE);
/* Disable Slow Active Halt Wake Up Moed*/
// CLK_SlowActiveHaltWakeUpCmd(DISABLE);
// 通过寄存器关闭主电压调试器
/* Enable Slow Active Halt Wake Up Moed*/
/* Set S_ACTHALT bit */
CLK->ICKR |= 0x20;
/* Reset S_ACTHALT bit */
// CLK->ICKR &= (uint8_t)(~0x20);
FLASH低功耗模式控制
活跃停机模式的默认FLASH低功耗模式为开启。此时功耗将降低,但FLASH唤醒时长增加。
// 通过官方库"stm8s_flash"提供的函数控制FLASH低功耗模式
/* Set Flash Low Power Mode To Power Down */
FLASH_SetLowPowerMode(FLASH_LPMODE_POWERDOWN);
/* Set Flash Low Power Mode To STANDBY */
//FLASH_SetLowPowerMode(FLASH_LPMODE_STANDBY);
// 通过寄存器控制FLASH低功耗模式
/* Set Flash Low Power Mode */
/* Set Flash Low Power Mode To Power Down */
FLASH->CR1 &= (uint8_t)(~0x04);
/* Set Flash Low Power Mode To STANDBY */
// FLASH->CR1 |= (uint8_t)(~0x04);
5、例程
void main(void)
{
/*
系统时钟配置;
外设配置;
……
*/
/* AWU configuration ---------------------------------------- */
_AWU_Init();
/*
低功耗可选项;
*/
/* enable interrupts ----------------------------------------- */
enableInterrupts();
while (1)
{
/*
业务代码;
*/
if(/* 进入低功耗条件成立 */) {
FlagStatus flag_HaltHold = TRUE;
}
while (flag_HaltHold) {
halt();
if(/* 唤醒条件成立 */) {
flag_HaltHold = FALSE;
}
}
}
}
注意:
进入活跃停机模式后,由于IWDG基于LSI时钟,因此IWDG不会停止计数;而由于WWDG基于HSI,因此WWDG将停止计数,但仍推荐在进入活跃停机模式前,刷新WWDG计数器。
进入活跃停机模式后,GPIO的状态将保持进入活跃停机模式前的状态,这一部分的电流消耗不能忽视。若有必要,请将所有GPIO引脚设置浮空输入,进一步降低功耗。
6、AWU寄存器简介
CSR控制/状态寄存器

APR异步分频寄存器

TBR时基选择寄存器
史海拾趣
|
急需!!! 电子技术研发设计开发方案!!! 公司拓展,急需方案,请拥有方案或部分技术的公司和个人迅速与我联系, 邮箱 rdeasy@yahoo.cn 请注明公司全名或个人的姓,详细准确的联系方式和方案,否则不予考。 你有别的电子技术设计 ...… 查看全部问答> |
|
哪个朋友XINLIN的VHDL程序比较厉害,,我写了个程序老有点小问题 八个拨码开关 11111111 不分频 11111110 2分频 11111101 3分频 11111100 4分频 依次类推,,,问题的难点就在奇数 偶数都要分频 而且 我用的是XINLIN 的95 ...… 查看全部问答> |
|
我现在在学习omap5910 在ARM与DSP数据传送时遇到一个问题 就是ARM是默认的小端存储 DSP是默认的大端存储 但在网上搜索了一下 好像ARM端的大小端可以自己设置 请问哪位大虾能赐教一下 自己如何设置… 查看全部问答> |
|
TI【免费样片!高棚灯 LED 照明/化学/气体传感器/LED 阵列驱动,,立即获取!!!】 【免费样片! 数量有限, 立即获取!!!】TI整合国半(NS)后推出系列系统解决方案 从通讯、计算机、消费类电子到汽车、工业,从能源、医疗到安防、航空航天,收购国半之后的TI整合双方优势,不断提升产品结合后的总体效用,已陆续推出一系列创新、完 ...… 查看全部问答> |
|
•Q1和Q2组成了一个反置的图腾柱,用来实现隔离,同时确保两只驱动管Q3和Q4不会同时导通。 R2和R3提供了PWM电压基准,通过改变这个基准,可以让电路工作在PWM信号波形比较陡直的位置。Q3和Q4用来提供驱动电流,由于导通的时候,Q3和Q4相对Vh ...… 查看全部问答> |




