漫谈LiteOS之开发板-中断(基于GD32450i-EVAL)
2 中断
1 什么是中断?
我们来举个例子,小明在厨房用煤气烧水需要5分钟,主要动作包括接水、打开煤气、等待水开,关闭煤气。在等待水开的过程,快递员来送快递,小明开门签收。在这一系列动作中就是一个中断过程。具体如下;
(1)小明:CPU
(2)烧水:主程序
(3)门铃响:中断信号
(4)开门发现是快递:查询中断号
(5)签收快递:中断处理程序
(6)签收完快递后继续烧水:中断返回
所谓中断就是CPU在执行主程序期间,被某些事件打断,转而处理该事件,处理完后继续执行主程序的过程。
2 为什么要中断?
回顾上面的例子,由于中断机制,小明可以同时处理多个任务,提高了它的并发处理能力,对于计算机也是如此,可以提高CPU的处理效率。当然中断的优点不只如此。
3 中断处理过程
(1)保存现场
(2)执行中断服务程序
(3)从中断服务返回
(4)回复现场
具体如图1所示
图1 中断处理流程图
4 中断的分类
(1)不可屏蔽中断:一旦提出请求,CPU必须无条件响应。
(2)可屏蔽中断:发出请求,CPU可响应可不响应。除了受本身的屏蔽位控制外,还有受一个总的控制,即CPU标志寄存器中的中断允许标志位(IF)的控制,IF位为1,可以得到CPU响应,否则不响应。
5 GD32450i-EVAL的中断/事件控制器(EXTI)
(1)GD32450i-EVAL集成的是Cortex-M4。Cortex-M4集成了嵌套式矢量型中断控制器来实现高效的异常和中断处理。EXTI包括23个相互独立的边沿检测电路并且能向处理器内核产生中断请求或唤醒事件,提供了三种触发类型:上升沿、下降沿、以及任意沿触发,其每一个边沿检测电路都可以独立配置和屏蔽。
(2) Cortex-M4集和嵌套式矢量型中断控制器在处理模式下对所有异常进行优先级区分以及处理。当异常发生时,系统自动将当前处理器工作状态压栈,在执行完中断服务子程序后自动将其出栈。取向量和当前工作态压栈并行进行的,从而提高了中断入口效率。处理器支持咬尾中断,可实现背靠背中断,大大削减了反复切换工作状态带来的开销。
(3)EXTI触发源包括来自I/O管脚的16根线以及内部模块的7根线。通过配置SYSCFG_EXTISSx寄存器,所有的GPIO管脚都可被选为EXTI的触发源。
(4)SysTick校准值设定为25000,SysTick始终频率配置为HCLK/8,此时若HCLK时钟呗配置为200MHz,则SysTick中断会1ms响应一次。
6 中断的初始化过程
(1)使能IO时钟,配置I/O为输入模式
rcu_periph_clock_enable(KEY_CLK[key_num]);
gpio_mode_set(KEY_PORT[key_num], GPIO_MODE_INPUT, GPIO_PUPD_NONE,KEY_PIN[key_num]);
(2)打开syscfg时钟
rcu_periph_clock_enable(RCU_SYSCFG);
(3)设置IO与中断线的映射关系
(4)配置NVIC,使能中断
nvic_irq_enable(KEY_IRQn[key_num], 2U, 0U);
(5)初始化EXIT,选择对应的触发方式
exti_init(KEY_EXTI_LINE[key_num], EXTI_INTERRUPT, EXTI_TRIG_FALLING);
(6)设置中断处理函数
exti_interrupt_flag_clear(KEY_EXTI_LINE[key_num]);
通过以上步骤实现对于按键的中断响应,由于GPIO默认状态下式低电平,按键按下后被拉到高电平,此时系统能够检测到中断判定为按键被按下。当按下Tamper按键的时候,对应的LED点亮,再次按下的时候熄灭(中断实验还有很多的方式可以实现包括串口,按键与LED灯等等,也可以结合多种方式,本实验的方式较为简单),具体的开发板响应如下图所示。回调函数的调用可以看启动文件中的中断向量表。
图2 LED灯熄灭
图3 LED灯点亮
- 点赞
- 收藏
- 关注作者
评论(0)