STM32的中断和DMA通信

一、STM32之中断

1.什么是中断

(1)引言

  • 在介绍中断之前,我们首先来了解四种数据传输方式——无条件传输、查询方式、中断方式、直接存储器访问
方式名称基本概念
无条件传输处理器不必了解外部设备状态,直接进行数据传输,用于指示灯和按键等简单设备
查询方式传输前,一方先查询另一方的状态,若已经准备好就传输,否则就继续查询
中断方式一方通过申请中断的方式与另一方进行数据传输,收发双方可以并行工作
直接存储器访问处理器内部建立片内外设和内存之间的数据传输通道,传输过程中不需要处理器参与

(2)中断的全过程

中断可以分为三个阶段——中断发生、中断处理、中断返回

  • 中断发生:当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理
  • 中断处理:CPU暂停当前的工作,转去处理事件B
  • 当CPU将事件B处理完毕后,再回到事件A种被暂停的地方继续处理事件A
    在这里插入图片描述

2.中断的意义

中断主要有以下四个优点:

  • 速度匹配
  • 分时操作
  • 实时响应
  • 可靠性高

以上四个优点体现了中断的意义——解决了快速CPU和慢速外部设备之间的传送数据的矛盾;使得CPU可以分时为多个外部设备服务,从而提高了计算机的利用率;使得CPU能够及时处理应用系统的随机事件,增强系统的实时性;使得CPU可以处理设备故障及掉电等突发事件,提高系统可靠性

3.实例(1)—— 点灯

下面使用stm32CubeMX和HAL库来实现中断控制点灯

(1)生成指定工程文件

  • 首先打开STM32CubeMX,新建一个工程,选择芯片型号,这里我根据我的选择STM32F103C8
    在这里插入图片描述
  • 进入RCC界面,在HSE中选择Crystal…
    在这里插入图片描述
  • 进入SYS界面,在Debug中选择Serial Wire
    在这里插入图片描述
  • 在右边芯片处,点击PA5端口设置为输出端口(GPIO_Output),点击PB5端口设置为按键端口(GPIO_EXTI5)
    在这里插入图片描述
  • 进入GPIO界面,将按键接口PB5设置成Pull-down(上升沿触发)
    在这里插入图片描述
  • 进入NVIC界面,勾选Enabled,使能中断口
    在这里插入图片描述
  • 进入Clock Configuration界面,将时钟修改至如图所示 在这里插入图片描述
  • 进入Project Manager界面,给工程命名,并选择对应的IDE型号
    在这里插入图片描述
  • 点击Generate Code,生成工程文件在这里插入图片描述

(2)添加中断代码

  • 打开刚才创建的工程文件夹,进入MDK-ARM文件夹,点击打开新创建的项目工程
    在这里插入图片描述
  • 进入界面按照图示步骤找到main.c函数,并且在对应位置加入中断代码(注意:选中的部分可能需要修改,修改成自己命名的管脚名称)
    在这里插入图片描述

代码:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
		for(long i = 1;i<72000;i++){}; 
		if(HAL_GPIO_ReadPin(LED_click_GPIO_Port,LED_click_Pin)==1)
		{
			HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
		}
	__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
}

(3)生成.hex烧录文件

  • 点击魔法棒,进入Output界面,勾选Create HEX File,如果要修改存放位置可以点击Select Folder…进行进一步操作,完成后点击OK
    在这里插入图片描述
  • 点击左上角Rebuild按钮,进行编译
    在这里插入图片描述
  • 0 Error 0 Warming
    在这里插入图片描述
  • 打开选择存放的目录,找到.hex文件,生成成功!
    在这里插入图片描述

(4)实物电路连接

  • LED短脚接地,长脚接PA5,按键一端接PB5,另一端当作开关,来回接3.3V
    在这里插入图片描述

(5)烧录程序

  • 打开FlyMcu工具,找到.hex文件后点击开始编程
    在这里插入图片描述

(6)运行结果实物图

  • 用杜邦线当作开关控制灯的亮灭,成功!
    在这里插入图片描述

4.实例(2)—— 串口通信

(1)生成指定工程文件

这一项操作步骤和上一个实例的操作步骤类似,在这里只列举不同之处

新增:

  • 在A—>Z界面中选中USART1,在Mode中选择Asynchronous
    在这里插入图片描述
  • 进入NVIC Settings界面,勾选Enabled,使能中断
    在这里插入图片描述
  • 完成上述两步增加的操作后,即可生成工程文件

(2)添加中断代码

  • 打开刚才创建的工程文件夹,进入MDK-ARM文件夹,点击打开新创建的项目工程
    在这里插入图片描述

  • 进入界面按照图示步骤找到main.c函数,并且在对应位置加入代码

存放数据的数组
在这里插入图片描述
添加回转函数
在这里插入图片描述
添加中断调用
在这里插入图片描述
代码:

uint8_t a[]="Hello world!\n";
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
		HAL_UART_Transmit_IT(&huart1, a, sizeof(a));
}
HAL_UART_Transmit_IT(&huart1, a, sizeof(a));

代码填写完成后,就可以编译执行代码生成.hex文件进行烧录

(3)烧录以及运行结果实物图

  • 打开FlyMcu,找到刚才生成的.hex文件,点击开始编程
    在这里插入图片描述
  • 打开串口调试助手后,将波特率调整到115200,点击打开串口,电脑会开始接收Hello world!
    在这里插入图片描述
    实验成功!

二、STM32之DMA通信

1.什么是DMA通信

(1)引言

计算机通信:将计算机技术和通信技术相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。按照数据传输方式的不同,可以分为串行通信和并行通信两类

类型基本概念特点
串行通信数据逐位传输传输线少,长距离传输时成本低,数据传输控制较复杂
并行通信多位数据同时传输传输控制简单,传输速度快,长距离传输时硬件成本较高
  • 串行通信
    在这里插入图片描述
  • 并行通信
    在这里插入图片描述

(2)DMA的概念

直接存储器访问(DMA):用于在外设与存储器之间以及存储器与存储器之间进行高速数据传输。DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率

(3)DMA的四要素

  • 传输源:DMA数据传输的来源
  • 传输目标:DMA数据传输的目的
  • 传输数量:DMA传输数据的数量
  • 触发信号:启动一次DMA数据传输的动作

2.DMA通信的特点

每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置;

  • 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推);
  • 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐;
  • 支持循环的缓冲器管理;
  • 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求;
  • 存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;
  • 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;
  • 可编程的数据传输数目:最大为65535。
    在这里插入图片描述
    在这里插入图片描述

3.实例——DMA串口通信

(1)生成指定工程文件

  • 首先打开STM32CubeMX,新建一个工程,选择芯片型号,这里我根据我的选择STM32F103C8
    在这里插入图片描述
  • 进入RCC界面,在HSE中选择Crystal…
    在这里插入图片描述
  • 在A—>Z界面中选中USART1,在Mode中选择Asynchronous,基础参数设置为波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能在这里插入图片描述
  • 进入NVIC Settings界面,勾选Enabled,使能中断
    在这里插入图片描述
  • 进入DMA Settings界面,点击 Add 添加通道,将传输速率设置为中速
    在这里插入图片描述
  • 点击System view,点击DMA,点击ADD,添加MEMTOMEM
    在这里插入图片描述
  • 进入Clock Configuration界面,将时钟修改至如图所示
    在这里插入图片描述
  • 进入Project Manager界面,给工程命名,并选择对应的IDE型号
    在这里插入图片描述
  • 点击Generate Code,生成工程文件
    在这里插入图片描述

(2)添加代码

  • 打开刚才创建的工程文件夹,进入MDK-ARM文件夹,点击打开新创建的项目工程
    在这里插入图片描述

  • 进入界面按照图示步骤找到main.c函数,并且在对应位置加入代码
    在这里插入图片描述
    在这里插入图片描述

代码:

uint8_t Senbuff[] = "Hello world!";  //定义数据发送数组
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
	  HAL_Delay(1000);

(3)生成.hex烧录文件

  • 点击魔法棒,进入Output界面,勾选Create HEX File,如果要修改存放位置可以点击Select Folder…进行进一步操作,完成后点击OK
    在这里插入图片描述

  • 点击左上角Rebuild按钮,进行编译
    在这里插入图片描述

  • 0 Error 0 Warming
    在这里插入图片描述

  • 打开选择存放的目录,找到.hex文件,生成成功!
    在这里插入图片描述

(4)烧录程序

  • 打开FlyMcu,找到刚才生成的.hex文件,点击开始编程
    在这里插入图片描述

(5)运行结果实物图

  • 打开串口通信助手,按下一次按键,发送一次Hello world!
    在这里插入图片描述
    实验成功!

三、总结

本篇博客介绍了STM32F103单片机的中断和DMA通信,介绍了中断的基本概念,三大过程和其意义,阐述了通信的四种类型,介绍了DMA通信的基本概念和其特点,并通过实例——中断点灯、串口通信,DMA串口通信,将理论的学习运用到实践中,希望能够给各位读者帮助,同时也希望各位读者能够自己尝试去实验,只有通过实验才能够真正熟知和掌握知识。若博客中有不足或者缺漏,望各位指出。

四、参考资料

STM32 HAL库 CubeMx 按键中断控制LED
第六章__通用输入输出接口(二)(new).pdf
【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收)
【STM32】 DMA原理,步骤超细详解,一文看懂DMA

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值