基于STM32中断、DMA通信原理和编程方法

本文详细介绍了使用STM32CUBEMX配置中断实现点灯及按键控制,以及设置DMA进行串口通信的过程。通过实例展示了中断消除抖动和DMA高效传输数据的机制,并提供了代码示例。实验总结强调了中断和DMA在提高系统效率上的作用。
摘要由CSDN通过智能技术生成

一、STM32CUBEMX生成中断点灯代码

打开STM32CUBEMX,新建一个工程,选择芯片型号STM32F103C8
在这里插入图片描述
点击RCC中的Crystal
在这里插入图片描述
点到SYS中的Serial Wire
在这里插入图片描述
点击GPIO,选择自己用到的管脚,这里我的LED是连在PB9管脚,按键是连在PB8管脚
连接LED的管脚选择GPIO_Output

在这里插入图片描述
按键所连的管脚选择GPIO_EXIT
在这里插入图片描述
让默认输入为0,选择pull down,选择上升沿触发
在这里插入图片描述
断口勾选
在这里插入图片描述
调整 时钟
在这里插入图片描述
给工程命名,选择IDE型号
在这里插入图片描述
打开工程输入中断代码
在这里插入图片描述
代码如下:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
		for(long i = 1;i<72000;i++){}; //消除抖动
		if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==1)
		{
			HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
		}
	__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
}


烧录如图:在这里插入图片描述

运行效果如图
在这里插入图片描述

二、 STM32CUBEMX生成中断通信代码

新建一个工程,大部分设置与上面相同,下面只列举不同的地方
USART1中的Mode选择Asynchronous
在这里插入图片描述
使能中断
在这里插入图片描述
打开生成的代码,添加存放的数据组

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));

在这里插入图片描述
编译烧录运行,输出hello world!
在这里插入图片描述

三、DMA通信原理

关于DMA:DMA,全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
在这里插入图片描述

四、 创建DMA工程

创建一个新工程,选择芯片STM32F103C8
在这里插入图片描述
设置RCC并选择Cystal
在这里插入图片描述
设置串口
1点击USATR1
2设置MODE为异步通信(Asynchronous)
3基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能
4GPIO引脚自动设置 USART1_RX/USART_TX
在这里插入图片描述
使能中断
在这里插入图片描述
DMA设置:点击DMASettings 下的 Add 添加通道,传输速率设置为中速
在这里插入图片描述
模式设置为Normal,右侧选择Memory
在这里插入图片描述
在system view下选择DMA
在这里插入图片描述
点击add添加
在这里插入图片描述
时钟设置(从左到右)
在这里插入图片描述
设置工程名和IDE版本
在这里插入图片描述
点击右上角GENERATE CODE,完成

五 、代码效果

在下图位置添加代码在这里插入图片描述

uint8_t Senbuff[] = "Hello world!";  //定义数据发送数组

在这里插入图片描述

HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
	  HAL_Delay(1000);

编译结果无误
在这里插入图片描述
烧录
在这里插入图片描述
打开上位机,按下一次按键,发送一次Hello world!
在这里插入图片描述

六、 实验总结

通过本次实验我对中断有了更进一步的了解,它解放了cpu,而DMA通信相比于普通的串口通信不用经过CPU,是一种更高效的方式。

七、参考文献

https://blog.csdn.net/as480133937/article/details/104827639/
https://blog.csdn.net/qq_44918248/article/details/114579472?ops_request_misc=&request_id=&biz_id=102&utm_term=stm32cubemx%E4%B8%AD%E6%96%AD%E5%AE%9E%E7%8E%B0%E7%82%B9%E4%BA%AELED&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-114579472.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值