你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32进不了外部中断的一个可能原因

[复制链接]
STMCU 发布时间:2020-9-30 09:35

近期在使用一块STM32的板子的时候,用库函数和外部中断来接收霍尔传感器信号,配置了很久,就是进不去外部中断。

IO口的初始化函数如下:


  1. void Hall_GPIO_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;  
  4.         EXTI_InitTypeDef EXTI_InitStructure;
  5.         NVIC_InitTypeDef NVIC_InitStructure;

  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟
  8.        
  9.         NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //使能HALL所在的外部中断通道
  10.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;        //抢占优先级0
  11.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x1;                                        //子优先级0
  12.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  13.         NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器       
  14.   /* 配置Hall接口IO */
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//HALL信号检测端口
  16.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  19.         //清空中断标志
  20.     EXTI_ClearITPendingBit(EXTI_Line7);     //清除中断标志位
  21.     EXTI_ClearITPendingBit(EXTI_Line8);     //清除中断标志位
  22.     EXTI_ClearITPendingBit(EXTI_Line9);     //清除中断标志位
  23.        
  24.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7 | GPIO_PinSource8 | GPIO_PinSource9 );

  25.         EXTI_InitStructure.EXTI_Line=EXTI_Line7 | EXTI_Line8 | EXTI_Line9;       
  26.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
  27.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  28.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  29.         EXTI_Init(&EXTI_InitStructure);         
  30. }
  31. /* I/O线中断,中断线为PC7、PC8、PC9 */
  32. void EXTI9_5_IRQHandler(void)
  33. {
  34.   if(EXTI_GetITStatus(EXTI_Line7) != RESET) //确保是否产生了EXTI Line中断
  35.   {
  36.     EXTI_ClearITPendingBit(EXTI_Line7);     //清除中断标志位
  37.   }
  38.   if(EXTI_GetITStatus(EXTI_Line8) != RESET) //确保是否产生了EXTI Line中断
  39.   {
  40.     EXTI_ClearITPendingBit(EXTI_Line8);     //清除中断标志位
  41.   }
  42.   if(EXTI_GetITStatus(EXTI_Line9) != RESET) //确保是否产生了EXTI Line中断
  43.   {
  44.     EXTI_ClearITPendingBit(EXTI_Line9);     //清除中断标志位
  45.   }       
  46.   LED1=!LED1;//每进一次外部中断,LED1切换一次
  47. }
复制代码


上述初始化代码,咋一看,没发现啥问题,可就是进不了中断。
后来发现是这一语句的问题:


  1. GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7 | GPIO_PinSource8 | GPIO_PinSource9 );
复制代码

通过GPIO_PinSource的定义,我们可以看到:


  1. #define GPIO_PinSource0            ((uint8_t)0x00)
  2. #define GPIO_PinSource1            ((uint8_t)0x01)
  3. #define GPIO_PinSource2            ((uint8_t)0x02)
  4. #define GPIO_PinSource3            ((uint8_t)0x03)
  5. #define GPIO_PinSource4            ((uint8_t)0x04)
  6. #define GPIO_PinSource5            ((uint8_t)0x05)
  7. #define GPIO_PinSource6            ((uint8_t)0x06)
  8. #define GPIO_PinSource7            ((uint8_t)0x07)
  9. #define GPIO_PinSource8            ((uint8_t)0x08)
  10. #define GPIO_PinSource9            ((uint8_t)0x09)
  11. #define GPIO_PinSource10           ((uint8_t)0x0A)
  12. #define GPIO_PinSource11           ((uint8_t)0x0B)
  13. #define GPIO_PinSource12           ((uint8_t)0x0C)
  14. #define GPIO_PinSource13           ((uint8_t)0x0D)
  15. #define GPIO_PinSource14           ((uint8_t)0x0E)
  16. #define GPIO_PinSource15           ((uint8_t)0x0F)
复制代码

这里跟GPIO口的初始化就很大不同了,GPIO口初始化,你可以取或后进行赋值,但是现在:


  1. GPIO_PinSource7 | GPIO_PinSource8 | GPIO_PinSource9 =0x07|0x08|0x09=0x0F
复制代码

所以,你能还初始化到正确的外部中断吗?!
正确的初始化函数如下:


  1. void Hall_GPIO_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;  
  4.         EXTI_InitTypeDef EXTI_InitStructure;
  5.         NVIC_InitTypeDef NVIC_InitStructure;

  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟
  8.        
  9.         NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //使能HALL所在的外部中断通道
  10.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;        //抢占优先级0
  11.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x1;                                        //子优先级0
  12.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  13.         NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器       
  14.   /* 配置Hall接口IO */
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//HALL信号检测端口
  16.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  19.         //清空中断标志
  20.     EXTI_ClearITPendingBit(EXTI_Line7);     //清除中断标志位
  21.     EXTI_ClearITPendingBit(EXTI_Line8);     //清除中断标志位
  22.     EXTI_ClearITPendingBit(EXTI_Line9);     //清除中断标志位
  23.         //老老实实一行一行来
  24.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7 );
  25.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8 );
  26.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource9 );
  27.    
  28.         EXTI_InitStructure.EXTI_Line=EXTI_Line7 | EXTI_Line8 | EXTI_Line9;       
  29.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
  30.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  31.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  32.         EXTI_Init(&EXTI_InitStructure);         
  33. }
复制代码

这样初始化就能正常进入外部中断了。


收藏 评论0 发布时间:2020-9-30 09:35

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版