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

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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版