为什么80%的码农都做不了架构师?>>>
折腾了一天,静下来把整个过程理理。
本次软件运行ARM-Context3架构STM32F103XXX
项目需求:系统在某个条件下进入省电模式,可以通过外部信号唤醒:一、外部震动传感器,一、串口
当前也有省电模式,但直接进入了待机省电模式,在该模式下只能通过震动传感器唤醒,无法通过串口唤醒。要同时满足震动传感器以及串口唤醒,在现有方案上有两种方式:
-、将串口的发送信号(ARM的接收)通过电子开关接到外部震动传感器的输入端
-、省电模式改成串口可唤醒的停机模式
第一种方式硬件改动比较大,第二种方式则只需要修改软件。决定:升级软件
停机模式(STOP)
有两种方式进入STOP,-、中断唤醒方式 -、事件唤醒方式,根据需求采用方式一
退出STOP时直接从进入STOP的下一条指令开始运行,SRAM中的数据保留
进入STOP
首先需要设置好外部中断,这里有两个外部中断,代码如下:
EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10);
//PA0配置
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级 为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//PA10配置
EXTI_InitStructure.EXTI_Line = EXTI_Line10;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//外部中断0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级 为2
NVIC_Init(&NVIC_InitStructure);
中断初始化完成后,就需要完成中断服务程序,如下:
void EXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0) != RESET){
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_ClearFlag(EXTI_Line0);
}
}
//中断服务程序中似乎什么也没做,但EXTI_GetITStatus这几个接口必须有,否则无法唤醒
完成这些后就可以进入STOP了
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);至于唤醒后该如何做,是要重新初始化还是干脆重新启动这就由设计人员自行决定了