|
最近在做项目,第一次用PY32F030,调试低功耗进入STOP模式使用按键外部中断唤醒。
发现怎么都唤醒不了,请教论坛大神解答  
代码附下。。。
//进入掉电模式,关闭数码管显示,关闭USB输出,关闭ADC采样,设置上拉口关闭数字输入
void Power_Down(void)
{
uint8_t Txbuffer=0xC0;
BAT_Enable(0);
V12_Enable(0);
Vtim.led_flag = 0;
LED_Enable(0);
Vtim.SOSturn_flag = 0;
Vtim.Dis_Showflag = 0;
LED_OFF();
memset(Discon,0,9);
LED_OFF();
VJumpStarter.idleflag = 0;
HAL_Delay(100);
//配置按键产生外部中断
GPIO_InitTypeDef GPIO_InitStruct={0};
__HAL_RCC_GPIOA_CLK_ENABLE(); /* Enable GPIOA clock */
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; /* GPIO mode set to falling edge interrupt */
GPIO_InitStruct.Pull = GPIO_PULLUP; /* Pull-up */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; /* High-speed */
GPIO_InitStruct.Pin = GPIO_PIN_15;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Enable EXTI interrupt */
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
/* Configure interrupt priority */
HAL_NVIC_SetPriority(EXTI4_15_IRQn, 2, 2);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_15);
__HAL_RCC_GPIOB_CLK_ENABLE(); /* Enable GPIOA clock */
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; /* GPIO mode set to falling edge interrupt */
GPIO_InitStruct.Pull = GPIO_PULLUP; /* Pull-up */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; /* High-speed */
GPIO_InitStruct.Pin = GPIO_PIN_3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* Enable EXTI interrupt */
HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);
/* Configure interrupt priority */
HAL_NVIC_SetPriority(EXTI2_3_IRQn, 2, 2);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET);
IIC_SendData(SYS_CTL9,&Txbuffer,1);
HAL_Delay(100);
// SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));
// SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk));
// PWR_StopModeConfigTypeDef PwrStopModeConf = {0};
__HAL_RCC_PWR_CLK_ENABLE();//PWR时钟使能
__HAL_RCC_SYSCFG_CLK_ENABLE();
/* Suspend Systick interrupt to prevent SysTick interrupt from waking up the system */
HAL_SuspendTick();
// /* VCORE = 1.0V when enter stop mode */
//// PwrStopModeConf.LPVoltSelection = PWR_STOPMOD_LPR_VOLT_SCALE2;
//// PwrStopModeConf.FlashDelay = PWR_WAKEUP_FLASH_DELAY_5US;
//// PwrStopModeConf.WakeUpHsiEnableTime = PWR_WAKEUP_HSIEN_AFTER_MR;
//// PwrStopModeConf.RegulatorSwitchDelay = PWR_WAKEUP_LPR_TO_MR_DELAY_2US;
//// PwrStopModeConf.SramRetentionVolt = PWR_SRAM_RETENTION_VOLT_VOS;
//// HAL_PWR_ConfigStopMode(& wrStopModeConf);
// /* Enter STOP mode */
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
// HAL_PWR_EnterSLEEPMode(PWR_SLEEPENTRY_WFI);
/*系统时钟初始化*/
System_Init();
/*硬件底层驱动初始化*/
Hardware_Init();
/* Resume the SysTick interrupt */
HAL_ResumeTick();
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
Vtim.Dis_Showflag = 1;
VJumpStarter.idleflag = 1;
//恢复按键配置
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_DisableIRQ(EXTI4_15_IRQn);
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_NVIC_DisableIRQ(EXTI2_3_IRQn);
}
void EXTI4_15_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15); /* Handle EXTI interrupt request */
}
void EXTI2_3_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); /* Handle EXTI interrupt request */
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_15)
{
printf("K1唤醒");
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_15);
}
if(GPIO_Pin==GPIO_PIN_3)
{
printf("K2唤醒");
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
}
}
void System_Init(void)
{
HAL_Init();//系统初始化
// OptionByte_Init();//选项字节初始化
// RCC_Init();//选择HSI时钟源,24M经过PLL2倍频到48M系统时钟
APP_SystemClockConfig();
}
void Hardware_Init(void)
{
GPIO_Init();
Key_Init();
Usart1_Init();
Usart2_Init();
Timer3_Init();
Timer16_Init();
ADC_Init();
LED_Init();
IIC_Init();
ip2369_RegInit();
}
|
|