在這個應用中,需要把PD4設置為帶上拉(因為按鈕未按下時要呈高電平)、有中斷的輸入模式。開機時,PD3要設置為低電平的輸出模式(低電平才能讓Q1導通)。關機時PD3要設置為不帶上拉的輸入模式,所以這部分代碼要這樣寫:
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_IT); //PD4設置為帶上拉、有中斷的輸入模式
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST); //開機時把PD3設置低電平的輸入模
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);//關機時把PD3設置低電平的輸入模式
額外提一下,除了GPIO_Init函數可以設置引腳是輸出高電平還是低電平,還可以用下面四個函數繼續(xù)引腳的高低電平:
void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal) //輸出PortVal指定的電平
void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //輸出高電平
void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //輸出低電平
void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //高低電平翻轉一次
2)停機模式設置
STM8S單片機有停機模式,在停機模式下,單片機功耗降到最低,所有時鐘停止工作,但可以保留RAM和寄存器的值,停機模式只能可以通過下面幾種方式退出:
-外部中斷(GPIO)
-CAN接收中斷
-SPI傳輸結束
-I2C中斷(從地址匹配)
-復位
通過執(zhí)行HALT指令,也就是執(zhí)行庫函數的halt()函數進入停機模式。
3)設置外部中斷
外部中斷通過SetExtIntSensitivity函數設置:
void EXTI_SetExtIntSensitivity(EXTI_Port_TypeDef Port, EXTI_Sensitivity_TypeDef SensitivityValue)
其中Port是要設置外部中斷的端口,取值有GPIOA、GPIOB、GPIOC、GPIOD,分別對應單片機的PAx、PBx、PCx、PDx端口;
SensitivityValue是外部中斷類型,有以下幾種取值,分別表示下降沿和低電平觸發(fā)中斷、上升沿觸發(fā)中斷、下降沿觸發(fā)中斷、上升沿和下降沿觸發(fā)中斷:
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中實現(xiàn)。stm8s_it.c中已經根據中斷向量設置好了每種中斷處理程序的入口函數。只需在相應函數中填入內容即可。
這個應用中是要編寫GPIOD端口的外部中斷處理函數,所以要在這個中斷處理函數中增加開關機的內容:
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
}
5)整體程序設計和源代碼
單片機程序流程圖如下,包含主程序main()的流程和stm8s_it.c的外部中斷處理程序流程:
具體源代碼如下,關鍵點前面已經介紹,就不再詳細說明了:
A)main.c的源代碼:
void Delay(uint16_t nCount)//定義延時函數,F(xiàn)FFF大約是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();
while (1)
{
if(fPowerOn_flag == FALSE)
{
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);//PD3腳設置為輸入模式,Q1截止
halt();//進入停機模式
}else
{
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);//PD3腳設置為輸出模式且為低電平,Q1導通
///////
//插入用戶自定義的代碼
//////
}
}
}
B)stm8s_it.c的源代碼:
void Delay(uint16_t nCount); //Delay函數在main.c中定義
extern bool fPowerOn_flag; //fPowerOn_flag在main.c中定義,所以這里要聲明成外部變量
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
Delay(6000); //延時消抖
if(!GPIO_ReadInputPin(GPIOD, GPIO_PIN_3))//判斷是不是按鈕被按下
{
評論
查看更多