2)停机模式设置
STM8S单片机有停机模式,在停机模式下,单片机功耗降到最低,所有时钟停止工作,但可以保留RAM和寄存器的值,停机模式只能可以通过下面几种方式退出:
-外部中断(GPIO)
-CAN接收中断
-SPI传输结束
-I2C中断(从地址匹配)
-复位
通过执行HALT指令,也就是执行库函数的halt()函数进入停机模式。
3)设置外部中断
外部中断通过SetExtIntSensitivity函数设置:
void EXTI_SetExtIntSensitivity(EXTI_Port_TypeDef Port, EXTI_Sensitivity_TypeDef SensitivityValue)
其中Port是要设置外部中断的端口,取值有GPIOA、GPIOB、GPIOC、GPIOD,分别对应单片机的PAx、PBx、PCx、PDx端口;
SensitivityValue是外部中断类型,有以下几种取值,分别表示下降沿和低电平触发中断、上升沿触发中断、下降沿触发中断、上升沿和下降沿触发中断:
EXTI_SENSITIVITY_FALL_LOW Interrupt on Falling edge and Low level
EXTI_SENSITIVITY_RISE_ONLY Interrupt on Rising edge only
EXTI_SENSITIVITY_FALL_ONLY Interrupt on Falling edge only
EXTI_SENSITIVITY_RISE_FALL Interrupt on Rising and Falling edges
在这个应用中,按钮按下是产生下降沿,要选取EXTI_SENSITIVITY_FALL_ONLY模式。
设置中断模式后,还需要启用中断,使用enableInterrupts()函数启用。
4)外部中断处理程序
在ST官方提供的STM8S_StdPeriph_Lib库自带的模板中,中断处理程序都在stm8s_it.c中实现。stm8s_it.c中已经根据中断向量设置好了每种中断处理程序的入口函数。只需在相应函数中填入内容即可。
这个应用中是要编写GPIOD端口的外部中断处理函数,所以要在这个中
这个应用中是要编写GPIOD端口的外部中断处理函数,所以要在这个中断处理函数中增加开关机的内容:
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
}
5)整体程序设计和源代码
单片机程序流程图如下,包含主程序main()的流程和stm8s_it.c的外部中断处理程序流程:
具体源代码如下,关键点前面已经介绍,就不再详细说明了:
A)main.c的源代码:
void Delay(uint16_t nCount)//定义延时函数,FFFF大约是0.2s
{
while (nCount != 0)
{
nCount--;
}
}
bool fPowerOn_flag =FALSE;//定义开关机标志
void main(void)
{
GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_IT);
EXTI_SetExtIntSensitivity(EXTI_PORT_POWER_KEY,EXTI_SENSITIVITY_FALL_ONLY);
enableInterrupts();