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

  如果项目中对系统的时候有要求,那么就不能通过降低系统时钟来降低功耗,此时就可以通过使用低功耗模式来降低功耗。低功耗模式有三种:等待(Wait)活跃停机(Active Halt)停机(Halt)

  官方文档中介绍等待模式的设置只需要执行WFI指令即可。

  如果需要退出低功耗模式,就需要通过外部中断、内部中断、或者复位来实现。
  现在就来演示一下如何通过代码设置等待(Wait)模式。

  这里使用一个LED灯闪烁来表示单片机运行在正常模式中。上电后LED灯开始闪烁,闪烁几秒钟之后使用指令进入 低功耗的 等待(Wait)模式,此时LED灯将不再闪烁,此时如果单片机内部发生了中断或者IO口上出现了外部中断,那么单片机就会退出低功耗模式,LED灯就会继续闪烁。

  那么编写程序时就要用到IO口来控制LED灯的亮灭,还需要一个内部中断,这里就使用内部定时器中断,然后还需要一个外部IO的触发中断。

  首先初始化LED的IO口,这里使用PB5口来驱动LED灯。为了方便控制,这里使用宏定义将PB5口的输出重新定义为LED,这样给LED赋值的时候,就相当于直接操作了寄存器。

#define  LED       PB_ODR_ODR5
void LED_GPIO_Init( void )
{PB_DDR |= ( 1 << 5 );        //PA1 输出 ledPB_CR1 |= ( 1 << 5 );        //PA1 推挽输出
}

  接下来初始化内部定时器,这里使用定时器4进行一个1ms的定时。如果单片机进入低功耗模式后,定时器的定时中断就可以将单片机从低功耗模式中唤醒。

void Timer4_Init( void )
{TIM4_PSCR = 0x07;                           //2^7= 128 分频    125k  --> 8usTIM4_SR = ( ~0x01 );                        //清除更新中断标志TIM4_ARR = 124;                             //125--1msTIM4_CNTR = 0;TIM4_CR1 |= 0x01;                           //使能计数器TIM4_IER |= 0x01;                           //更新中断使能
}
#pragma vector  =  25                           // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void Timer4_Handle( void )         //1ms 定时中断
{TIM4_SR = ( ~0x01 );                        //清除更新中断标志//可以通过定时器中断,将单片机从等待模式中唤醒。
}

  还需要初始化一个外部中断,用于测试通过外部中断将单片机从低功耗唤醒。

//初始化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 )
{//外部中断会将单片机从 停机模式唤醒
}

  需要的外设准备好之后,接下来就可以编写主函数了。

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();
//    Timer4_Init();__asm( "rim" );                              //开启中断while( 1 )                                  //进入低功耗之前,电流5.5mA{LED = !LED;        delay_ms( 500 );cnt++;if( cnt > 10 )                          //进入低功耗之后,电流1.8mA{cnt = 0;__asm("wfi");                      //进入等待模式  外部中断 或者 内部中断 或者 复位 唤醒中断}}
}

  首先初始化系统时钟和需要的外设,然后在循环中给LED取反,当LED灯闪烁5s之后,使用 WFI 命令让单片机进入 等待模式(Wait)中。此时LED灯将不会再闪烁。如果给PD2口上接一个高电平,那么就会触发外部中断,单片机将会从等待模式中退出。LED灯就继续开始闪烁。

  如果要测试内部中断唤醒单片机,就需要将初始化中定时器4的初始化代码取消屏蔽。

 Timer4_Init();

  如果开启了定时器4的中断之后,就会发现LED灯会一直闪烁,5s之后并没有停止闪烁。这是因为单片机进入低功耗模式之后,定时器4的中断出现了,单片机就又被从低功耗模式中唤醒了。由于定时器4是1ms中断,这个时间非常短,通过肉眼观察不出来。此时只能通过单步调试模式,在程序中打断点来观察单片机进入和退出低功耗模式。

  通过万用表来检测单片机的电流,当LED灯闪烁的时候,单片机的电流为5.5mA左右,当LED灯不再闪烁的时候,单片机的电流为1.8mA左右。说明进入低功耗模式之后,单片机的耗电确实减小了很多。

  此工程是在IAR编译器上实现的,所以进入低功耗的WFI指令使用的是嵌入汇编指令。

     __asm("wfi");

  不同的编译器中嵌入汇编的指令方法是不一样的,如果使用的是其他的编译器,进入低功耗模式的命令写法有可能和这个不一样。

  完整工程下载链接:STM8单片机低功耗wait模式实现

STM8单片机低功耗---等待(Wait)模式实现相关推荐

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

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

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

      前两篇文章介绍了低功耗模式中的 等待(Wait)模式和停机(Halt)模式的实现.这篇文章开始介绍 活跃停机(Active Halt)模式. STM8单片机低功耗-等待(Wait)模式实现 STM ...

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

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

  4. STM8单片机ADC连续采样模式

     STM8S003单片机内部ADC为12位,A/D转换的各个通道可以执行单次和连续的转换模式.  单次转换模式的意思就是,ADC每次转换一次数据后,就会停止转换,如果还需要继续转换的话,就需要手动开启 ...

  5. stm8单片机例程下载链接

    在这篇文章中将自己上传的资源做一个下载链接的目录方便查找下载 STM8单片机编码器使用示例 STM8单片机ADC连续扫描模式并开启模拟看门狗功能 STM8单片机ADC单次扫描模式并开启模拟看门狗功能 ...

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

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

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

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

  8. STM8 ADC转换模式-------单次模式

    STM8单片机ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式. 单次模式         在单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选 ...

  9. 浅谈单片机低功耗处理

    浅谈单片机低功耗处理 一.什么是低功耗处理 我们在研发电子产品的时候,经常会涉及到功耗的问题.因为电子产品肯定是要供电的,供电的方式最常用的几种是:220V交流直插供电.用直流适配器供电和电池供电.无 ...

最新文章

  1. 基于uPC1677C射频功率放大
  2. Collection接口的常用方法
  3. 网页版消消乐快速实现,无代码吗iVX 真那么简单?
  4. mysql查看用户名_Mysql创建数据表的方法介绍(附示例)
  5. 行进位,超前进位 ,行波进位 ,并行进位有什么区别
  6. 房费制 它 结账BUG
  7. 去掉windows10“更新并关机”
  8. python修饰符号的使用_Python 函数修饰符(装饰器)的使用
  9. linux 下socket通信,client断开service退出解决办法
  10. Ubuntu锐捷校园网连接不上问题,认证成功但是上不去网。
  11. grafana text panel配置说明
  12. HDS USPV-VSP HP XP24000 Raid崩溃阵列损坏多盘损坏数据恢复方法思路分享
  13. 高级路由交换题库 答案与解释
  14. vue实现前端人机验证
  15. 算法分析一:基础知识
  16. win7 设置双屏壁纸
  17. Centos7安装(四)抓包工具wireshark源码编译安装
  18. 概率论各种基础分布期望和方差推导过程汇总
  19. python下载详细教程
  20. 如何选择一个技术解决方案

热门文章

  1. dex、apk完整性校验
  2. HAproxy + keepalived 实现双机热备
  3. Exchange 2007的自动发现
  4. 游侠原创:手机电子商务与社交隐私--网络安全的下一个关注点
  5. QuantLib 101之Swap
  6. 2007年11月网络工程师考试试题答案
  7. .NET和JAVA的比较- 体系结构
  8. mvc上传图片(上传和预览)webuploader
  9. 0917变量类型注意点
  10. [转]本地图片预览二三事