OpenEdv-开源电子网

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

STM32进入stop模式后使用两个EXTI做为外部唤醒出错

[复制链接]

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2015-4-29
在线时间
38 小时
发表于 2021-7-22 12:10:09 | 显示全部楼层 |阅读模式
10金钱
最近做个低功耗的项目,单片机进入到stop模式下后使用PA0和PC13分别作为外部EXTI中断唤醒,只要PA0和PC13有任何的上升或者下降沿都会触发中断,现在的问题是初次触发唤醒都没有问题,到第二次触发唤醒的时候就无法唤醒了,请问是否外部唤醒中断是否只能有一个外部中断?如果任何外部中断都可以唤醒,那需要注意什么呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2020-8-19
在线时间
335 小时
发表于 2021-7-22 12:18:05 | 显示全部楼层
这个理论上是可以多个的,看看外部中断线是不是中断模式,在NVIC中必须使能相应的外部中断向量
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2015-4-29
在线时间
38 小时
 楼主| 发表于 2021-7-22 13:08:47 | 显示全部楼层
bin133 发表于 2021-7-22 12:18
这个理论上是可以多个的,看看外部中断线是不是中断模式,在NVIC中必须使能相应的外部中断向量

感谢关注,外部中断线是中断模式,在NVIC中也使能了相应的外部中断向量,而且首次唤醒是没有问题的
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2015-4-29
在线时间
38 小时
 楼主| 发表于 2021-7-22 13:13:39 | 显示全部楼层
本帖最后由 Sunny^o^ 于 2021-7-22 13:19 编辑
  1. 附中断配置代码:

  2. void WKUP_Init(void)
  3. {
  4.         GPIO_InitTypeDef  GPIO_InitStructure;
  5.         EXTI_InitTypeDef   EXTI_InitStructure;
  6.         NVIC_InitTypeDef   NVIC_InitStructure;
  7.         
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
  10.         
  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                 //LED0-->PB.5 端口配置
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                  //推挽输出
  13.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  14.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  15.         /* Connect EXTI0 Line to PA0 pin */
  16.         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

  17.         /* Configure EXTI0 line */
  18.         EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  19.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  20.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
  21.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  22.         EXTI_Init(&EXTI_InitStructure);
  23.         
  24.         NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断13
  25.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
  26.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;//子优先级2
  27.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  28.   NVIC_Init(&NVIC_InitStructure);//配置NVIC
  29. }




  30. void WKUP_2_Init(void)
  31. {         
  32.         GPIO_InitTypeDef  GPIO_InitStructure;
  33.         NVIC_InitTypeDef   NVIC_InitStructure;
  34.         EXTI_InitTypeDef   EXTI_InitStructure;
  35.         
  36.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);//使能GPIOA时钟
  37.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
  38.         
  39.         
  40.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                                 //LED0-->PB.5 端口配置
  41.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                  //推挽输出
  42.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  43.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;                 //IO口速度为50MHz
  44.         GPIO_Init(GPIOC, &GPIO_InitStructure);               
  45.         
  46.         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);//PC13 连接到中断线13
  47.         
  48.   EXTI_InitStructure.EXTI_Line = EXTI_Line13;//LINE0
  49.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  50.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //上升沿触发 ,因为74HC393需要下降沿很慢
  51.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0
  52.   EXTI_Init(&EXTI_InitStructure);//配置
  53.         
  54.         
  55.   NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//外部中断13
  56.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
  57.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;//子优先级2
  58.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  59.   NVIC_Init(&NVIC_InitStructure);//配置NVIC
  60.         
  61. }


复制代码


void EXTI0_IRQHandler(void)
{
        To_Exit_Stop();//退出待机模式


        /********************************/
        EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位
}


void EXTI15_10_IRQHandler(void)//按键唤醒
{         
        To_Exit_Stop();//退出待机模式
      

        /********************************/        
        EXTI_ClearITPendingBit(EXTI_Line13); // 清除LINE10上的中断标志位
}
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4731
金钱
4731
注册时间
2015-1-10
在线时间
591 小时
发表于 2021-7-22 15:21:49 | 显示全部楼层
DBGMCU_Config(DBGMCU_STOP, ENABLE);
debug试试,看看第二次有没有触发中断,没有的话就是唤醒到进STOP模式这段有问题,这段的配置和上电到STOP模式的配置不一样了
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2015-4-29
在线时间
38 小时
 楼主| 发表于 2021-7-22 18:16:41 | 显示全部楼层
阿侑kevin 发表于 2021-7-22 15:21
DBGMCU_Config(DBGMCU_STOP, ENABLE);
debug试试,看看第二次有没有触发中断,没有的话就是唤醒到进STOP模 ...

目前的情况是我屏蔽掉PA0的中断,测试PC13的中断唤醒没有问题,屏蔽掉PC13中断,测试PA0的中断没有问题,也就是只要屏蔽掉其中任意一个中断都没有问题,假如说从唤醒到进入stop这段程序有问题,那随便一个中断都应该是有问题的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 08:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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