文章目录
一、中断开关LED灯
学习stm32中断、DMA通信原理和编程方法。使用stm32tubemx和HAL库分别完成以下编程练习:
用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
1、中断介绍
中断通常被定义为一个事件,该事件能够改变处理器执行指令的顺序。这样的事件与 CPU 芯片内外部硬件电路产生的电信号相对应。
中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。
中断分为同步中断和异步中断。
同步中断——同步中断是当指令执行时由 控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断
异步中断——异步中断是由其他硬件设备依照 CPU 时钟信号随机产生的。
通常我们所说的中断指的是异步中断,我们将同步中断称为异常。(异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的)
应用程序不必关心中断的发生与处理
中断服务程序不必关心应用程序的执行状态
中断是“上层应用”与“底层代码”的“分割边界”
中断的作用
根据中断的定义,我们可以通过中断使处理器转而去优先运行正常控制流之外的代码。
当中断信号达到肘, CPU 必须停止它当前正在做的事情,并且切换到一个另一个活动。为了做到这就要在内核态堆钱保存程序计数器的当前值 (寄存器的内容) ,并把与中断类型相关的地址放进程序计数量。
中断处理是指CPU响应中断,转入中断处理程序,系统开始处理中断。
中断响应是指CPU收到中断请求后转向相应的事件处理程序。
开中断后,系统就可以响应其他的中断了,关中断后,系统不响应其他的中断除非优先级高的中断。
中断屏蔽是指在中断请求产生后,系统用软件方式有选择地封锁部分中断而允许其余部分中断仍能得到响应。
中断的类型及优先级
中断的类型
硬中断:通过处理器中断信号线产生的中断
软中断:通过非法指令或特殊指令触发的中断
中断优先级
多个中断同时出现时,处理器先响应高优先级的中断
低优先级中断的ISR执行时,可以被高优先级中断再次打断
ISR比App Code拥有更高的执行优先级
2、电路连接
GPIO默认是3.3V高电平,当按下按键,GPIO变为低电平,此过程是下降沿。松开按键,GPIO又变为高电平,此过程为上升沿。因为设置的是上升沿中断,也就是松开按键的时候,灯会变化。
LED引脚配置,默认设为高电平,处于熄灭状态。
由于手头没有开关,我直接用杜邦线替代
LED长脚——3V3
LED短脚——PB5
PA1——3V3——亮灯
PA1——GND——熄灯
3、建HAL库
点击新建工程,然后选择需要的芯片,选择具体的芯片信息,然后点击start。
配置SYS、RRC
进行引脚的设置。设置PA5为输出模式GPIO_Output,用来指示LED灯;设置PB5为外部中断,与外部中断线EXIT5连接GPIO_EXIT5,设置PB5的触发方式为上升沿触发。
可以将PA1的User Label设置为LED,PB1的User Label设置为SWITCH,这样方便自己知道引脚的功能。
配置中断优先级,这里使用中断编号设置的默认中断优先级
时钟设置
设置项目名称、路径等,勾选下图的选项,然后点击创建项目。
4、编写代码
在keil文件中的gpio.c文件中可以找到中断服务函数
void HAL_GPIO_EXIT_IRQHandler(unit16_t GPIO_Pin)
当捕获到上升沿时,触发中断,就会进入该函数执行HAL_GPIO_EXIT_Callback(GPIO_Pin) 函数,找到该函数可以发现其为虚函数,需要自行编写。
在主函数中编写该函数,代码如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == SWITCH_Pin)//判断外部中断源
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);//翻转LED状态
}
}
编译运行
5、烧录输出
中断LED灯
二、串口中断
采用串口中断方式重做上周的串口通信作业,分别实现:
(1)当stm32接收到字符“s”时,停止持续发送“hello windows!”; 当接收到字符“t”时,持续发送“hello windows!”(提示:采用一个全局标量做信号灯);
(2)当stm32接收到字符“stop stm32!”时,停止持续发送“hello windows!”; 当接收到字符“go stm32!”时,持续发送“hello windows!”(提示:要将接收到的连续字符保存到一个字符数组里,进行判别匹配。写一个接收字符串的函数。
1、电路连接
USB转TTL与C8T6相连
实际连接如下,注意boot1接跳线帽到10
2、建HAL库
点击新建工程,然后选择需要的芯片,选择具体的芯片信息,然后点击start。
配置SYS、RRC
配置USART
设置NVIC
设置时钟
设置项目名称、路径等,勾选下图的选项,然后点击创建项目。
3、编写代码
(1)在keil中编写代码
main.c文件里的全部代码
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include <string.h>
void SystemClock_Config(void);
char c