在上一篇文章 STM8单片机低功耗—等待(Wait)模式实现 中介绍了低功耗模式中的等待(Wait)模式
代码实现方法,这篇文章就来演示一下 停机(Halt)模式
的代码实现。
停机(Halt)模式
的进入也是只需要一条指令就可以了,通过给单片机发送halt
指令,单片机就直接进入停机模式。
停机(Halt)模式
比等待(Wait)模式
的功耗更低,因为在等待(Wait)模式
中振荡器和外设还没有关,而在 停机(Halt)模式
中,振荡器和外设都关了。
由于在停机(Halt)模式
中振荡器和外设都关了,所以就不能通过内部中断唤醒了,只能通过外部中断或者复位来唤醒。
要使用代码测试停机(Halt)模式
的话,这里需要通过一个LED指示灯来表示单片机的工作状态,单片机正常工作时,指示灯闪烁,当单片机进入停机(Halt)模式
时,指示灯就不在闪烁。然后还需要一个外部中断来唤醒单片机。
首先初始化LED。
#define LED PB_ODR_ODR5
void LED_GPIO_Init( void )
{
PB_DDR |= ( 1 << 5 ); //PA1 输出 led
PB_CR1 |= ( 1 << 5 ); //PA1 推挽输出
}
将PB5口作为LED控制口,输出低电平LED灯亮,输出高电平LED灯灭,为了方便程序编写,使宏定义将PB5的输出寄存器定义为LED,这样直接给LED赋值的时候,也就相当于对PB5的数据寄存器赋值了。
接下来初始化外部中断。
void EXTI_GPIO_Init( void )
{
PD_DDR &= ( ~( 1 << 2 ) ); //输入
PD_CR1 &= ( ~( 1 << 2 ) ); //浮空输入
PD_CR2 |= ( 1 << 2 ); //打开外部中断
}
//PD2口为中断输入 低电平触发
void EXTI_Init( void )
{
EXTI_GPIO_Init();
EXTI_CR1 &= ~( 3 << 6 ); //6 7 位清零
EXTI_CR1 |= ( 1 << 6 ); //PD上升沿触发
}
//端口D外部中断 中断号6
#pragma vector = 8 // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void EXTI_PORTC_Handle( void )
{
//外部中断会将单片机从 停机模式唤醒
}
将PD2口作为外部中断触发口,当PD2上出现上升沿的时候,就会触发中断程序,将单片机从低功耗模式中唤醒。
下面就可以直接编写主程序了。
void SysClkInit( void )
{
CLK_SWR = 0xe1; //HSI为主时钟源 16MHz CPU时钟频率
CLK_CKDIVR = 0x00; //CPU时钟0分频,系统时钟0分频
}
void main( void )
{
unsigned int cnt = 0;
__asm( "sim" ); //禁止中断
SysClkInit();
delay_init( 16 );
LED_GPIO_Init();
EXTI_Init();
__asm( "rim" ); //开启中断
while( 1 ) //进入低功耗之前,电流5.3mA
{
LED = !LED;
delay_ms( 500 );
cnt++;
if( cnt > 10 ) //进入低功耗之后,电流155uA
{
cnt = 0;
__asm("halt"); //进入停机模式 外部中断 或者 复位 唤醒中断
}
}
}
在主程序中首先初始化系统时钟、延时函数、LED口、外部中断等,接下来在循环中让LED灯不停地翻转,5s之后通过停机指令,让单片机进入停机模式,此时LED灯将不再闪烁。单片机进入低功耗,如果此时给PD2口给一个上升沿的信号,单片机就会从低功耗模式中退出,此时LED灯将会继续闪烁。
通过万用表测量单片机的电流,单片机正常工作时电流为5.3mA左右,当单片机进入停机(Halt)模式
后,电流大小只有155uA左右,由此证明在停机模式下单片机的功耗是非常小的。
工程文件的完整下载路径:STM8单片机低功耗停机 Halt 模式代码实现
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://hxydj.blog.csdn.net/article/details/124317811
内容来源于网络,如有侵权,请联系作者删除!