• 【STM32】入门(四):外部中断-按键通过中断动作


    【STM32】STM32单片机总目录

    1、简述

    中断,也叫异常。

    1.1 系统异常

    在源码文件stm32f4xx.h中有定义,F4系列(Cortex-M4)中有8个系统异常

    NonMaskableInt_IRQn         = -14,    /* 不可屏蔽中断,RCC时钟安全系统连接到NMI向量 */
    MemoryManagement_IRQn       = -12,    /* Cortex-M4内存管理中断 */
    BusFault_IRQn               = -11,    /* Cortex-M4总线故障中断,预取指令失败,存储器访问失败  */
    UsageFault_IRQn             = -10,    /* Cortex-M4使用故障中断,未定义的指令或非法状态 */
    SVCall_IRQn                 = -5,     /* 通过SWI指令调用的系统服务 */
    DebugMonitor_IRQn           = -4,     /* Cortex-M4调试监视器中断 */
    PendSV_IRQn                 = -2,     /* Cortex-M4可挂起的系统服务 */
    SysTick_IRQn                = -1,     /* Cortex-M4系统滴答定时器 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.2 外部中断

    本人使用F407,外部中断共有81个,如下,在stm32f4xx.h中有定义:

      WWDG_IRQn                   = 0,      /* 窗口看门狗中断 */
      PVD_IRQn                    = 1,      /* PVD通过EXTI线路检测中断  */
      ...
      DMA1_Stream6_IRQn           = 17,     /*!< DMA1 Stream 6 global Interrupt                                    */
      ADC_IRQn                    = 18,     /*!< ADC1, ADC2 and ADC3 global Interrupts                             */
    #if defined (STM32F40_41xxx)
      CAN1_TX_IRQn                = 19,     /*!< CAN1 TX Interrupt                                                 */
      ...
      FPU_IRQn                    = 81      /*!< FPU global interrupt                                              */
    #endif /* STM32F40_41xxx */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    包括:看门狗、RTC、CAN读写、GPIO、I2C、串口、SPI、DMA、ETH等相关中断
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    1.3 NVIC嵌套向量中断控制器

    NVIC嵌套向量中断控制器,就是集中控制各个中断。使用中断时,先在NVIC中配置,再在各个具体项中配置,等于打开两个阀门。它有16 个可编程优先级

    1.4 外部中断/ 事件控制器 (EXTI)

    EXTI 控制器的主要特性如下:
    ● 每个中断/事件线上都具有独立的触发和屏蔽
    ● 每个中断线都具有专用的状态位
    ● 支持多达 23 个软件事件/中断请求

    EXTI 线0~EXTI 线 15连接在140 个 GPIO上,另外七根 EXTI 线连接方式如下:
    ● EXTI 线 16 连接到 PVD 输出
    ● EXTI 线 17 连接到 RTC 闹钟事件
    ● EXTI 线 18 连接到 USB OTG FS 唤醒事件
    ● EXTI 线 19 连接到以太网唤醒事件
    ● EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
    ● EXTI 线 21 连接到 RTC 入侵和时间戳事件
    ● EXTI 线 22 连接到 RTC 唤醒事件
    在这里插入图片描述

    2、外部中断EXTI

    步骤

    • 设置优先级分组
    • 查询外部中断线
    • 根据中断线查询向量表中中断处理函数名
    • 设置EXTI外部中断:中断线、触发模式、中断/事件选择、使能中断线
    • 设置NVIC嵌套向量中断控制器:中断通道、抢占优先级、子优先级、使能外部中断通道

    2.1 主函数

    int main(void)
    { 
    	u8 t=0;
    	#a)设置系统中断优先级分组为2,固件库函数,不再进一步分析
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    	delay_init();     //延时函数初始化
    	LED_Init();		  //LED初始化
    	#b)初始化外部中断输入
      	EXTIX_Init(); 
    
    	#c)主任务:LED2 1秒闪烁一次提示系统正在运行
    	while(1) {
        	if(t==200) {
    		   LED2=!LED2;
    			 t=0;
    		}
    		t++;
    		delay_ms(5);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.2 EXTIX_Init外部中断初始化

    外部中断初始化:需要配置NVIC嵌套向量中断控制器 和 EXTI外部中断,等于要打开两个“阀门”

    void EXTIX_Init(void)
    {
    	NVIC_InitTypeDef   NVIC_InitStructure;
    	EXTI_InitTypeDef   EXTI_InitStructure;
    	
    	KEY_Init(); //按键对应的IO口初始化
     
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
    	
    	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource6);//PF6 连接到中断线6
    	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource7);//PF7 连接到中断线7
    	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource8);//PF8 连接到中断线8
    	
    	// 配置外部中断线 EXTI_Line6,7,8,9  
    	EXTI_InitStructure.EXTI_Line = EXTI_Line6 | EXTI_Line7 | EXTI_Line8;
      	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断事件
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //下降沿触发
      	EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能
      	EXTI_Init(&EXTI_InitStructure);//配置
     
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //外部中断5-9  刚好 PF6-8 在 EXTI9_5_IRQn 里面
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure);//配置   
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2.3 外部中断/ 事件线

    如下图所示,EXTI_Line0连接着PA0~PI0、EXTI_Line1连接着PA1-PI1…
    所以PF6、PF7、PF8分别在外部中断/ 事件线EXTI_Line6、EXTI_Line7、EXTI_Line8上
    在这里插入图片描述

    2.4 查询中断向量表

    在startup_stm32f40_41xxx.s中

    __Vectors       DCD     __initial_sp               ; Top of Stack
    ...                                           
                    DCD     EXTI9_5_IRQHandler                ; External Line[9:5]s    
    Default_Handler PROC
    ...                                              
                    EXPORT  EXTI9_5_IRQHandler                [WEAK]   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    这三个中断线EXTI_Line6、EXTI_Line7、EXTI_Line8,刚好在 EXTI9_5_IRQn 里面

    2.5 重写中断函数

    void EXTI9_5_IRQHandler(void)
    {
    	delay_ms(10);	//消抖
    	
    	if(KEY0==0)	  //当按键按下后就是IO从高电平变为低电平触发外部中断
    	{
    		EXTI_ClearITPendingBit(EXTI_Line6);  //清除LINE6上的中断标志位  KEY0 对应IO口PF6
    	}		
    
    	if(KEY1==0)	 //当按键按下后就是IO从高电平变为低电平触发外部中断
    	{
    		LED0=0; //LED0亮
    		EXTI_ClearITPendingBit(EXTI_Line7);  //清除LINE7上的中断标志位  KEY1 对应IO口PF7
    	}	
    	
    	if(KEY2==0)	 //当按键按下后就是IO从高电平变为低电平触发外部中断
    	{
    		LED1=0; //LED1亮
    		EXTI_ClearITPendingBit(EXTI_Line8);  //清除LINE8上的中断标志位  KEY2 对应IO口PF8
    	}	
    }	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    虚拟机网络配置
    MindSpore易点通·精讲系列--数据集加载之MindDataset
    【笔记】《CMS全栈项目》系列三:React+TS
    华为防火墙基础自学系列 | Hub Spoke IPsec VdPdNd
    关路灯(区间dp)
    【--知识点整理--】
    《剑指 Offer 》—50. 第一个只出现一次的字符
    pygame的freetype模块
    人类高质量代码—Golang标准库net/rpc
    “开启中文智能之旅:探秘超乎想象的 Llama2-Chinese 大模型世界”
  • 原文地址:https://blog.csdn.net/u010168781/article/details/126111597