IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM8单片机低功耗---活跃停机(Active Halt)模式实现-3 -> 正文阅读

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

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

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

??首先初始化用到的外设

#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 = 0x0C;                              //自动唤醒中断时间  2^11*64/128000=1.024s
    AWU_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闪烁功能,低功耗模式的功耗的确比正常模式小很多。如果系统使用的是电池供电的话,使用低功耗模式可以有效地延长电池使用寿命。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:55:20  更:2022-04-26 11:57:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:26:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码