STM8S_006_AWU自动唤醒
来源:互联网 发布:浪潮软件集团有限公司 编辑:程序博客网 时间:2024/06/06 06:41
Ⅰ、写在前面
在某些低功耗的设备中,需要设备进入低功耗,且又需要间隔一定时间唤醒MCU,就需要有这么一个“AWU自动唤醒”定时自动唤醒的功能。
在STM32中实现上面功能,常见的操作就是使用RTC来实现。但RTC每次进入低功耗之前都需要配置一下RTC,而STM8独特的AWU功能只需要简单的初始化配置即可。
为方便大家阅读,本文内容已经整理成PDF文件:
http://pan.baidu.com/s/1i5uWhJR
作者:strongerHuang
版权所有,未经允许,禁止用于其它商业用途!!!
Ⅱ、AWU基础知识
AWU:AutoWakeUp,即自动唤醒
AWU是用来当MCU进入低功耗的活跃停机(Active Halt)模式时提供一个内部的唤醒时间基准。该时间基准的时钟是由内部的低速RC振荡器时钟(LSI)或者通过预分频的HSE晶振时钟来提供的。
LSI低速内部时钟测量
在使用LSI低速内部时钟时,为了确保最好的精度,它的频率可以通过TIM3的输入捕捉1来测定。
AWU操作
为了使用AWU功能,按顺序执行如下步骤:
1. 使用AWU_CSR寄存器的MSR位和TIM1/3的输入捕捉通道1来检测LS的时钟频率(对精度要求不高,该步骤可省略);
2. 通过写AWU_APR的APR[5:0]位来定义适当的预分频值;
3. 通过写AWU_TBR的AWUTB[3:0]来选择需要的自动唤醒延时;
4. 置位AWU_CSR 的AWUEN位;
5. 执行HALT指令。
提示:
计数器仅仅在HALT指令之后MCU进入活跃停机模式时才开始计数(请参考电源管理的活跃停机模式章节), AWU中断同时被使能。
预分频计数器仅仅在APR[5:0]值不同于它的复位值0x3F值时才开始计数。
LSI低速内部时钟频率检测
在经过出厂校验后,在全温度范围内低速内部RC(LSI)振荡器的频率离散性是128 kHz +/-12.5%。为了获得精确的AWU时间间隔或者蜂鸣器输出,必须精确测量LSI频率。本文提供的两个工程代码中有一个是校正过的,有一个没有校正。
可采用如下的步骤:
1. 将AWU_CSR的MSR位置1来把LSI的内部时钟连接到TIM1/3定时器的ICAP1;
2. 通过定时器的输入捕捉中断来测量LSI的时钟频率;
3. 到向AWU_APR的APR [5:0] 位写入一个适当的值来调整AWU定时间隔到期望的时间间隔。AWUTB[3:0]位可以被更改来选择不同的时间间隔。
Ⅲ、软件工程源代码
1、关于工程
本文提供的工程代码是基于前面软件工程“STM8S_Demo”增加AWU修改而来。初学的朋友可以参看我前面对应的基础文章,那些文章讲的比较详细。
工程源代码主要实现功能:配置AWU定时1秒,让MCU从停机模式自动唤醒,改变LED状态;然后又进入停机模式,以此循环下去。
本文重点讲述关于AWU的内容:
AWU_LSICalibrationConfig:LSI低速内部时钟校正配置
AWU_Init:AWU初始化配置
2.代码分析说明
A.AWU_LSICalibrationConfig:时钟校正配置
关于时钟的校正,如果要求不是很高,可以省略该步骤。从上面的说明可以看得出来,是通过定时器来实现的。
我们提供例程通过TIM1/3捕获功能(该功能在后面文章会讲述)测量LSI的时钟,具体请看我提供例程的“AWU_LSIMeasurement”函数,该函数测量得到的LSI时钟,结合“AWU_LSICalibrationConfig”函数即可校正。
B.AWU_Init(AWU_TIMEBASE_1S):定时1秒AWU
通过上面的描述,大家或许初学的朋友还不能完全理解(上面的描述是针对寄存器的描述),但可以通过代码很直接的明白其意思,我们这里结合的是ST提供的标准外设库,具体可以跟踪代码看见,其实里面的内容就是上面所描述的。
void AWU_Initializes(void)
{
AWU_LSICalibrationConfig(AWU_LSIMeasurement());//校正LSI时钟
AWU_Init(AWU_TIMEBASE_1S); //初始化AWU
enableInterrupts(); //全局中断
}
提示:
很多人不明白为什么这里要配置中断?
其实细心的朋友会发现“控制/状态寄存器(AWU_CSR)”寄存器中的
AWUF自动唤醒标志位:
此位在自动唤醒模块产生中断时被置位,通过读AWU_CSR清零。写操作不影响次位的数值。
0:无自动唤醒中断
1:自动唤醒中断产生
“AWUEN自动唤醒使能位”:
此位由软件置位和清零。由此位使能自动唤醒功能。如果MCU进入Active-halt或 Wait 模式,则自动唤醒模块按照预先编程设置延时一段时间唤醒MCU。
0:禁止自动唤醒功能
1:使能自动唤醒功能
因此,我们还需要在中断函数(stm8s_it.c)里添加代码:
INTERRUPT_HANDLER(AWU_IRQHandler, 1)
{
AWU_GetFlagStatus();
}
这一句主要的功能是清除标志位。
Ⅳ、下载
STM8S资料:
http://pan.baidu.com/s/1o7Tb9Yq
软件源代码工程(STM8S-A06_AWU自动唤醒xxx):
http://pan.baidu.com/s/1c2EcRo0
提示:如果网盘链接失效,可以微信公众号“底部菜单”查看更新链接。
Ⅴ、最后
微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,查看更多精彩内容。
- STM8S_006_AWU自动唤醒
- C++ 自动唤醒线程
- Android 自动休眠唤醒
- stm8 RTC自动唤醒
- RTC自动唤醒
- 自动解锁并唤醒屏幕
- Windows7睡眠后自动唤醒
- 笔记本无缘无故自动唤醒是怎么回事?
- 自动唤醒休眠的Windows XP机器
- 收音机(FM2)加入自动唤醒功能
- AndroidStudio安装调试时自动唤醒设备
- 如何自动唤醒和关闭 Linux
- 笔记本win10 睡眠时会自动唤醒?修复后唤醒缓慢也解决了
- Thinkpad R400待机后自动唤醒的解决办法
- Windows XP + VirtualBox + Ubuntu 自动暂停 无法唤醒
- STM8L101+si4463低功耗和自动唤醒配置
- 关于89 jb2上的自动设置按键唤醒系统的功能以及L版本上设置唤醒键
- robotium中在setUp方法中加入自动唤醒屏幕并解锁
- 设计模式:接口适配(适配器,桥接,外观)
- 关于JavaScript中的方法是否加括号的问题
- 洛谷P1000 超级玛丽游戏
- 非常完善的Log4net详细说明
- JAVAWEB开发之Maven的入门详解——Maven的安装以及项目的结构和Maven的使用以及私服的搭建与配置
- STM8S_006_AWU自动唤醒
- for嵌套循环练习
- mysql tomcat连接问题-找不到类
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
- 数字在排序数组中出现的次数(Java实现)
- 【php基础班】第5天 div+CSS好处、web标准、CSS基本语法、CSS单位与字体、CSS组合选择器、CSS新闻媒体案例
- 做题时的一些零散知识点
- 数据结构之线性表——就近匹配(栈的应用)
- 【MongoDB学习笔记32】MongoDB修改副本集配置