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

[复制链接]
1205|6
 楼主| 飛饵 发表于 2020-7-19 17:46 | 显示全部楼层 |阅读模式
本帖最后由 飛饵 于 2020-7-19 17:49 编辑

使用STOP模式。RTC闹钟的EXIT线和按键EXTI线配置分封装成两个函数。哪个最后配置就只能用哪个。在最后配置RTC的就没法用按键唤醒,不然就反过来。
按键:
  1. EXTI_InitTypeDef EXTI_initstructure;
  2.         NVIC_InitTypeDef  NVIC_InitStructure;
  3.         
  4.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  6.         
  7.         /* 按键引脚配置 */
  8.         //按键已经有专门的配置,这里省略
  9.         
  10.         
  11.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource9);
  12.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);
  13.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10);
  14.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource12);
  15.         
  16.         
  17.         EXTI_DeInit();         
  18.         EXTI_initstructure.EXTI_Line = EXTI_Line11 | EXTI_Line9 | EXTI_Line10 | EXTI_Line12;
  19.         EXTI_initstructure.EXTI_Mode = EXTI_Mode_Interrupt;
  20.         EXTI_initstructure.EXTI_Trigger = EXTI_Trigger_Rising;
  21.         EXTI_initstructure.EXTI_LineCmd = ENABLE;
  22.         
  23.         EXTI_Init(&EXTI_initstructure);
  24.         EXTI->EMR &= ~(1 << 11); //先关掉外部中断触发
  25.         EXTI->IMR &= ~(1 << 11);
  26.         EXTI->EMR &= ~(1 << 9);EXTI->EMR &= ~(1 << 10);EXTI->EMR &= ~(1 << 12);
  27.         EXTI->IMR &= ~(1 << 9);EXTI->IMR &= ~(1 << 10);EXTI->IMR &= ~(1 << 12);        
  28.         
  29.         /* NVIC配置 */
  30.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  31.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  32.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  33.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  34.         NVIC_Init(&NVIC_InitStructure);
  35.         
  36.         NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  37.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  38.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  39.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  40.         NVIC_Init(&NVIC_InitStructure);


RTC闹钟:
  1. EXTI_InitTypeDef EXTI_InitStructure;
  2.         NVIC_InitTypeDef NVIC_InitStructure;
  3.         
  4.         /* 外部中断配置 */
  5.         EXTI_DeInit();
  6.         EXTI_InitStructure.EXTI_Line = EXTI_Line17;
  7.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  8.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  9.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  10.         EXTI_Init(&EXTI_InitStructure);
  11.         EXTI->EMR &= ~(1 << 17); //先关掉外部中断触发
  12.         EXTI->IMR &= ~(1 << 17);
  13.         
  14.         
  15.         NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
  16.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  17.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  18.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  19.         NVIC_Init(&NVIC_InitStructure);


 楼主| 飛饵 发表于 2020-7-19 21:26 | 显示全部楼层
还是自己解决了,此贴作为一个经验。配置里多了个 EXTI_DeInit(),如果需要在多处配置的就不要使用这个函数,否则当前的配置会失效。
天灵灵地灵灵 发表于 2020-7-20 23:55 | 显示全部楼层
喔,那就是后面的设置把前面的壶盖了

评论

不会覆盖的,看库函数的代码就知道,寄存器都是与或操作的,不影响原来的配置。我是因为调用了 EXTI_DeInit(),会初始化寄存器,所以之前的配置都被初始化了,只有最后一次生效  发表于 2020-7-21 13:50
heisexingqisi 发表于 2020-7-21 12:54 | 显示全部楼层
喔,是不是可以同时设置,只是你的设置顺序覆盖了。

评论

不是顺序问题,我是因为调用了 EXTI_DeInit(),会初始化寄存器,所以之前的配置都被初始化了,只有最后一次生效  发表于 2020-7-21 13:51
huahuagg 发表于 2020-7-24 10:38 | 显示全部楼层
多谢分享,还不会呢,看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

117

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部