STM32——DMA

STM32——DMA


宗旨:技术的学习是有限的,分享的精神是无限的。


        DMA 是为CPU分担数据转移的工作。因为DMA的存在CPU才被解放出来,它可以在 DMA 转移数据的过程中同时进行数据运算、响应中断,大大提高效率。

1、DMA工作分析

        数据传输的过程中,不需要内核的全程参与,所以内核可以同时进行数据运算。DMA 方式是点到点的数据转移,而不使用 DMA 方式还要以内核来作为中转站,显然 DMA 传输方式的效率更高。

        要使用 DMA,需要确定一系列的控制参数,如外设数据的地址、内存地址、传输方向等,在开启 DMA 传输前还要先发出 DMA 请求。

 

2、 初始化DMA 

typedef struct
{uint32_t DMA_PeripheralBaseAddr;uint32_t DMA_MemoryBaseAddr;uint32_t DMA_DIR;uint32_t DMA_BufferSize;uint32_t DMA_PeripheralInc;uint32_t DMA_MemoryInc;uint32_t DMA_PeripheralDataSize;uint32_t DMA_MemoryDataSize;uint32_t DMA_Mode;uint32_t DMA_Priority;uint32_t DMA_M2M;
} DMA_InitTypeDef;

1DMA_PeripheralBaseAddr这个成员保存的是外设数据寄存器的基地址,这个地址作为传输的源或目标。DMA 具有地址自增的功能,地址自增功使得可以方便地读取连续的 数据单元 。现在给这个成员的赋USART1_DR_Base,是一个自定义的宏:

#define USART1_DR_Base 0x40013804【串口外设会自动把数据寄存器中的数据,送入它的移位寄存器,然后由硬件按照串口协议把该数据发送出去。】

2DMA_MemoryBaseAddr保存了内存的基地址,同样,这个地址可作为传输的源或目标。在使用时通常会给这个成员赋值为某个数组的基地址,然后利用 DMA 的地址自增功能把数组一个个地填满。在本代码中向这个成员赋值为 SendBuff,这是一个自定义的数组变量名。

3DMA_DIR保存了 DMA 数据传输方向,可以选择是外设到内存还是内存到外设。

4DMA_BufferSize保存了 DMA 要传输的数据总大小,其单位为后面结构体成员。

5DMA_PeripheralInc/DMA_MemoryInc分别为外设和内存的地址是否开启自增功能。

6DMA_PeripheralDataSize/ DMA_MemoryDataSize分别为外设和内存的数据单元大小。可以为字节、半字和字。

7DMA_Mode保存了 DMA 的模式,可以为循环模式或正常模式,循环模式即在传输完一轮数据之后再重新传输,这种方式很适合 ADC 不断采集数据的场合。

8DMA_PriorityDMA 通道的优先级,总线矩阵根据其 DMA 通道的优先级进行总线协调分配。

9DMA_M2M保存了是否内存到内存的 DMA 传输。DMA 传输可以在外设与内存、外设与外设以及内存与内存之间进行。

 

// 初始化DMA主要是开启外设时钟、填充初始化结构体以及使能外设。
void USART1_DMA_Config(void)
{DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /*开启 DMA 时钟*/DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; /*设置 DMA 源:串口数据寄存器地址*/DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff; /*内存地址(要传输的变量的指针)*/DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /*方向:从内存到外设*/DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE; /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*外设地址不增*/DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*内存地址自增*/DMA_InitStructure.DMA_PeripheralDataSize =   DMA_PeripheralDataSize_Byte; /*外设数据单位*/DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*内存数据单位 8bit*/DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /*DMA 模式:不断循环*/DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /*优先级:中*/DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /*禁止内存到内存的传输 *//*配置 DMA1 的 4 通道  根据 DMA 的请求映像来设置 */DMA_Init(DMA1_Channel4, &DMA_InitStructure);DMA_Cmd (DMA1_Channel4, ENABLE);  /*使能 DMA*/
//DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);//配置 DMA 发送完成后产生中断
}

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

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

相关文章

YOLOv8改进 | 主干篇 | 利用SENetV1改进网络结构 (ILSVRC冠军得主)

一、本文介绍 本文给大家带来的改进机制是SENet(Squeeze-and-Excitation Networks)其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型,而是一个可以和现有的任何一个模型相结合的模块(可以看作是一…

搭建Servlet在线视频

这个视频flash上传及在线播放,搞了我一天了,总算有点成果,但还有一些疑问没有解决,现在发这篇随笔,为的就是交流视频在线上传和观看的一些问题。 在线编辑器使用FCKEditor,首先是修改FCKEditor的配置文件&a…

操作系统——内存管理例题

1、关于分配策略例题 case1:某系统的空闲分区见下表,如有下列作业:96KB,20KB,200KB,分别采用首次适应算法和最佳适应算法来处理这些作业序列,哪种算法能满足该作业序列请求? 分区号…

STM32中C语言知识点:初学者必看,老鸟复习(长文总结)

说在前面的话一位初学单片机的小伙伴让我推荐C语言书籍,因为C语言基础比较差,想把C语言重新学一遍,再去学单片机,我以前刚学单片机的时候也有这样子的想法。其实C语言是可以边学单片机边学的,学单片机的一些例程中&…

STM32——ADC

STM32——ADC 宗旨:技术的学习是有限的,分享的精神是无限的。 一、ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行 ;ADC的结果可以左对齐或右对齐方式存储在 16…

时间复杂度和空间复杂度,一看就懂,面试前必过一遍

一、定义时间和空间是程序的一个硬性指标,一个用来衡量 代码执行的速度 ,一个用来衡量 存储空间的大小程序 数据结构 算法时间复杂度:就是执行程序的快慢,速度越快,时间复杂度就越好。空间复杂度:就是执…

数据结构——排序【仅用于考试】

1、简介 排序&#xff0c;是重新排列表中的元素&#xff0c;使表中的元素满足按关键字有序的过程 稳定性&#xff1a;选取两个元素Ri<Rj&#xff0c;经过排序算法之后&#xff0c;仍为Ri<Rj 不稳定的排序&#xff1a;【简单选择排序&#xff0c;快速排序&#xff0c;堆…

[UWP]做个调皮的BusyIndicator

1. 前言 最近突然想要个BusyIndicator。做过WPF开发的程序员对BusyIndicator应该不陌生&#xff0c;Extended WPF Toolkit 提供了BusyIndicator的开源实现&#xff0c;Silverlight Toolkit也有一个&#xff0c;这次想要把这个控件移植到UWP中。 2. 先说点正经的 2.1 BusyIndica…

STM32——I2C

STM32——I2C 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、I2C协议 I 2 C &#xff08;Inter-Integrated Circuit&#xff09;协议是由 Philips 公司开发的&#xff0c;由于它具备引脚少、硬件实现简单、可扩展性强、不需要如 USART、CAN 的外部…

C语言发展简史

1、起源C 语言最早的原型是 ALGOL 60 1963 年&#xff0c;剑桥大学将其发展成为 CPL(Combined Programing Language)。1967 年&#xff0c;剑桥大学的 Matin Richards 对 CPL 语言进行了简化&#xff0c;产生了 BCPL 语言。1970 年&#xff0c;美国贝尔实验室(Bell Labs)的 Ken…

STM32——EEPROM

STM32——EEPROM 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、I2C接口读写EEPROM&#xff08;AT24C02&#xff09; ——主模式&#xff0c;分别用作主发送器和主接收器。通过查询事件的方式来确保正常通信。 1、I 2C接口初始化 与其他对GPIO 复用…

Linus Torvalds谈ECC内存的重要性 痛斥英特尔正在扼杀它

新年假期&#xff0c;Linus Torvalds在邮件列表中发表的一篇火热的帖子引发技术社区关注&#xff0c;人们借此讨论ECC内存的重要性&#xff0c;Torvalds在文章中抨击了英特尔在这方面的”坏政策”&#xff0c;因为特定的市场细分使ECC内存不那么普及。Linus认为&#xff0c;纠错…

加密和解密算法的兩個實現

最近一段時間,集團加強了資安方面的管理,所有敏感的配置字節都必須經過加密處理,把最近用到的幾個加解密類整理了一下,以做備忘. 其實這兩個類實現的方法差不多,只是有些細微區別: 對稱加密演算法類 SymmetricMethodHelperusing System;using System.IO;using System.Security.…

47.leetcode36_valid_suduko

1.题目分析 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character .. A partially filled sudoku which is valid. Note: A valid Sudoku board (partia…

STM32——SPI接口

STM32——SPI接口 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、SPI协议【SerialPeripheral Interface】 串行外围设备接口&#xff0c;是一种高速全双工的通信总线。在ADC/LCD等与MCU间通信。 1、SPI信号线 SPI 包含 4 条总线&#xff0c;SPI 总…

这两种printf()函数重定向方法,太实用了

作者&#xff1a;echobright原文链接&#xff1a;https://blog.csdn.net/qq_29344757/article/details/75363639在前面学习了STM32的串口编程&#xff0c;通过USART1向计算机的串口调试助手打印数据&#xff0c;或者接收计算机串口调试助手的数据&#xff0c;接下来我们可以实现…

浅析Linux 64位系统虚拟地址和物理地址的映射及验证方法

前言有好久没更新了&#xff0c;这段时间发生了挺多大喜事哈。但是也还是有挺久没更新了&#xff0c;不得不意识到自己是个小菜鸡&#xff0c;就算是小菜鸡也要做一只快乐小菜鸡。就算更新慢但是我依然会持续更新&#xff0c;因为更文使我快乐。虚拟内存先简单介绍一下操作系统…

C语言指针:从底层原理到花式技巧,用图文和代码帮你讲解透彻

一、前言二、变量与指针的本质三、指针的几个相关概念四、指向不同数据类型的指针五、总结一、前言如果问C语言中最重要、威力最大的概念是什么&#xff0c;答案必将是指针&#xff01;威力大&#xff0c;意味着使用方便、高效&#xff0c;同时也意味着语法复杂、容易出错。指针…

ARM

ARM 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1 、ARM处理器的特点 ARM 处理器具有耗电少&#xff0c;功能强大&#xff0c;16 位/32 位双指令集等众多优点。主要有以下六个主要特点&#xff1a; ① 体积小、低功耗&#xff0c;低成本和高性能&am…

解决一个I2C读写问题

之前写关于I2C相关的文章排查一个触摸屏驱动问题MTK 平台TP调试遇坑1、问题今天遇到一个问题&#xff0c;我们有一个芯片&#xff0c;I2C读写失败&#xff0c;导致录音有问题&#xff0c;而且是偶现的。log提示看到是返回 -6<3>[ 730.336308] (3)[2085:tinycap]es7243_…