OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8805|回复: 5

STM32F103睡眠模式SLEEP_ON_EXIT模式的困惑

[复制链接]

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2015-11-26
在线时间
27 小时
发表于 2016-9-2 08:15:30 | 显示全部楼层 |阅读模式
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位
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-9-10
在线时间
3 小时
发表于 2016-9-2 08:15:31 | 显示全部楼层
曹乐乐 发表于 2021-3-3 16:56
遇到同样问题:SLEEP-ON-EXIT模式 可以进入,但是外部中断无法正常唤醒。求大神解答

void SLEEP_ON_EXIT ...

问题点找到:只需在触发中断的处理函数中加一句:
SCB->SCR &= (u32)~(u32)SCB_SCR_SLEEPONEXIT;//清除SLEEP-ON-EXIT位
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-9-3 21:00:37 | 显示全部楼层
帮顶
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2015-11-26
在线时间
27 小时
 楼主| 发表于 2016-9-3 22:32:04 | 显示全部楼层
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-9-10
在线时间
3 小时
发表于 2021-3-3 16:56:14 | 显示全部楼层
遇到同样问题:SLEEP-ON-EXIT模式 可以进入,但是外部中断无法正常唤醒。求大神解答

void SLEEP_ON_EXIT(void)
{
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    SCB->SCR &= ~SCB_SCR_SLEEPDEEP;
    SCB->SCR |= SCB_SCR_SLEEPONEXIT;//SLEEP-ON-EXIT模式
    __WFI();
   
}
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2021-6-15
在线时间
31 小时
发表于 2021-6-23 15:13:51 | 显示全部楼层
曹乐乐 发表于 2021-3-4 08:41
问题点找到:只需在触发中断的处理函数中加一句:
SCB->SCR &= (u32)~(u32)SCB_SCR_SLEEPONEXIT;//清除S ...

谢谢,成功了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 21:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表