STM32中断实验
一、前言
紧接上回实验,我们介绍了STM32的串口通信实验,学习了串口协议和RS-232标准,RS232电平与TTL电平的区别,以及"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。这里使用的STM32串口通信都是简单的通信,只需要STM32不断发送Hello Windows而已,接下来我们来介绍利用中断来点亮LED灯、以及可以完成简单交互的串口通信(依然使用USB转接口)。
二、实验要求
- 用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
- 采用串口中断方式重做上周的串口通信作业,分别实现:1)当stm32接收到字符“s”时,停止持续发送“Hello Windows!”; 当接收到字符“t”时,持续发送“Hello Windows!”(提示:采用一个全局标量做信号灯);2)当stm32接收到字符“stop stm32!”时,停止持续发送“Hello Windows!”; 当接收到字符“go stm32!”时,持续发送“Hello Windows!”(提示:要将接收到的连续字符保存到一个字符数组里,进行判别匹配,写一个接收字符串的函数。
三、中断介绍
与51单片机的中断基本相似,只是在51中我们的中断不是那么复杂,相对来说STM32的中断更加复杂。
M32 中断非常强大,每个外设都可以产生中断,所以中断的讲解放在哪一个外设里面去讲都不合适,这里单独抽出一章来做一个总结性的介绍。
中断:把正常正在运行的程序打断,运行中断服务函数,运行完之后再回到主程序。
**外部中断,体现在外设水平,系统异常,体现在内核水平。**中断就是异常,异常就是中断。
中断由NVIC这个外设来控制。(下列会特意说明STM32CuBe怎么设置)
NVIC:嵌套向量中断控制器,属于内核外设,管理着包括部分内核和片上所有外设的中断相关的功能。 两个重要的库文件:core_cm3.h(定义所有内核上面的寄存器,NVIC寄存器就在这里面)和misc.h(相关的函数)。
对于中断而言,最重要的是优先级,由NVIC->IPRx(中断优先级寄存器)设定。
介绍一下抢占优先级、响应优先级的区别:
- 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的;
- 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断;
- 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行;
- 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
所以,有中断的嵌套:
除此之外还要注意:
打断的情况只会与抢占优先级有关, 和响应优先级无关!
一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。
四、CuBe实现中断点灯
用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替,利用杜邦线的连接断开)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
- 核心板为STM32F103C8T6最小核心板,设置PA1端接开关,PB5接LED
- 对于按键电路,设置上拉式按键
- 按键按下,引脚PA1读到低电平;按键释放,引脚PA1读到高电平 LED灯的触发方式
- 按键按下瞬间