中级会员
 
- 积分
- 291
- 金钱
- 291
- 注册时间
- 2013-11-6
- 在线时间
- 31 小时
|
1金钱
各位大牛好
最近在做stm32f103rct6 低功耗的应用,stm32f103与4G模块串口相连,与云端通信。当没有数据通信时让stm32进入低功耗模式。当云端主动和stm32通信时,4G模块上会响应一个100多ms低电平的信号,该信号接到stm32f103的PA0引脚上。目前程序可以进入睡眠模式,当4G模块给出低电平信号时,mcu可以被唤醒。不过不明白的是,唤醒程序是从main 函数的开始执行的,不应该是在while里面接着执行吗?请问sleep之后main函数的堆栈环境就丢失了吗?其实我想唤醒后能接着跑原来的一些逻辑,这个有办法吗?唤醒一定是从main函数的最开始执行的吗?请了解的大牛帮忙解惑,谢谢!
进入睡眠的函数
void mcuSleepNow(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);//开电源管理时钟PWR_Regulator_LowPower
PWR_WakeUpPinCmd(ENABLE);//使能唤醒引脚,默认PA0
PWR_EnterSTANDBYMode();//进入待机
}
外部中断的配置
void extiGpioInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void extiInit(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
extiGpioInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void)
{
delay_ms(10);
if(WAKE_UP_STATE == 0)
{
sleepFlag = STATE_WAKEUP;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
|
|