STM8低功耗设定及其例程
更新时间:2024-04-04 15:39:01 阅读量: 综合文库 文档下载
- stm8低功耗设置推荐度:
- 相关推荐
STM8低功耗设定及其例程
STM8有三种低功耗模式,即等待、活跃停机和停机。具体它们三者有什么区别自己看官方手册去吧,这里只讲停机模式的应用,其他的一笔带过!
一、进入的方式:
等待模式进入用的指令是WFI,而活跃停机和停机用的都是halt(),所不同的是,在执行halt指令之前,如果开启了AWU,则是活跃停机,反之则是停机。还有一点要说明的是,在停机模式下独立看门狗是不能养的,而只能养窗口看门狗。 二、具体进入的步骤:
1、首先,你声明一个标志位,名字自己取。这个标志位是用来判断系统是该处于运行模式还是处于停机模式的。我这里用fPowerOn_flag,如下: bool fPowerOn_flag = FALSE;
有了这个标志位以后就写下面的部分了: int main(void) {
//设置内部16M晶振为系统时钟 Clk_Init(); //系统时钟初始化函数 MWWDG_Init();//窗口看门狗初始化函数
while (1) {
Free_WWDG();//喂狗函数
if(fPowerOn_flag == FALSE){
Halt_OffDevice();//停机前关闭不需要的外设 halt();//进入停机模式
System_Init();//系统初始化函数 }
if(fPowerOn_flag){ //运行代码在这里添加 } } }
以上就是一个停机模式的模板了,大家参照着用就可以了。系统上电默认是进入停机模式,然后通过按键唤醒进入运行模式。下面为大家讲一下主函数中每个函数的写法和功能吧! 2、各函数说明: a、时钟初始化函数:
void Clk_Init(void) {
CLK_DeInit();//复位时钟寄存器
CLK_HSICmd(ENABLE);//使能内部高速时钟
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);//配置内部高速时钟(时钟分频器:4分频),系统时钟4MHz
CLK_ClockSecuritySystemEnable();//开启时钟安全系统 }
这个函数我想不用多讲了,大家都懂的。 b、窗口看门狗函数: void MWWDG_Init(void) {
WWDG_Init(COUNTERINIT, WINDOW);//COUNTERINIT = 0x7f,WINDOW = 0x77 }
这个是窗口看门狗初始化函数。 void Free_WWDG(void) {
INT8U CounterValue;
CounterValue = (INT8U)(WWDG_GetCounter() & 0x7F); /*
* 判断是否小于所设置的窗口上限值 * 只有小于窗口上限值才能清零 */
if(CounterValue < WINDOW){
WWDG_SetCounter(COUNTERINIT); } }
这个是窗口看门狗喂狗函数,防止看门狗复位。 c、停机前外设设置函数: void Halt_OffDevice(void) {
//关闭设备前,设置系统主时钟,和中断 Clk_Init();
//CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);
ADC1_DeInit(); TIM1_DeInit();
//停机前关闭不需要的功能模块的时钟
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER3,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU,DISABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C,DISABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART2,DISABLE);
GPIO_Init(GPIOA,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOB,GPIO_PIN_HNIB,GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOB,GPIO_PIN_2|GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOC,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_SLOW);
GPIO_Init(GPIOC,GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOD,GPIO_PIN_LNIB,GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOD,GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOE,GPIO_PIN_LNIB,GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOE,GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOG,GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(GPIOG,GPIO_PIN_1,GPIO_MODE_OUT_PP_HIGH_SLOW);
InPut_Init();
enableInterrupts(); }
这个函数主要就是在停机前设置好系统的时钟,并且关闭一切不必要的外设的时钟,如AD,定时器等等的时钟。并且最重要的是要设置好系统唤醒的条件和使能中断。对于IO口的设置,对于外设是高电平工作的,那么设置成推挽输出低,对于是低电平工作的那么设置成推挽输出高。这里说明一下,浮空输入我不知道可不可以,大家可以试试。 d、唤醒口初始化设置函数: void InPut_Init(void) {
//与按键相连的引脚设置为输入模式
GPIO_Init(P_PortD,Power,GPIO_MODE_IN_PU_IT);
//将PD7引脚的TLI中断设置为下降沿中断,TLI是最高优先级中断 EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY);
GPIO_Init(P_PortA,CHARGE_IN,GPIO_MODE_IN_PU_IT);
//将GPIOD端口设置为上升沿触发中断--因为充电器插入时产生一个高电平,拔出时产生一个下降沿
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA,EXTI_SENSITIVITY_RISE_FALL); }
系统可以通过两个IO口里唤醒CPU,一个是按键,设置成最高优先级中断TLI,并且是下降沿中断。还有一个就是充电器插入唤醒中断,这里我的移动电源是要充电的,所以要做充电器的插入拔除检测,因此要设置成上升沿下降沿中断方式。
讲完以上的函数,大部分的功能都讲完了,剩下的就是在stm8s_it.c里面处理中断了。
按键唤醒中断处理:
INTERRUPT_HANDLER(TLI_IRQHandler, 0) {
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction. */
delay_ms(20);//延时消抖
if(!GPIO_ReadInputPin(P_PortD,Power)){ delay_ms(20); time_count = 0;
if(fPowerOn_flag == FALSE){ fPowerOn_flag = TRUE; } else{
if(fExitDCPower_flag == FALSE) fPowerOn_flag = FALSE; } } }
首先是20ms的延时,然后再次检测IO口的电平,如果为低,那么说明按键按下了,再延时20ms。然后处理系统工作的标志位。如果系统在停机模式,那么按下按键以后,系统进入工作模式;反之,系统进入停机模式。这里说明一下,那个else里面的处理要加入一个限制条件,就是在运行模式下再次按下唤醒按键时,要先判断充电器有没有插入,如果没有插入,则系统进入停机模式,如果插入了,系统则不处理,继续保持运行模式对电池充电。
充电器插入唤醒中断处理:
INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler,3) {
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction. */
delay_ms(20);
if(GPIO_ReadInputPin(P_PortA,CHARGE_IN)){ delay_ms(20);
if(fPowerOn_flag == FALSE) fPowerOn_flag = TRUE;
if(fExitDCPower_flag == FALSE) fExitDCPower_flag = TRUE; } else{
delay_ms(20);
if(fExitDCPower_flag == TRUE) fExitDCPower_flag = FALSE; }
}
这里的话我相信大家也应该看得懂的,就不多言了!
好了,今天就讲到这里了。我想已经讲得够详细了吧,还有什么问题的话可以发邮件给我。我的邮箱是610967340@qq.com!拜拜,新的一年祝大家身体健康、工作顺利!
正在阅读:
STM8低功耗设定及其例程04-04
领导干部和公务员法律考试题库07-28
山东阳谷铜业工程-硫酸储罐制安方案05-02
企业家精神:如何向企业文化扩展?08-07
如何实现ADSL宽带共享02-09
人类语言和所谓动物09-21
细谈USB TYPE-C09-03
天狼50 说明 - 图文04-25
党委书记对照检查整改措施02-23
西三角经济区构建中 安康角色思考03-04
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 功耗
- 设定
- 及其
- STM8
- 实验器材清单
- 材料力学课程设计--五种传动轴的静强度、变形及疲劳强度的计算
- 盛新凤《跨越百年的美丽》教学实录及评析
- 上海2017学年高三英语联考试题
- 2015年度台州市领导干部党纪法规知识考试题20151224
- 大学生心理健康教育 - 题库
- 当代日本的经济政治及外交战略
- 组织行为学习题
- 参加2015年全国职业院校技能大赛中职组
- 物流系统规划与设计试卷及答案
- 裁判文书制作规范
- 中国传统音乐文化(上)复习题
- 2017年南平市初中毕业班适应性检测数学试题
- “学党史、感党恩、跟党走”党史党建知识答题竞赛试题及答案
- 高年级学生有较强的中华文化和语言的自豪感
- 妖精的口袋营销战略分析报告书 - 图文
- 幼儿园园长安全责任书
- 工业厂房联合工程监理大纲
- 12金融专业投资实习计划
- 说题范例一:数列-1