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 3DMA_CHx->CCR |= 1 << 4;                  //cfg mem to periphDMA_CHx->CCR &= ~(1 << 5);               //cfg dma single transferDMA_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.hqwc.cn/news/276955.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Axure RP结合内网穿透工具制作本地静态web页面并实现公网访问

作者简介&#xff1a; 懒大王敲代码&#xff0c;正在学习嵌入式方向有关课程stm32&#xff0c;网络编程&#xff0c;数据结构C/C等 今天给大家讲解使用Axure RP结合内网穿透工具制作本地静态web页面并实现公网访问&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &am…

Linux--Docker容器

这里写目录标题 简介名词解释作用 指令在本地创建容器的过程&#xff1a;&#xff08;这里以tomcat为例&#xff09;访问容器端口映射目录挂载验证端口映射验证目录挂载 删除镜像多小组访问容器mysql容器 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一…

民生银行三季度业绩双降:资产质量下行,屡吃“千万元”级别罚单

撰稿|行星 来源|贝多财经 中国银行研究院发布《2023年四季度经济金融展望报告》显示&#xff0c;今年以来全球经济呈现弱修复态势&#xff0c;虽然国内依旧面临较大外部环境压力&#xff0c;外需总体回落&#xff0c;但三季度经济持续恢复&#xff0c;经济企稳趋势初显。 在此…

宝塔面板快速搭建本地网站结合内网穿透实现远程访问【无需公网IP】

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

嵌入式C语言变量、数组、指针初始化的多种操作

在敲代码的时候&#xff0c;我们会给变量一个初始值&#xff0c;以防止因为编译器的原因造成变量初始值的不确定性。 对于数值类型的变量往往初始化为0&#xff0c;但对于其他类型的变量&#xff0c;如字符型、指针型等变量等该如何初始化呢&#xff1f; 数值类变量初始化 整…

vue2 echarts不同角色多个类型数据的柱状图

前端代码&#xff1a; 先按照echarts插件。在页面里引用 import * as echarts from "echarts";设置div <div style"width:100%;height:250px;margin-top: 4px;" id"addressChart"></div>方法: addressEcharts() {const option {g…

python 实现PC、app自动化全过程(包括CI\CD)

python main.py allure generate C:\devlopePath\new_nergeryApp_auto\reports -o C:\devlopePath\new_nergeryApp_auto\result --clean allure open C:\devlopePath\new_nergeryApp_auto\result

基于JAVA的校园电子商城系统论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此校园购物信息的…

金蝶云星空协同开发环境应用内执行单据类型脚本

文章目录 金蝶云星空协同开发环境应用内执行单据类型脚本业务界面查询单据类型表数据导出数据执行数据库脚本单据类型xml检验是否执行成功检查数据库检查业务数据 金蝶云星空协同开发环境应用内执行单据类型脚本 业务界面 查询单据类型表数据 先使用类型中文在单据类型多语言…

React中的setState执行机制

我这里今天下雨了&#xff0c;温度一下从昨天的22度降到今天的6度&#xff0c;家里和学校已经下了几天雪了&#xff0c;还是想去玩一下的&#xff0c;哈哈&#xff0c;只能在图片里看到了。 一. setState是什么 它是React组件中用于更新状态的方法。它是类组件中的方法&#x…

scala笔记

函数字面量 字面量包括整形字面量、浮点数子面量、布尔型字面量、字符字面量、字符串字面量、符号字面量、函数字面量和元组字面量 除了函数字面量我们比较陌生以外&#xff0c;其他几种字面量都很容易理解 val counter: Int > Int {(value) > value 1}匿名函数 val…

圆角边框, 盒子阴影 ,文字阴影知识总结

圆角边框 在 CSS3 中&#xff0c;新增了圆角边框样式&#xff0c;这样我们的盒子就可以变圆角了。 border-radius 属性用于设置元素的外边框圆角。 border-radius:length;  参数值可以为数值或百分比的形式  如果是正方形&#xff0c;想要设置为一个圆&#xff0c;把数值修…