STM32 寄存器配置笔记——USART DMA发送

一、DMA介绍

          直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传 输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。当产品对于时序要求较严格时,外设使用DMA的方式能够减轻CPU负担,从而提高整体效率。本文主要介绍USART1 DMA发送配置,以stm32f10系列为例。DMA每次发送固定字节数据保证主循环每次执行DMA发送是均匀的,避免高负载等特殊情况下处理异常。

二、USART1对应的通道

三、配置流程

        1)配置DMA1时钟

RCC->AHBENR |= 1 << 0;		//¿ªÆôDMA1ʱÖÓ

        2)dma初始化配置

        DMA初始化配置如下,串口DMA发送属于存储到外设模型,配置DMA单次模式发送,且每次发送存储地址自增1,这里开启了NVIC中断向量,如果要使用DMA中断的话则需要把下面注释段DMA_CHx->CCR |= 1 << 1;和MY_NVIC_Init(3,3,DMA1_Channel4_IRQn,2);打开。

void DMA_Init(void)
{
    DMA_Config(DMA1_Channel4, (u32)&USART1->DR);
}

void DMA_Config(DMA_Channel_TypeDef* DMA_CHx, u32 cpar)
{
	DMA_CHx->CPAR = cpar;                    //cfg periph addr 
	DMA_CHx->CCR |= 3 << 12;                 //cfg channel prio 3
	DMA_CHx->CCR |= 1 << 4;                  //cfg mem to periph
	DMA_CHx->CCR &= ~(1 << 5);               //cfg dma single transfer
	DMA_CHx->CCR |= 1 << 7;                  //cfg mem transfer addr inc
	//DMA_CHx->CCR |= 1 << 1;                //cfg dma ie
	//MY_NVIC_Init(3,3,DMA1_Channel4_IRQn,2);  //cfg dma channel4 enable nvic if enable ie
}

打开后发现能够进入中断函数。这里并没有使用DMA中断方式,使用的轮询查标志。

void DMA1_Channel4_IRQHandler(void)
{
	DMA1->IFCR|=1<<13;
}

        3)创建dma发送任务

        4)dma数据发送流程

        基于前面写的博客STM32 寄存器配置笔记——USART配置中断接收乒乓缓存处理基础上加的dma流程设计。代码如下:

static u32 dma_tx_single_len = 0;
static u32 dma_tx_total_len = 0;
static u32 dma_mem_offset = 0;
static u8 dma_tx_task = 0;
static u8 *g_pdma_tx_dat = NULL;
static DMA_UART_TX_STATUS dma_tx_status = DMA_UART_CHANNEL_IDLE;

void create_dma_tx_task(u8 *pDat, u32 len)
{
    if (dma_tx_task)
	{
	    printf("dma_tx_task is running\r\n");
	}
	else
	{
	    dma_tx_task = 1;
		g_pdma_tx_dat = pDat;
		dma_tx_total_len = len;
	}
}

void data_dma_tx(void)
{
	switch(dma_tx_status)
	{
		case DMA_UART_CHANNEL_IDLE:
		{
			if (dma_tx_task)
			{
				dma_tx_status = DMA_UART_SENDING;
				dma_mem_offset = 0;
				dma_tx_single_len = ((dma_tx_total_len >= DMA_UART_SINGLE_TX_LEN) ? DMA_UART_SINGLE_TX_LEN : dma_tx_total_len);
				DMA_UART_TX_ENABLE(DMA1_Channel4, (u32)g_pdma_tx_dat, dma_tx_single_len);
			}
		}
		break;
	
		case DMA_UART_SENDING:
		{
		    if (0 == (DMA1->ISR & (1 << 13)))
				return;
			
			DMA1->IFCR |= 1 << 13;
			dma_tx_total_len -= dma_tx_single_len;
			if (dma_tx_total_len)
			{
				dma_mem_offset += dma_tx_single_len;
				dma_tx_single_len = ((dma_tx_total_len >= DMA_UART_SINGLE_TX_LEN) ? DMA_UART_SINGLE_TX_LEN : dma_tx_total_len);
				DMA_UART_TX_ENABLE(DMA1_Channel4, (u32)g_pdma_tx_dat + dma_mem_offset, dma_tx_single_len);
			}
			else
			{
			    dma_tx_status = DMA_UART_SENDED;
			}
		}
		break;
	
		case DMA_UART_SENDED:
		{
		    dma_tx_status = DMA_UART_CHANNEL_IDLE;
			dma_tx_task = 0;
		}
		break;
	
		default:
			break;
	}
}

具体调用如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/238230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 指针常量和常量指针的区别

指针常量 指针常量&#xff1a;顾名思义它就是一个常量&#xff0c;但是是指针修饰的。 格式为&#xff1a; int * const p //指针常量在这个例子下定义以下代码&#xff1a; int a&#xff0c;b&#xff1b; int * const p&a //指针常量 //那么分为一下两种操作 *p9;//操…

[笔记] 使用 qemu/grub 模拟系统启动(单分区)

背景 最近在学习操作系统&#xff0c;需要从零开始搭建系统&#xff0c;由于教程中给的虚拟机搭建的方式感觉还是过于重量级&#xff0c;因此研究了一下通过 qemu 模拟器&#xff0c;配合 grub 完成启动系统的搭建。 qemu 介绍 qemu 是一款十分优秀的系统模拟器&#xff0c;…

软件设计师——软件工程(一)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

【漏洞修复】Cisco IOS XE软件Web UI权限提升漏洞及修复方法

关于Cisco IOS XE软件Web UI权限提升漏洞及修复方法 文章目录 漏洞基本信息漏洞影响范围确认设备是否受影响漏洞修复方法推荐阅读 漏洞基本信息 Cisco IOS XE Unauthenticatd Remote Command Execution (CVE-2023-20198) (Direct Check) Severity:Critical Vulnerability Pri…

网络游戏APP备案|游戏

网络游戏APP备案|游戏 网络游戏备案分析需要备案原因&#xff08;个人看法&#xff09;对小公司对大公司 总结 网络游戏备案分析 相信做网络游戏的伙伴们在23年都收到了各个平台的公告&#xff0c;网络游戏需要进行APP的备案。也就是说网路游戏现在安卓平台也不是你想上架测试…

Shrio 安全框架

目录 前言 1.介绍 2.整合 Shiro 到 Spring Boot 3.Shiro 相关配置 总结 前言 几乎所有涉及用户的系统都需要进行权限管理&#xff0c;权限管理涉及到一个系统的安全。Spring Boot 的安全框架整合方案中还有一个璀璨的明珠&#xff1a;Shrio。 1.介绍 Shiro是一款由Java 编…

基于Qt的Live2D模型显示以及控制

基本说明 Live2D官方提供有控制Live2D模型的SDK,而且还提供了一个基于OpenGL的C项目Example,我们可以基于该项目改成Qt的项目&#xff0c;做一个桌面端的Live2D桌宠程序。 官方例子 经过改造效果如下图所示。 官方项目配置 下载官方提供的SDK例程,&#xff0c;选择Cubism …

2023 ACDU 中国行 · 西安站 | 数据库技术发展及实践

ACDU 中国行西安站由中国数据库联盟联合浪潮数据库等单位共同主办&#xff0c;特邀中国计算机学会&#xff08;CCF&#xff09;为本次活动的指导单位。 作为中国数据库联盟的品牌活动之一&#xff0c;【ACDU 中国行】在线下汇集数据库领域的行业知名人士&#xff0c;共同探讨数…

契约锁电子签章让合同起草、审查不再难

起草、审查合同是签约过程中最繁琐的环节之一。 小到筛选合同范本、确认并填写签署方信息、计算工资、服务费用或产品价格&#xff0c;大到合同条款审查、修改…总之想要呈现一份合规、双方满意的合同文书常常消耗大量时间和精力&#xff0c;事倍功半。 销售刚刚和客户确认订单…

Excel往Word复制表格时删除空格

从Excel复制到word&#xff0c;复制后&#xff0c;前面出现了空格 原因&#xff1a;这个空白是缩进 方法&#xff1a;先将缩进转为空格&#xff0c;再将空格删除 第一步&#xff1a;选中表格&#xff0c;如下操作 第二步&#xff1a;选中表格&#xff0c;排版&#xff0c;将…

ftp传海量文件会卡?跨境数据传输推荐使用FTP吗?

企业在传输大量文件时&#xff0c;经常会遇到FTP卡顿的问题&#xff0c;尽管采取多种方式仍无法完美解决&#xff0c;尤其是在跨境数据传输方面。对于紧急项目而言&#xff0c;文件数据无法及时同步可能导致任务无法按时完成。在传输速度方面&#xff0c;甚至可能出现每秒几KB的…

医院HIS系统慢和卡顿网络流量分析

分析背景 近期医院的医生使用HIS系统的时候&#xff0c;经常出现系统慢和卡顿现象。经过交流得知医生在点击一个页面&#xff0c;需要等很久才能加载出来&#xff0c;且对于开药这种的操作&#xff0c;医生需要点每个大类去找到对应的药&#xff0c;每点一次都需要等一会儿才能…

BearPi Std 板从入门到放弃 - 先天神魂篇(1)(RT-Thread 指令点亮LED)

简介 使用 BearPi IOT Std板&#xff0c; 开发板简单信息 主芯片: STM32L431RCT6 串口: Usart1 USER LED : PC13 E53_SC1 扩展板与主板连接: I2C : I2C1 (光照强度传感器&#xff1a;BH1750) LED: PB9RT-Thread 创建线程 线程的管理方式 添加用户代码 main.c #include <…

Java爬虫攻略:应对JavaScript登录表单

问题背景 在进行网络抓取数据时&#xff0c;经常会遇到需要登录的网站&#xff0c;特别是使用JavaScript动态生成登录表单的情况。传统的爬虫工具可能无法直接处理这种情况&#xff0c;因此需要一种能够模拟用户行为登录的情况解决方案。 在实际项目中&#xff0c;我们可能需要…

uniapp-实现一级二级职位选择,完整页面!!!

一、需求 该页面实现的功能有&#xff1a; 该页面是左侧为一级&#xff0c;右侧为二级&#xff1b;可以搜索职位进行选择&#xff1b;底部显示已选的岗位&#xff0c;点击每一项会删除&#xff1b;右侧的二级岗位&#xff0c;点击时会选中&#xff0c;再次点击会取消&#xf…

AI数字人在tiktok平台开播教程!

AI数字人作为一种虚拟形象的代表&#xff0c;正在逐渐走进人们的生活。在小红书这样的短视频平台上&#xff0c;AI数字人也有机会开展直播活动&#xff0c;展示自己的个性魅力&#xff0c;也可以进行直播带货&#xff01; 数字人在淘宝购物平台开播原理 &#xff08;1&#xff…

[UNILM]论文实现:Unified Language Model Pre-training for Natural Language.........

文章目录 一、完整代码二、论文解读2.1 介绍2.2 架构2.3 输入端2.4 结果 三、过程实现四、整体总结 论文&#xff1a;Unified Language Model Pre-training for Natural Language Understanding and Generation 作者&#xff1a;Li Dong, Nan Yang, Wenhui Wang, Furu Wei, Xia…

【docker】容器使用(Nginx 示例)

查看 Docker 客户端命令选项 docker上面这三张图都是 常用命令&#xff1a; run 从映像创建并运行新容器exec 在运行的容器中执行命令ps 列出容器build 从Dockerfile构建映像pull 从注册表下载图像push 将图像上载到注册表…

深度学习 Day10——T10数据增强

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;3.导入数据4.查…

Vue3-05-计算属性使用详解

计算属性简介 计算属性的函数是 computed()。计算属性可以帮助我们处理有复杂逻辑的响应式数据的渲染&#xff0c; 从而代替 模板表达式 的写法。比如 &#xff1a; 一个数值类型的数组对象&#xff0c;我们希望页面展示的只有 偶数。 此时&#xff0c;就可以通过 计算属性 来…