打印
[应用相关]

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

[复制链接]
598|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hehhehee|  楼主 | 2022-3-25 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
近期在使用一块STM32的板子的时候,用库函数和外部中断来接收霍尔传感器信号,配置了很久,就是进不去外部中断。

使用特权

评论回复
沙发
hehhehee|  楼主 | 2022-3-25 14:44 | 只看该作者
IO口的初始化函数如下:

void Hall_GPIO_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;  
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

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

        EXTI_InitStructure.EXTI_Line=EXTI_Line7 | EXTI_Line8 | EXTI_Line9;       
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);         
}
/* I/O线中断,中断线为PC7、PC8、PC9 */
void EXTI9_5_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line7) != RESET) //确保是否产生了EXTI Line中断
  {
    EXTI_ClearITPendingBit(EXTI_Line7);     //清除中断标志位
  }
  if(EXTI_GetITStatus(EXTI_Line8) != RESET) //确保是否产生了EXTI Line中断
  {
    EXTI_ClearITPendingBit(EXTI_Line8);     //清除中断标志位
  }
  if(EXTI_GetITStatus(EXTI_Line9) != RESET) //确保是否产生了EXTI Line中断
  {
    EXTI_ClearITPendingBit(EXTI_Line9);     //清除中断标志位
  }       
  LED1=!LED1;//每进一次外部中断,LED1切换一次
}

使用特权

评论回复
板凳
hehhehee|  楼主 | 2022-3-25 14:45 | 只看该作者
上述初始化代码,咋一看,没发现啥问题,可就是进不了中断。
后来发现是这一语句的问题:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7 | GPIO_PinSource8 | GPIO_PinSource9 );

使用特权

评论回复
地板
hehhehee|  楼主 | 2022-3-25 14:45 | 只看该作者
通过GPIO_PinSource的定义,我们可以看到:

#define GPIO_PinSource0            ((uint8_t)0x00)
#define GPIO_PinSource1            ((uint8_t)0x01)
#define GPIO_PinSource2            ((uint8_t)0x02)
#define GPIO_PinSource3            ((uint8_t)0x03)
#define GPIO_PinSource4            ((uint8_t)0x04)
#define GPIO_PinSource5            ((uint8_t)0x05)
#define GPIO_PinSource6            ((uint8_t)0x06)
#define GPIO_PinSource7            ((uint8_t)0x07)
#define GPIO_PinSource8            ((uint8_t)0x08)
#define GPIO_PinSource9            ((uint8_t)0x09)
#define GPIO_PinSource10           ((uint8_t)0x0A)
#define GPIO_PinSource11           ((uint8_t)0x0B)
#define GPIO_PinSource12           ((uint8_t)0x0C)
#define GPIO_PinSource13           ((uint8_t)0x0D)
#define GPIO_PinSource14           ((uint8_t)0x0E)
#define GPIO_PinSource15           ((uint8_t)0x0F)

使用特权

评论回复
5
hehhehee|  楼主 | 2022-3-25 14:46 | 只看该作者
这里跟GPIO口的初始化就很大不同了,GPIO口初始化,你可以取或后进行赋值,但是现在:

GPIO_PinSource7 | GPIO_PinSource8 | GPIO_PinSource9 =0x07|0x08|0x09=0x0F

使用特权

评论回复
6
hehhehee|  楼主 | 2022-3-25 14:47 | 只看该作者
所以,你能还初始化到正确的外部中断吗?!
正确的初始化函数如下:

void Hall_GPIO_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;  
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟
       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //使能HALL所在的外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;        //抢占优先级0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x1;                                        //子优先级0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器       
  /* 配置Hall接口IO */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//HALL信号检测端口
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        //清空中断标志
    EXTI_ClearITPendingBit(EXTI_Line7);     //清除中断标志位
    EXTI_ClearITPendingBit(EXTI_Line8);     //清除中断标志位
    EXTI_ClearITPendingBit(EXTI_Line9);     //清除中断标志位
        //老老实实一行一行来
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7 );
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8 );
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource9 );
   
        EXTI_InitStructure.EXTI_Line=EXTI_Line7 | EXTI_Line8 | EXTI_Line9;       
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);         
}

使用特权

评论回复
7
hehhehee|  楼主 | 2022-3-25 14:47 | 只看该作者
这样初始化就能正常进入外部中断了。

使用特权

评论回复
8
万图| | 2023-12-1 08:11 | 只看该作者

无法提供开关电源所需的脉冲电流

使用特权

评论回复
9
Uriah| | 2023-12-1 09:14 | 只看该作者

影响控制IC

使用特权

评论回复
10
帛灿灿| | 2023-12-1 11:10 | 只看该作者

电源内部都有四个电流环路

使用特权

评论回复
11
Bblythe| | 2023-12-1 12:13 | 只看该作者

作为电路的共同电位参考点

使用特权

评论回复
12
周半梅| | 2023-12-1 14:09 | 只看该作者

传送直流信号的引线

使用特权

评论回复
13
Pulitzer| | 2023-12-1 15:12 | 只看该作者

Buck(或降压)变换器功率部分布局

使用特权

评论回复
14
周半梅| | 2023-12-1 16:15 | 只看该作者

减小滤波电容的等效串联电阻(ESR)

使用特权

评论回复
15
童雨竹| | 2023-12-1 17:08 | 只看该作者

MinUnit 是一个 用 C 语言编写的极其简单的单元测试框架

使用特权

评论回复
16
Wordsworth| | 2023-12-1 18:11 | 只看该作者

功率开关和整流器的交流电流环路包含非常高的PWM开关电源典型的梯形电流波形

使用特权

评论回复
17
Clyde011| | 2023-12-1 19:14 | 只看该作者

通过电容方式耦合到不同层上邻近的引线上

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

81

主题

951

帖子

0

粉丝