打印
[STM32F1]

关于低功耗唤醒,RTC唤醒和和按键中断唤醒不能同时使用

[复制链接]
1023|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
飛饵|  楼主 | 2020-7-19 17:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 飛饵 于 2020-7-19 17:49 编辑

使用STOP模式。RTC闹钟的EXIT线和按键EXTI线配置分封装成两个函数。哪个最后配置就只能用哪个。在最后配置RTC的就没法用按键唤醒,不然就反过来。
按键:
 EXTI_InitTypeDef EXTI_initstructure;
        NVIC_InitTypeDef  NVIC_InitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
        
        /* 按键引脚配置 */
        //按键已经有专门的配置,这里省略
        
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource9);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource12);
        
        
        EXTI_DeInit();         
        EXTI_initstructure.EXTI_Line = EXTI_Line11 | EXTI_Line9 | EXTI_Line10 | EXTI_Line12;
        EXTI_initstructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_initstructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_initstructure.EXTI_LineCmd = ENABLE;
        
        EXTI_Init(&EXTI_initstructure);
        EXTI->EMR &= ~(1 << 11); //先关掉外部中断触发
        EXTI->IMR &= ~(1 << 11);
        EXTI->EMR &= ~(1 << 9);EXTI->EMR &= ~(1 << 10);EXTI->EMR &= ~(1 << 12);
        EXTI->IMR &= ~(1 << 9);EXTI->IMR &= ~(1 << 10);EXTI->IMR &= ~(1 << 12);        
        
        /* NVIC配置 */
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);


RTC闹钟:
 EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        /* 外部中断配置 */
        EXTI_DeInit();
        EXTI_InitStructure.EXTI_Line = EXTI_Line17;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        EXTI->EMR &= ~(1 << 17); //先关掉外部中断触发
        EXTI->IMR &= ~(1 << 17);
        
        
        NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);


使用特权

评论回复
来自 2楼
飛饵|  楼主 | 2020-7-19 21:26 | 只看该作者
还是自己解决了,此贴作为一个经验。配置里多了个 EXTI_DeInit(),如果需要在多处配置的就不要使用这个函数,否则当前的配置会失效。

使用特权

评论回复
板凳
天灵灵地灵灵| | 2020-7-20 23:55 | 只看该作者
喔,那就是后面的设置把前面的壶盖了

使用特权

评论回复
评论
飛饵 2020-7-21 13:50 回复TA
不会覆盖的,看库函数的代码就知道,寄存器都是与或操作的,不影响原来的配置。我是因为调用了 EXTI_DeInit(),会初始化寄存器,所以之前的配置都被初始化了,只有最后一次生效 
地板
heisexingqisi| | 2020-7-21 12:54 | 只看该作者
喔,是不是可以同时设置,只是你的设置顺序覆盖了。

使用特权

评论回复
评论
飛饵 2020-7-21 13:51 回复TA
不是顺序问题,我是因为调用了 EXTI_DeInit(),会初始化寄存器,所以之前的配置都被初始化了,只有最后一次生效 
5
huahuagg| | 2020-7-24 10:38 | 只看该作者
多谢分享,还不会呢,看看。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

117

帖子

1

粉丝