前两篇文章介绍了低功耗模式中的 等待(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_ODR5void LED_GPIO_Init( void )
{PB_DDR |= ( 1 << 5 );        // 输出 ledPB_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模式实现

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

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

      在上一篇文章中使用活跃停机模式实现单片机的定时自动唤醒功能.STM8单片机低功耗-活跃停机(Active Halt)模式实现-2 通过这个实验可以看出,自动唤醒功能和定时器定时功能很类似,那么能不 ...

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

      在平时使用单片机的时候,一般不太关心功耗的问题.但是当产品需要使用电池供电的话,那么功耗问题就要必须重视起来.那么如何降低单片机的功耗呢?STM8官方资料上给我们提供了以下几点建议:   如果项目 ...

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

      在上一篇文章 STM8单片机低功耗-等待(Wait)模式实现 中介绍了低功耗模式中的等待(Wait)模式代码实现方法,这篇文章就来演示一下 停机(Halt)模式的代码实现.    停机(Halt) ...

  4. STM8单片机ADC带缓存的连续采样模式

      在上一篇文章中说了STM8的ADC连续采样模式,为了提高采样的精度和速率,STM8单片机还提供了带缓存的连续采样模式,也就是说ADC会连续采集8个数据,放在缓存中,读取数据时可以一次从缓存中读取8 ...

  5. STM8L低功耗HALT模式一些总结

    STM8L低功耗HALT模式一些总结 进入HALT注意事项 将未使用到的IO口设置为输出低: 关闭所有用到的外设时钟(如 ADC.USART等): 失能所使用到的外设: 实测进入HALT模式待机约为0 ...

  6. STM32单片机-低功耗设置

    STM32F103R8和RC的停机模式的休眠电流还不一样,R8停机模式实测为11uA,RC停机模式实测为30uA,还以为又是我的程序哪里没做好呢,仔细看了PDF,这两个芯片PDF上标的值的确有区别,和 ...

  7. STM8L101活跃停机(AWU)编程教学

    STM8L101活跃停机(AWU)编程教学 虽然在网上找到很多STM8活跃停机的编程方法,但是STM8的型号不一样,程序也是有差异的,我找了一圈没有找到STML101的程序,本来还想着偷一下懒的,无奈 ...

  8. STM8单片机ADC连续扫描模式

      当STM8单片机使用ADC功能读取多个通道的值时,可以使用连续模式,但是连续模式一次只能采样一个通道的值,那么如果要采样多个通道时怎么办呢?STM8提供了一个多通道连续采样扫描模式.也就是说多个通 ...

  9. STM8 ADC转换模式-------带缓存的连续模式

    STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 连续和带缓存的连在连 换模式中,将ADC设为连续模式,该模式是通过置位 ADC_CR1寄存器的 ...

最新文章

  1. Python os模块常用命令
  2. iOS中你可能没有完全弄清楚的(二)自己实现一个KVO源码及解析
  3. QT 通过QNetworkReply *获取对应请求的URL地址
  4. Linux 0.12内核的内存管理基础
  5. 7-26晚上实现mystring
  6. 米哈游CEO蔡浩宇GDC演讲:《原神》如何打造动人的开放世界?
  7. 原创:微信小程序源码解说:石头剪刀布(附源码下载)
  8. javascript高级程序设计学习之数值转换 |Number(),parseInt(),parseFloat()
  9. oracle循环异常跳过,oracle异常处理00103 loop异常继续循环 异常处理选点
  10. 两个系统整合一起怎么说_结婚后该不该把父母接过来一起生活? 看看过来人是怎么说的...
  11. $.post 中文乱码 php,如何解决jquery $.post 乱码问题
  12. DoTWeen常用方法
  13. 计算机开机pin,电脑开机时忘记pin密码怎么办?
  14. python flv转mp4_ffmpeg将多个flv文件合成为mp4(golang版)
  15. 解决 /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20‘ not found (required by 问题
  16. 阿里员工调侃:花名考拉的妹子离职去了网易考拉,现在又回来了
  17. c-lodop自定义分页打印
  18. 硬件工程师成长之路(0)----认识元件
  19. Java毕业设计-公交路线查询管理系统
  20. 圣杯布局原来这么简单!!

热门文章

  1. SetDll把Dll文件注入到.exe应用程序中
  2. iOS开发中的单元测试(三)——URLManager中的测试用例解析
  3. PDFlib使用实例
  4. PowerPC VxWorks BSP分析(4.2)——BSP定制
  5. Oracle的一些资料
  6. 查看目录中的内容及权限
  7. MYSQL数据库常用语句
  8. JS几种数组遍历方式以及性能分析对比
  9. 【转】Android虚拟平台的编译和整合
  10. url即统一资源定位符