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

news2024/9/21 16:44:03

一、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;
	}
}

具体调用如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础项目开发2:物联网监控——视频监控方案介绍(一)

前言&#xff1a; 这次我们来做一个关于视频监控的基础小项目&#xff0c;需要我们用到网络的相关知识&#xff0c;还会学到好多优秀的网络协议&#xff0c;下面让我们开始对物联网视频监控进行一个大体框架的介绍吧 目录 项目内容&#xff1a; 1.视频监控方案介绍 2.视频监控…

【模拟】LeetCode-48. 旋转图像

旋转图像。 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6]…

【NR技术】NR NG-RAN整体架构 -功能划分(三)

1 概述 NG-RAN节点包括: gNB&#xff0c;向终端提供NR用户平面和控制平面协议终端;ng-eNB&#xff0c;向终端提供E-UTRA用户平面和控制平面的协议终端。gNB和ng- eNB通过Xn接口相互连接。gnb和NG- eNB也通过NG接口连接到5GC&#xff0c;更具体地说&#xff0c;通过NG-C接口连…

[IDEA] 写代码时没有类型推断的解决方法

本示例使用scala, 其他语言同理 使用 .var 时会自动生成变量 使用快捷键 CtrlAtlv 一样 val abc "abc"但是这个变量没有显式表现类型 期望 val abc: String "abc" 解决方法

神经网络是如何工作的? | 京东云技术团队

作为一名程序员&#xff0c;我们习惯于去了解所使用工具、中间件的底层原理&#xff0c;本文则旨在帮助大家了解AI模型的底层机制&#xff0c;让大家在学习或应用各种大模型时更加得心应手&#xff0c;更加适合没有AI基础的小伙伴们。 一、GPT与神经网络的关系 GPT想必大家已…

教程 || 电脑端如何登录两个以上微信?

1、桌面上右键新建文本文档 2、重命名成“双开.bat”&#xff0c;点击 “是&#xff08;Y&#xff09;” 3、右键点击&#xff0c;选择编辑&#xff0c;输入&#xff1a; echo off start “” “D:\WeChat\WeChat.exe” start “” “D:\WeChat\WeChat.exe” exit 其中&…

_try_except原理探究

调用_except_handle3这个异常处理函数&#xff0c;这里并不是每个编译器的异常处理函数都是相同的&#xff0c;然后存入结构体&#xff0c;将esp的值赋给fs:[0]&#xff0c;再就是提升堆栈的操作 每个使用 _try _except的函数&#xff0c;不管其内部嵌套或反复使用多少_try _ex…

清雪除冰,扫出“平安路” 开封市鼓楼区民政局社工组织开展除雪破冰志愿行动

近日&#xff0c;我市迎来大范围降雪天气&#xff0c;积雪融化、道路结冰、湿滑难行&#xff0c;造成居民群众出行不便和较大的交通安全隐患。为迅速清除积雪和道路结冰积水&#xff0c;保障辖区居民尤其是困境群体的出行安全&#xff0c;2023年12月11日下午&#xff0c;鼓楼区…

品牌线下店铺的查价方式

不同于电商平台&#xff0c;线下店铺会更传统&#xff0c;产品定价除了受品牌规则的约束&#xff0c;同样也与门店实际销量和促销有关&#xff0c;当遇到地方活动&#xff0c;促销力度大了&#xff0c;价格难免会与品牌要求相差异&#xff0c;但是管控渠道&#xff0c;包含线上…

【产品经理】产品专业化提升路径

产品专业化就是上山寻路&#xff0c;梳理一套作为产品经理的工作方法。本文作者从设计方法、三基座、专业强化、优秀产品拆解、零代码这五个方面&#xff0c;对产品经理的产品专业化进行了总结归纳&#xff0c;一起来看一下吧。 产品专业化就是上山寻路&#xff0c;梳理一套作为…

约数性质以及辗转相除法

文章目录 AcWing 869. 试除法求约数题目链接思路CODE AcWing 870. 约数个数题目链接思路CODE AcWing 871. 约数之和题目链接思路CODE AcWing 872. 最大公约数题目链接思路CODE AcWing 869. 试除法求约数 题目链接 https://www.acwing.com/activity/content/problem/content/9…

用 CSS 写一个渐变色边框的输入框

Using_CSS_gradients MDN 多渐变色输入框&#xff0c;群友问了下&#xff0c;就试着写了下&#xff0c;看了看 css 渐变色 MDN 文档&#xff0c;其实很简单&#xff0c;代码记录下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta ch…

ReactJS和VueJS的简介以及它们之间的区别

本文主要介绍ReactJS和VueJS的简介以及它们之间的区别。 目录 ReactJS简介ReactJS的优缺点ReactJS的应用场景VueJS简介VueJS的优缺点VueJS的应用场景ReactJS和VueJS的区别 ReactJS简介 ReactJS是一个由Facebook开发的基于JavaScript的前端框架。它是一个用于构建用户界面的库&…

C++ //例3.14 找出100~200间的全部素数。

C程序设计 &#xff08;第三版&#xff09; 谭浩强 例3.14 例3.14 找出100~200间的全部素数。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块 方法&#xff1a;使用函数的模块化设计 #include <iostream> #include <iomanip> #i…

2024年甘肃省职业院校技能大赛信息安全管理与评估赛项一阶段样题一

2024年甘肃省职业院校技能大赛高职学生组电子与信息大类信息安全管理与评估赛项样题一 竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防…

0012Java安卓程序设计-ssm记账app

文章目录 **摘要**目 录系统设计5.1 APP端&#xff08;用户功能&#xff09;5.2后端管理员功能模块开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 网络的广泛应用给生活带来了十分的便利。所以把记账管理与现在网络相…

杰发科技AC7840——CAN通信简介(1)

简介 7840支持4路CAN-FD Demo调试 官网下载demo&#xff0c;烧录&#xff0c;打开串口发现打印如下。原因是没有连接CAN盒子&#xff0c;总线错误。 CAN收发器端波形 CAN_L有信号&#xff0c;CAN_H没有 波形放大 GPIO端波形 有持续波形输出 波形放大查看&#xff0c;有50U…

Python数据科学视频讲解:Python注释

2.3 Python注释 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.3节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据科学应用和…

Java学习总结

1. Java集合体系框架 java.util中包含 Java 最常用的the collections framework。 Java集合类主要由两个根接口Collection和Map派生出来的。 Collection 接口派生出了三个子接口List、Set、Queue。Map 接口 因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。 …

推荐算法:HNSW【推荐出与用户搜索的类似的/用户感兴趣的商品】

HNSW算法概述 HNSW&#xff08;Hierarchical Navigable Small Word&#xff09;算法算是目前推荐领域里面常用的ANN&#xff08;Approximate Nearest Neighbor&#xff09;算法了。其目的就是在极大量的候选集当中如何快速地找到一个query最近邻的k个元素。 要找到一个query的…