一、Cortex-M4外部中断
实验目的
基于STM32MP57A,使用STM32 CubeIDE软件工具完成开发板上K2按键外部中断的方式控制版上LED灯亮灭操作
二、实验步骤
1.实验原理
按键K2
LED灯
LED灯的GPIO接口
2.实验步骤
外部中断配置步骤:
设置PA0为外部中断模式,PZ6为GPIO输出模式
IDE会生成GPIO的Init初始化程序以及HAL库
在GPIO-PA0管脚初始化后,增加中断优先级设置HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)和中断使能HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
EXTI0_IRQHandler(启动文件startup_stm32mp15xx.s)中设置中断处理的管脚HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0)
main函数中需要定义中断处理的回调函数void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)判断管脚PA0的状态来做LED的状态变化操作,这个函数是在按键中断触发后调用HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0)中调用回调函数实现LED控制。
部分代码如下:
1. 中断触发后入口函数
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); //在这里添加中断的处理函数
}
2. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0)调用HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin)
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)//IDE提供的库函数
{
/* EXTI line interrupt detected */
if (__HAL_GPIO_EXTI_GET_RISING_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_Pin);
HAL_GPIO_EXTI_Rising_Callback(GPIO_Pin);
}
if (__HAL_GPIO_EXTI_GET_FALLING_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_Pin);
HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin);
}
}
3. main中的触发方式回调函数
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
delay_my(100);/* delay to anti-shake */
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)/* read PA0 state */
{
HAL_GPIO_TogglePin(GPIOZ,GPIO_PIN_6);
}
}
}
//延时函数
void delay_my(uint8_t time)
{ int i, j;
for(i=0; i《time*10; i++)
{
for(j=0; j《time; j++)
{}
}
}
总结
还有很多没弄清楚的地方,比如为什么在PA0初始化代码后添加中断优先级设置和中断使能,因为在芯片手册上没有找到外部中断的寄存器设置流程图,也可能是自己还不太会看芯片手册,先接着后面的实验做,后面再回过头来仔细研究。
一、Cortex-M4外部中断
实验目的
基于STM32MP57A,使用STM32 CubeIDE软件工具完成开发板上K2按键外部中断的方式控制版上LED灯亮灭操作
二、实验步骤
1.实验原理
按键K2
LED灯
LED灯的GPIO接口
2.实验步骤
外部中断配置步骤:
设置PA0为外部中断模式,PZ6为GPIO输出模式
IDE会生成GPIO的Init初始化程序以及HAL库
在GPIO-PA0管脚初始化后,增加中断优先级设置HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)和中断使能HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
EXTI0_IRQHandler(启动文件startup_stm32mp15xx.s)中设置中断处理的管脚HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0)
main函数中需要定义中断处理的回调函数void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)判断管脚PA0的状态来做LED的状态变化操作,这个函数是在按键中断触发后调用HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0)中调用回调函数实现LED控制。
部分代码如下:
1. 中断触发后入口函数
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); //在这里添加中断的处理函数
}
2. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0)调用HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin)
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)//IDE提供的库函数
{
/* EXTI line interrupt detected */
if (__HAL_GPIO_EXTI_GET_RISING_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_Pin);
HAL_GPIO_EXTI_Rising_Callback(GPIO_Pin);
}
if (__HAL_GPIO_EXTI_GET_FALLING_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_Pin);
HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin);
}
}
3. main中的触发方式回调函数
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
delay_my(100);/* delay to anti-shake */
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)/* read PA0 state */
{
HAL_GPIO_TogglePin(GPIOZ,GPIO_PIN_6);
}
}
}
//延时函数
void delay_my(uint8_t time)
{ int i, j;
for(i=0; i《time*10; i++)
{
for(j=0; j《time; j++)
{}
}
}
总结
还有很多没弄清楚的地方,比如为什么在PA0初始化代码后添加中断优先级设置和中断使能,因为在芯片手册上没有找到外部中断的寄存器设置流程图,也可能是自己还不太会看芯片手册,先接着后面的实验做,后面再回过头来仔细研究。
举报