初级会员

- 积分
- 124
- 金钱
- 124
- 注册时间
- 2015-11-26
- 在线时间
- 27 小时
|
1金钱
void exti_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI_Mode_Event;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
MY_NVIC_Init(1,1,EXTI4_IRQn,2);
}
void EXTI4_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line4))
{
EXTI_ClearITPendingBit(EXTI_Line4);
BEEP = !BEEP;
PWR_ClearFlag(PWR_FLAG_SB|PWR_FLAG_WU);
}
}
void SLEEP_ON_EXIT_Init()//SLEEP_ON_EXIT模式
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
exti_init();
NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,DISABLE);
NVIC_SystemLPConfig(NVIC_LP_SLEEPONEXIT,ENABLE);
// SCB->SCR &= ~SCB_SCR_SLEEPDEEP;//设置系统控制寄存器
// SCB->SCR |= SCB_SCR_SLEEPONEXIT;
__WFI(); //在以上条件下执行WFI(等待中断)
}
int main(void)
{
u8 key_num;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_11);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
KEY_Init();
delay_init(); //延时初始化
LED_Init(); //LED初始化
BEEP_Init();
while(1)
{
key_num=KEY_Scan(0);
if(key_num)
{
switch(key_num)
{
case KEY2_EFF:
LED2 = !LED2;
delay_ms(100);
//SLEEP_NOW_Init();
SLEEP_ON_EXIT_Init();
break;
}
}
LED3 = !LED3;//指示系统运行,当进入停止模式后会保持进入之前的状态
delay_ms(100);
}
}
以上是睡眠模式SLEEP_ON_EXIT模式的代码为什么,能进入却不能唤醒呢?另一种模式照着手册撸可以成功,求大神告知,还有就是在SLEEP_ON_EXIT模式下,如果把中断触发方式改为事件触发,同时执行WFE指令,就可以触发和唤醒,可是手册上是在中断触发方式为中断触发执行WFI指令?????最后一个问题,有哪可以说下怎么测量IO口的电流么,具体一点????
|
最佳答案
查看完整内容[请看2#楼]
问题点找到:只需在触发中断的处理函数中加一句:
SCB->SCR &= (u32)~(u32)SCB_SCR_SLEEPONEXIT;//清除SLEEP-ON-EXIT位
|