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

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

前两篇文章介绍了低功耗模式中的 等待(Wait)模式停机(Halt)模式的实现。这篇文章开始介绍 活跃停机(Active Halt)模式

STM8单片机低功耗—等待(Wait)模式实现

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

由于活跃停机(Active Halt)模式相对应前面两种模式来说实现起来比较复杂一点。同时也可以通过使用中断和不使用中断来实现,所以对于 活跃停机(Active Halt)模式将通过三篇文章来分别进行分析。

首先来看,官方的资料介绍。

  要使用 活跃停机(Active Halt)模式需要使用AWU,那么这个AWU又是什么呢?

  这个AWU主要用来设置自动唤醒,也就是说当电源进入到活跃停机(Active Halt)模式之后,可以通过AWU这个功能,自动将单片机从低功耗中唤醒。

  通过这几个低功耗模式比较可以发现,停机模式只能通过外部中断或者复位来将单片机从低功耗模式中唤醒。但是在某些情况下没有外部中断或者复位信号,那么单片机进入低功耗之后就永远退不出来了。这时候就可以使用AWU自动唤醒功能,自动的将单片机从低功耗模式唤醒。

下面就先演示最简单的通过外部中断来唤醒。

#define  LED       PB_ODR_ODR5

void LED_GPIO_Init( void )
{
    PB_DDR |= ( 1 << 5 );        // 输出 led
    PB_CR1 |= ( 1 << 5 );        // 推挽输出
}
//初始化PD2口
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 )
{
    //外部中断会将单片机从 停机模式唤醒
}

将PB5口作为LED口,用来指示电源运行状态。将PD2口作为外部中断触发口,用于将单片机从低功耗模式中唤醒。

接下来需要初始化AWU。

void AWU_init()
{
    CLK_ICKR |= 0x2C;                           // 活跃停机模式下主电压调节器处于关 打开低速振荡器(128K) 从停机或者活跃停机模式唤醒使能
    FLASH_CR1 |= 0x04;                          // 当MCU在Active-halt 模式时FLASH处于掉电模式
    AWU_APR = 0x3E;                             //设置异步预分频器值 64分频
    AWU_TBR = 0x0;                              //无自动唤醒中断
    AWU_CSR1 = 0x0;                             //不使能自动唤醒功能
}

在AWU中将低速振荡器打开,这个振荡器用于在单片机进入低功耗模式后计时器使用,根据这个低速振荡器的值来计算自动唤醒时间。为了降低功耗,当单片机进入活跃停机(Active Halt)模式时,将FLASH也设置为掉电模式。接下来设置低速振荡器的分频值,这里关闭自动唤醒中断,当单片机进入 活跃停机(Active Halt)模式时不会自动唤醒,只能通过外部中断唤醒。由于不需要自动唤醒,所以就可以不使能自动唤醒功能。

最后编写主函数。

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.5mA
    {
        LED = !LED;
        delay_ms( 500 );

        cnt++;
        if( cnt > 10 )                          //进入低功耗之后,电流183uA
        {
            cnt = 0;
            AWU_init();                         //使能AWU
            __asm( "halt" );                    //进入 活跃停机(Active Halt)模式         
        }
    }
}

首先初始化用到的各种外设,接下来在循环中对LED取反,这样就好看到LED灯的闪烁,当系统运行5s之后,通过命令进入活跃停机(Active Halt)模式,在发送 halt命令之前,首先需要初始化AWU。当单片机进入活跃停机(Active Halt)模式后,LED灯就不会再闪烁了,如果此时给PD2口一个上升沿的电平,单片机就会退出低功耗模式,此时LED灯就会正常闪烁。

单片机正常工作时通过万用表测量的电流为5.5mA,当单片机进入到活跃停机(Active Halt)模式之后,单片机的工作电流就会降低到183uA。

工程完整下载路径:STM8单片机低功耗 活跃停机Active Halt模式实现

相关文章