一、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初始化代码后添加中断优先级设置和中断使能,因为在芯片手册上没有找到外部中断的寄存器设置流程图,也可能是自己还不太会看芯片手册,先接着后面的实验做,后面再回过头来仔细研究。参考 华清远见 FS-MP1A 开发教程 15章 Cortex-M4 外部中断
这篇博客介绍了基于STM32MP157的Cortex-M4外部中断实验,旨在通过K2按键控制LED灯的亮灭。实验步骤包括配置PA0为中断模式,PZ6为GPIO输出,设置中断优先级和使能,以及在中断处理回调函数中根据PA0状态切换LED状态。

1014

被折叠的 条评论
为什么被折叠?



