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

  下面就通过这个自动唤醒功能来实现LED灯1s闪烁一次的功能。

  首先初始化用到的外设

#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 = 0x0C;                              //自动唤醒中断时间  2^11*64/128000=1.024sAWU_CSR1 = 0x30;                            //使能自动唤醒中断  使能自动唤醒功能  使能测量功能/*在经过出厂校验后,在全温度范围内低速内部RC(LSI)振荡器的频率离散性是128 kHz +/- 12.5%。为了获得精确的AWU时间间隔或者蜂鸣器输出,必须精确测量LSI频率。*/CLK_PCKENR2 |= 0x04;                        // 使能AWU与主时钟连接CLK_ICKR |= 0x08;                           // 打开内部低速时钟源
}
#pragma vector = 3                              // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void AWU_HALT_Handler( void )
{AWU_CSR1 = AWU_CSR1;                        // 清除更新中断标志位
}

   设置自动唤醒定时时间为1s,然后将设置 外设时钟门控寄存器 2(CLK_PCKENR2),将AWU和主时钟连接起来。然后打开内部低速时钟。 其实最后两句配置语句

    CLK_PCKENR2 |= 0x04;                        // 使能AWU与主时钟连接CLK_ICKR |= 0x08;                           // 打开内部低速时钟源

   也可以不用写,因为 CLK_PCKENR2 寄存器的复位值为 0xFF,所以再给他或一个0x04,结果并没有发生任何改变。

   而第二行CLK_ICKR 的值初始话第一句的时候,已经将第四位的值设置为1了。这里单独写出来是为了重点提醒对时钟的配置。

   这里还需要将自动唤醒中断打开,因为自动唤醒定时时间到了之后,自动唤醒标志位就会被置位,需要将标志位清除之后,下一次自动唤醒功能才会生效,如果不清除标志位,系统第一次进入活跃停机模式之后就不会被自动唤醒了。

   下来就可以编写主函数了

void SysClkInit( void )
{CLK_SWR = 0xe1;                              //HSI为主时钟源  16MHz CPU时钟频率CLK_CKDIVR = 0x00;                           //CPU时钟0分频,系统时钟0分频
}
void main( void )
{__asm( "sim" );                              //禁止中断SysClkInit();delay_init( 16 );LED_GPIO_Init();EXTI_Init();__asm( "rim" );                              //开启中断AWU_init();                                 //使能AWU__asm( "halt" );                            //进入 活跃停机(Active Halt)模式  1s 后自动唤醒while( 1 )                                  //进入低功耗之前,电流5.5mA  进入低功耗之后电流{LED = !LED;                             //利用活跃停机定时自动唤醒功能实现LED灯1s闪烁一次__asm( "halt" );                      //再次进入 活跃停机(Active Halt)模式 5S后自动唤醒}
}

   首先初始化需要用到的外设和AWU,然后使用HALT指令让单片机进入活跃停机模式,1s钟之后,单片机就会被自动唤醒,然后进入while()循环中,此时将LED的状态取反,然后又进入到活跃停机模式中,1s钟之后单片机再次被自动唤醒。然后继续将LED取反,又进入到活跃停机模式中。这样一直循环。在外面观察时就会发现单片机上的LED灯亮1s灭1s一直循环闪烁。

   当不使用低功耗模式时,通过延时函数来实现LED灯的闪烁,用万用表测量单片机的电流为6mA左右。通过活跃停机模式实现LED闪烁时,用万用表测量单片机的电流不到3mA。可以看出同样的LED闪烁功能,低功耗模式的功耗的确比正常模式小很多。如果系统使用的是电池供电的话,使用低功耗模式可以有效地延长电池使用寿命。

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

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

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

  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. Android中使用SeekBar拖动条实现改变图片透明度
  2. TensorFlow: Could not load requested Qt binding.
  3. python仿真智能驾驶_基于Python的3R机器人运动仿真
  4. P1993 小K的农场 (差分约束)
  5. Redis 哨兵(sentinel)模式集群配置(5.0.3版本)
  6. 《Power Designer系统分析与建模实战》——2.1 需求模型简介
  7. 设计模式12-命令模式
  8. druid连接池以及数据源了解
  9. 网贷大数据什么时候会好_为什么大数据待遇那么好 如何入门大数据行业
  10. 【Linux】15 张 Vim 速查表奉上,帮你提高 N 倍效率!
  11. LINUX下载编译iLBC
  12. 国美易卡网络大数据,国美易卡MySQL数据库
  13. 七十七、java版商城之直播短视频带货Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务
  14. Windows Azure为锤子科技Smartisan T1手机提供“工匠”级云服务
  15. 贝叶斯推断 概率编程初探
  16. UTC时间与Beijing时间转换工具
  17. 在HTML中可以链接Word文档吗,网页用word打开-可以直接打开word文件的超链接在网页中, – 手机爱问...
  18. execution切入点表达式
  19. statsmodels.tsa.seasonal.seasonal_decompose使用移动平均线进行季节性分解
  20. 管理者如何提高自身管理能力?

热门文章

  1. Windows7无法访问(远程登录)Windows 2003共享问题解决
  2. PHP生成zip压缩包
  3. apache开源项目--PDFBox
  4. HDOJ 1160 FatMouse's Speed
  5. JAVA视频系列,学习JAVA常遇到的问题,连载【方法篇】。
  6. linux下slow,慢查询日志的分析工具mysqlsla的使用
  7. JMeter对数据库的更新操作
  8. jmeter脚本写个小demo(html论坛自动发帖、json龙果学院-前后端分离)
  9. linux脚本 校准时区,shell脚本校准系统和bios时间
  10. java两人猜数字游戏,三人背后猜数字游戏