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日

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题