[应用相关] STM32进不了外部中断的一个可能原因

[复制链接]
804|16
 楼主| hehhehee 发表于 2022-3-25 14:43 | 显示全部楼层 |阅读模式
近期在使用一块STM32的板子的时候,用库函数和外部中断来接收霍尔传感器信号,配置了很久,就是进不去外部中断。
 楼主| hehhehee 发表于 2022-3-25 14:44 | 显示全部楼层
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. }
 楼主| hehhehee 发表于 2022-3-25 14:45 | 显示全部楼层
上述初始化代码,咋一看,没发现啥问题,可就是进不了中断。
后来发现是这一语句的问题:

  1. GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7 | GPIO_PinSource8 | GPIO_PinSource9 );
 楼主| hehhehee 发表于 2022-3-25 14:45 | 显示全部楼层
通过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)
 楼主| hehhehee 发表于 2022-3-25 14:46 | 显示全部楼层
这里跟GPIO口的初始化就很大不同了,GPIO口初始化,你可以取或后进行赋值,但是现在:

  1. GPIO_PinSource7 | GPIO_PinSource8 | GPIO_PinSource9 =0x07|0x08|0x09=0x0F
 楼主| hehhehee 发表于 2022-3-25 14:47 | 显示全部楼层
所以,你能还初始化到正确的外部中断吗?!
正确的初始化函数如下:

  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. }
 楼主| hehhehee 发表于 2022-3-25 14:47 | 显示全部楼层
这样初始化就能正常进入外部中断了。
万图 发表于 2023-12-1 08:11 | 显示全部楼层

无法提供开关电源所需的脉冲电流
Uriah 发表于 2023-12-1 09:14 | 显示全部楼层

影响控制IC
帛灿灿 发表于 2023-12-1 11:10 | 显示全部楼层

电源内部都有四个电流环路
Bblythe 发表于 2023-12-1 12:13 | 显示全部楼层

作为电路的共同电位参考点
周半梅 发表于 2023-12-1 14:09 | 显示全部楼层

传送直流信号的引线
Pulitzer 发表于 2023-12-1 15:12 | 显示全部楼层

Buck(或降压)变换器功率部分布局
周半梅 发表于 2023-12-1 16:15 | 显示全部楼层

减小滤波电容的等效串联电阻(ESR)
童雨竹 发表于 2023-12-1 17:08 | 显示全部楼层

MinUnit 是一个 用 C 语言编写的极其简单的单元测试框架
Wordsworth 发表于 2023-12-1 18:11 | 显示全部楼层

功率开关和整流器的交流电流环路包含非常高的PWM开关电源典型的梯形电流波形
Clyde011 发表于 2023-12-1 19:14 | 显示全部楼层

通过电容方式耦合到不同层上邻近的引线上
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

1252

帖子

0

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