}
这个是窗口看门狗喂狗函数,防止看门狗复位。
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!拜拜,新的一年祝大家身体健康、工作顺利!