#include "power.h" //#include "led.h" //1Hz信号端口及引脚号 #define SIG_1Hz_PORT GPIOB #define SIG_1Hz_PIN GPIO_PIN_2 #define SIG_1Hz_EXTI_PORT EXTI_PORT_GPIOB //KEY1端口及引脚号 #define KEY1_PORT GPIOB #define KEY1_PIN GPIO_PIN_3 #define KEY1_EXTI_PORT EXTI_PORT_GPIOB //KEY2端口及引脚号 #define KEY2_PORT GPIOD #define KEY2_PIN GPIO_PIN_3 #define KEY2_EXTI_PORT EXTI_PORT_GPIOD bool halfsec; //半秒标志 bool key_flag; //按键标志 //初始化电源管理 void power_init(void) { //LED_Init(LED3); //初始化LED //设置1Hz信号脚为输入,开上拉,并开启中断 GPIO_Init(SIG_1Hz_PORT, SIG_1Hz_PIN, GPIO_MODE_IN_PU_IT); //设置1Hz中断为上升下降沿触发 EXTI_SetExtIntSensitivity(SIG_1Hz_EXTI_PORT, EXTI_SENSITIVITY_RISE_FALL); //使能所有中断 enableInterrupts(); } //进入停机模式 void power_halt(void) { //保存端口方向状态 uint8_t DDRa=GPIOA->DDR, DDRb=GPIOB->DDR, DDRc=GPIOC->DDR, DDRd=GPIOD->DDR, DDRe=GPIOE->DDR; //除无关端口外,全部设置为输入 GPIOA->DDR=GPIO_PIN_1|GPIO_PIN_2; //晶振脚设置为输出并拉低,以降低功耗 GPIOB->DDR=0; GPIOC->DDR=GPIO_PIN_5|GPIO_PIN_6; //LED的VCC和GND GPIOD->DDR=00;//GPIO_PIN_2; //LED3 GPIOE->DDR=0; //更改两个按键的端口为下沿中断模式,开启上拉 GPIO_Init(KEY1_PORT, KEY1_PIN, GPIO_MODE_IN_PU_IT); GPIO_Init(KEY2_PORT, KEY2_PIN, GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(KEY1_EXTI_PORT, EXTI_SENSITIVITY_FALL_ONLY); EXTI_SetExtIntSensitivity(KEY2_EXTI_PORT, EXTI_SENSITIVITY_FALL_ONLY); //关灯待机 //LED_Off(LED3); halt(); //LED_On(LED3); //唤醒恢复端口方向(此时自动关闭了后设置的按键中断) GPIOA->DDR=DDRa; GPIOB->DDR=DDRb; GPIOC->DDR=DDRc; GPIOD->DDR=DDRd; GPIOE->DDR=DDRe; } //B端口外部中断 INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4) { //读取半秒状态 halfsec = (bool)GPIO_ReadInputPin(SIG_1Hz_PORT,SIG_1Hz_PIN); //如果按键1为低电位,设置按键标志 if(!(bool)GPIO_ReadInputPin(KEY1_PORT,KEY1_PIN)) { //关闭按键中断,恢复为普遍输入模式 GPIO_Init(KEY1_PORT,KEY1_PIN, GPIO_MODE_IN_FL_NO_IT); //设立按键标志 key_flag=TRUE; } } //D端口外部中断 INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6) { //如果按键2为低电位,设置按键标志 if(!(bool)GPIO_ReadInputPin(KEY2_PORT,KEY2_PIN)) { //关闭按键中断,恢复为普遍输入模式 GPIO_Init(KEY2_PORT,KEY2_PIN, GPIO_MODE_IN_FL_NO_IT); //设立按键标志 key_flag=TRUE; } }