当前位置: 代码迷 >> 综合 >> STM32CubeIDE EXTI实验
  详细解决方案

STM32CubeIDE EXTI实验

热度:59   发布时间:2023-12-08 12:37:23.0

目录

一、首先给作为外部中断的引脚进行配置:

注: 事件中断  和  外部中断 的差别:

二、配置NVIC

三、添加控制逻辑

四、结果


一、首先给作为外部中断的引脚进行配置:

引脚功能配置为 GPIO_EXTIx

对应的引脚属性配置如下:

引脚的模式《GPIO mode》我们配置为 外部中断上升沿触发  

但是可以看到,它还有其他五种模式。六种模式意思对应如下:

  • 上升沿触发的外部中断
  • 下降沿触发的外部中断
  • 上升/下降沿触发的外部中断
  • 上升沿触发的事件中断
  • 下降沿触发的事件中断
  • 上升/下降沿触发的事件中断

注: 事件中断  和  外部中断 的差别:

从外部激励信号来看,中断和事件的产生源都可以是一样的.之所以分成2个部分,由于外部中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;

但是事件中断,是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好, 比如引起DMA操作,AD转换等;

简单举例:外部I/O触发AD转换,来测量外部物品的重量;如果使用传统的中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;要是使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果;相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务了。

二、配置NVIC

图中标记地方记得勾选。

然后生成代码。

三、添加控制逻辑

在 main.c中添加以下代码:

/* USER CODE BEGIN 4 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == KEY_ON){LED1_TOGGLE;} else if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == KEY_ON){//return KEY_OFF;DBGPRINTF("LED2\n");}}/* USER CODE END 4 */

四、结果

按下KEY2可以收到打印信息

按下KEY1可以控制LED的亮灭: