STM8单片机低功耗---停机(Halt)模式实现

x33g5p2x  于2022-04-22 转载在 其他  
字(1.7k)|赞(0)|评价(0)|浏览(515)

在上一篇文章 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 模式代码实现

相关文章