zoukankan      html  css  js  c++  java
  • STM32的中断系统和外部中断(基于STM32CubeMX开发)

    一 概述
    STM32芯片有16个外部中断源,EXTI0-EXTI15,分别对应着七个中断服务函数,其中有五个EXTI0,EXTI1,EXTI2,EXTI3,EXTI4是专用的,其余为共用。
    EXTI0对应每个端口组的0号引脚,也就是说 EXTI0的连接引脚为PA0-PG0。以此类推,EXTI1、EXTI2、EXTI3、EXTI4分别对应每个端口组的1、2、3、4号引脚。
    而EXTI5-EXTI9为5-9端口共用,而EXTI10-EXTI15为10-15端口共用。具体的表示如图所示:
    在这里插入图片描述
    外部中断触发条件有:上升沿触发,下降沿触发,双边沿触发。注意不能配置成高电平低电平触发。
    二 设计步骤
    基于STM32CubeMX的外部中断设计步骤:
    【1】在STM32CubeMX中指定引脚,配置中断初始化参数。
    选择GPIO引脚的功能,设置中断信号触发条件,使能NVIC对应的中断通道。
    【2】重写该I/O引脚对应的中断回调函数。
    三 具体操作
    例:将PC13引脚设置成外部中断,下降沿触发,在终端服务函数中,翻转PB9引脚的电平信号。

    1. 首先配置时钟和系统选项
      在这里插入图片描述
      在这里插入图片描述

    2. 我采用的是ST-LINKV2仿真器,所以我选用了serial wire串行线路。同时在硬件上要将单片机最小系统的BOOT0和BOOT1都置为0。

    3. 同时如图所示配置中断,输出引脚:在这里插入图片描述

    4. 将引脚参数,中断参数配置完成:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      其余关于STM32CubeMX项目建立等其他操作不再赘述。如图所示:
      在这里插入图片描述
      在这里插入图片描述

    四 代码执行

    1. 在keil工程文件里会发现一个stm32f1xx_it.c文件,里面保存的就是中断的一些代码。
      在main文件里将会看到 MX_GPIO_Init();,里面包含外部中断的初始化。
    void MX_GPIO_Init(void)
    {
    
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOC_CLK_ENABLE();
      __HAL_RCC_GPIOD_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
      __HAL_RCC_GPIOB_CLK_ENABLE();
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
    	//设置PB9为输出
      /*Configure 配置 GPIO pin : PC13 */
      GPIO_InitStruct.Pin = GPIO_PIN_13;
      GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    
      /*Configure 配置 GPIO pin : PB9 */
      GPIO_InitStruct.Pin = GPIO_PIN_9;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
      /* EXTI interrupt init*/
      HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
      HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
    	//中断初始化
    }
    
    1. 接下来我们重写该I/O引脚对应的中断回调函数:
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
    	if(GPIO_Pin==GPIO_PIN_13)
    	{
    		HAL_GPIO_TogglePin(GPIOB ,GPIO_PIN_9);
    	}
    	
    }
    
    

    运行,即可看到效果。
    注:
    本笔记为欧浩源老师STM32课程的一些梳理,对应的视频为:
    https://www.bilibili.com/video/av87017878?p=4

    博客园
  • 相关阅读:
    个人阅读笔记05—数据流图
    JVM(三)程序计数器【PC寄存器】
    JVM(三)运行时数据区的概述,线程概述
    JVM(二)表示两个Class对象是否为同一个类;Java程序对类的使用
    我的面试经之JVM(二)双亲委派机制
    我的面试经之JVM(二) ClassLoader补充【获取类的加载器的方式】
    我的面试经之JVM(二)类加载器的分类
    我的面试经之JVM(二)类加载器子系统ClassLoader类的加载过程
    Python小白要了解的模块大概用途(随学习进度更新),import xxxx
    Python常见的模块(知乎转载)
  • 原文地址:https://www.cnblogs.com/wang-zefeng/p/12860290.html
Copyright © 2011-2022 走看看