在学习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);
}
}