历史上的今天
返回首页

历史上的今天

今天是:2024年11月14日(星期四)

正在发生

2019年11月14日 | STM8的停机模式

2019-11-14 来源:51hei

首先,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;

  }  

}


推荐阅读

史海拾趣

HM International公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,其发展历程涵盖了从模拟频道增补器到数字卫星、地面及有线电视机顶盒的广泛范畴。而从狭义角度看,机顶盒特指那些具备数字处理能力的设备,如IPTV机顶盒、DVB-S卫星机顶盒、DVB-T地面机顶盒及DVB-C有线电视机顶盒等。

机顶盒的核心功能在于接收并转换数字电视信号,使之能在传统或智能电视上播放。它不仅能接收来自有线电缆、卫星天线及宽带网络的信号,还能提供电子节目指南、网页浏览等增值服务。通过机顶盒,用户能够享受到高清乃至4K超高清的电视节目,体验更为细腻的画面和震撼的音效。此外,机顶盒还具备网络交互能力,支持在线购物、观看网络视频、玩游戏等多元化活动,使电视机从单向接收信息的设备转变为智能互动终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。未来,机顶盒将不仅限于基本的信号接收与解码功能,还将融入更多智能推荐、语音识别等先进技术,为用户提供更加个性化、便捷的娱乐体验。总之,机顶盒作为连接电视与互联网的桥梁,正以其丰富的功能和广泛的应用场景,不断满足用户日益增长的娱乐需求。

DEVCON公司的发展小趣事

在竞争激烈的电子行业中,提供优质的服务是赢得客户信任的关键。DEVCON公司深知这一点,因此不断创新服务模式,提升服务质量。公司建立了完善的售后服务体系,为客户提供及时、专业的技术支持和解决方案。同时,公司还积极开展培训活动,提升员工的技能水平和服务意识。这些创新举措赢得了客户的广泛赞誉和信赖,为DEVCON公司的稳定发展提供了有力保障。

Galaxy ( Bel )公司的发展小趣事

面对日新月异的电子行业技术和市场变化,DEVCON公司始终保持敏锐的洞察力和创新精神。公司不断投入研发力量,探索新的技术和应用领域;同时积极寻求与国内外优秀企业的合作机会,共同推动电子行业的发展。正是这种持续的创新与发展精神,让DEVCON公司在激烈的市场竞争中始终保持领先地位,成为电子行业中不可或缺的重要力量。

以上五个故事是基于DEVCON公司可能的发展路径和一般电子行业的发展趋势而虚构的。这些故事旨在展示DEVCON公司如何通过技术创新、市场扩张、服务创新等方式在电子行业中不断发展和壮大。

Digital Core Design公司的发展小趣事

面对版权问题的挑战和市场的变化,Core Design开始寻求变革。公司的创始人Jeremy Heath-Smith和Adrian Smith在《古墓丽影:黑暗天使》发行后不久就辞去了在Eidos和Core的职务,并创立了新的工作室Circle Studio。然而,这个新工作室最终也未能逃脱被市场淘汰的命运。在2006年6月,Circle Studio被Eidos彻底抛弃,并卖给了另一家公司Rebellion。虽然Core Design的名字被保留下来,但其实际的开发团队和运营已经发生了巨大的变化。在这个过程中,Core Design不得不面对现实,寻找新的发展机遇和方向。

以上这些故事展示了Core Design在电子行业中的发展历程,包括其初创时期的艰辛、成功时期的辉煌、挑战时期的困境以及变革时期的新生。这些故事都基于事实,旨在客观地呈现Core Design的历史和发展。

EPCOS/TDK公司的发展小趣事

作为全球领先的电子元器件制造商之一,EPCOS在通信领域取得了显著的突破。其电容器、电感器等产品在通信系统中发挥着关键作用,为各种通信设备提供了稳定的电源和信号处理方案。EPCOS不断投入研发资源,致力于开发适应新一代通信技术需求的高性能电子元器件。这些创新产品不仅提高了通信系统的性能和可靠性,也推动了整个通信行业的进步。

以上是关于EPCOS/TDK公司发展起来的5个相关故事。这些故事不仅展示了公司在技术创新、市场拓展等方面的成就,也体现了其在电子行业中的重要地位和影响力。

Decawave公司的发展小趣事

随着UWB技术的不断发展和应用领域的不断扩展,Decawave不断丰富和完善其产品和解决方案。除了UWB芯片外,公司还推出了与UWB芯片兼容的模块和开发工具,以及针对特定应用场景的解决方案。这些产品和解决方案不仅满足了客户的不同需求,也进一步巩固了Decawave在UWB技术领域的领先地位。

问答坊 | AI 解惑

应用技巧/多CPU单片机系统设计在社区安防系统中的应用

本文较为详细地介绍基于多CPU的单片机系统设计思想,并给出它在社区安全防范系统中的应用。…

查看全部问答>

针对基于德州仪器TMS320C54x DSP的便携式MP3播放器的实时DSP软件设计

针对基于德州仪器TMS320C54x DSP的便携式MP3播放器的实时DSP软件设计…

查看全部问答>

fpga

本帖最后由 paulhyde 于 2014-9-15 09:24 编辑 因为9月份就要参赛咯。然后我们组的队里面对于fpga的了解都是很少的,因为平时我们做的大多是模电,以及硬件方面的,所以很少使用,最多都是用的单片机。。。请问各位老大有没得速成的办法学习fpga啊 ...…

查看全部问答>

简单电机驱动电路设计

本帖最后由 paulhyde 于 2014-9-15 09:24 编辑  …

查看全部问答>

你的STM32平台使用什么系统?

uC/OS-II ?RT-Thread ?FreeRTOS ?其他? 说说为啥?…

查看全部问答>

秀一下以前DIY的一个LED台灯

                                                    ...…

查看全部问答>

RIL 使用USB虚拟串口.

因为COM口的速度比较低.我想用USB口来实现主机与modem的数据传送.这样710Mux还能否继续沿用(作小部分修改的情况下)? 如果不行,需要怎么来构建RIL的虚拟串口 并完成710Mux的功能?…

查看全部问答>

能否交流

怎么解决的,能否交流一下?…

查看全部问答>

inf 是怎样关联到设备的

我将inf文件copy到windows\\inf\\ 插入设备,系统提示找到新硬件,选择自动搜索并安装不成功,但手动指定inf文件安装成功 windows\\inf\\有很多inf文件,系统是怎么搜索到该设备对应的inf的,是不是和inf里面的pid,vid关联? 如果我这个设备没有pid,vi ...…

查看全部问答>

关于错误This header file is only used internally by ATL under the WinCE OS tree

如题:This header file is only used internally by ATL under the WinCE OS tree 如何解决 问题补充:C:\\WINCE600\\OTHERS\\ATL8\\INCLUDE\\altcecrt.h(9) : fatal error C1189: #error :  This header file is only used internal ...…

查看全部问答>