qianjin678 2023-04-04 18:43 采纳率: 100%
浏览 30
已结题

在学习中断的时候可能是因为中断服务函数没有写好导致中断无法实现

在学习STM32的外部中断时时根据视频修改代码,目的是通过按键设置的中断改变LED亮灭,因为视频中板子给出的管脚是PE4,使用EXTI4,他说EXTI0-4用的服务函数跟EXTI5-9是不一样的,我改了之后发现我的板子不能实现中断的功能,请问要怎么改。
这个是我写的代码

#include "./BSP/EXTI/exti.h"
#include "./SYSTEM/delay/delay.h"

void exti_init(void)
{
    GPIO_InitTypeDef gpioC_init_struct;//定义结构体
    
    __HAL_RCC_GPIOC_CLK_ENABLE();//使能时钟
    
    gpioC_init_struct.Pin=GPIO_PIN_5;//Pin是管脚
    gpioC_init_struct.Mode=GPIO_MODE_IT_FALLING;//Mode是工作模式,此为推挽
    gpioC_init_struct.Pull=GPIO_PULLUP;//Speed是速度
    
    HAL_GPIO_Init(GPIOC,&gpioC_init_struct);
    //配置工作模式
    HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,0);//EXTI9_5_IRQn是中断号,应该与引脚号相同,2是抢占优先级,0是响应优先级
    
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);


}
void EXTI9_5_IRQHandler(void)//中断服务函数
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);//中断号设置为5
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5);//清除中断
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
        delay_ms(20);
    if(GPIO_Pin==GPIO_PIN_5)
    {
        if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5==0))//检测是否按下键盘
         {
             HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_8);//若是按下键盘则LED PA8取反。
         }
    }
}

下面是主函数

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/EXTI/exti.h"


int main(void)
{
    
    HAL_Init();                         /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    delay_init(72);                     /* 延时初始化 */
    led_init();                         /* LED初始化 */
    while(1)
    { 
      
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);  
    }
}

这是厂家给的代码

#include "./BSP/EXTI/exti.h"
#include "./SYSTEM/delay/delay.h"


void exti_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    __HAL_RCC_GPIOE_CLK_ENABLE();

    gpio_init_struct.Pin = GPIO_PIN_4;
    gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;
    gpio_init_struct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOE, &gpio_init_struct);
    
    HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}

void EXTI4_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    delay_ms(20);
    
    if(GPIO_Pin == GPIO_PIN_4)
    {
        if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==0)
        {
            HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
        }
    }
}

下面是主函数

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/EXTI/exti.h"


int main(void)
{
    HAL_Init();                                 /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);         /* 设置时钟,72M */
    delay_init(72);                             /* 初始化延时函数 */
    led_init();                                 /* 初始化LED */
    exti_init();
    
    while(1)
    {
        LED1(1);                                /* LED1 灭 */
        delay_ms(500);
        LED1(0);                                /* LED1 亮 */
        delay_ms(500);
    }
}
  • 写回答

2条回答 默认 最新

  • 天下第一好ؑ 2023-04-05 15:21
    关注

    别的不知道,第一眼就看到了没调用exti_init,怎么可能跑的通

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月15日
  • 已采纳回答 4月15日
  • 创建了问题 4月4日

悬赏问题

  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥15 pyqt信号槽连接写法
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。