渡鸦MK60学习 【DMA直接存储器读取】
DMA直接存储器读取
1、数据搬运时不需要cpu参与
2、可以为源地址到目的地址开辟一条信息传输的通道。
芯片手册中相关章节:
DMAMUX:DMA的选择器
eDMA:DMA的控制器
DMA使用时要有的基本参数:
1、源地址 目的地址(来源和去向)
2、传输的数据字节数
3、每次搬运的数据位宽?8,16位?
4、传输的开始时间,每次的触发源是什么。
5、每次传输完成之后需不需要调整源地址和目的地址,调整多少。
DMA触发源选择在DMA MUX request sources中选择
DMA中传输具有两层嵌套循环,分为主循环和子循环。因此一次传输也就是 主循环*子循环
实现数据通过DMA进行搬运具体流程:
1、初始化DMA相关参数配置,主要分为对DMA整体配置,源地址和目标地址参数配置。首先要选择使用的是通道几。
我们本次使用的芯片拥有16路的通道。本次的实验中选择通道0。触发源根据需要进行选择,本次配置为一直触发。以及配置相应的普通模式。并且配置每次小循环的缓冲区大小和大循环的次数。
DMA_InitTypeDef DMA_InitStruct = {0};DMA_InitStruct.chl=HW_DMA_CH0; //选择通道0DMA_InitStruct.chlTriggerSource=MUX1_DMAREQ; //触发源选择为Always EnabledDMA_InitStruct.triggerSourceMode=kDMA_TriggerSource_Normal; //普通模式DMA_InitStruct.minorLoopByteCnt=sizeof(SourceBuffer); //设置小循环的次数为sd缓存区的大小DMA_InitStruct.majorLoopCnt=1; //设置主循环的次数为1
2、对需要搬运数据的源地址和目标地址进行初始化操作。
初始方式相似,首先将相应的源地址和目的地址传入结构体的sAddr和dAddr中。
设置每次主循环完成之后数据地址是否产生偏移以及偏移了多少。
设置每次读取之后数据的偏移量。
设置每次传输的数据宽度。
modulo模式用于对传输的数据地址进行锁定,比如配置为4则锁定4位数据一个0x0000123==4==读取的数据将只能在0x0000123==0==~0x0000123==F==之间进行循环。该功能通常用于循环读取,本次的例程中并未用到因此失能。
DMA_InitStruct.sAddr=(uint32_t)SourceBuffer;DMA_InitStruct.sLastAddrAdj=0;DMA_InitStruct.sAddrOffset=1;DMA_InitStruct.sDataWidth=kDMA_DataWidthBit_16; //数据的宽度设置为16位的位长DMA_InitStruct.sMod=kDMA_ModuloDisable; //禁用modulo模式DMA_InitStruct.dAddr=(uint32_t)DestBuffer; //目的地址DMA_InitStruct.dLastAddrAdj =0; //每次执行完主循环之后地址向后偏移0DMA_InitStruct.dAddrOffset=1; //每次读取了地址之后地址向后偏移1DMA_InitStruct.dDataWidth=kDMA_DataWidthBit_16;DMA_InitStruct.dMod=kDMA_ModuloDisable;DMA_Init(&DMA_InitStruct); //初始化
3、配置好相关参数之后设置DMA中断回调函数DMA_ISR()
该函数中需要设置DMA完成了一次主循环或者半次循环后需要执行的相关代码,按需求配置。
DMA_CallbackInstall(HW_DMA_CH0, DMA_ISR);
4、设置中断的触发方式,为传输一半触发还是传输完成触发
DMA_ITConfig(HW_DMA_CH0, kDMA_IT_Major, true);
5、最后使能DMA传输即可
DMA_EnableRequest(HW_DMA_CH0);/* 启动DMA传输 */
小记:
%p 输出变量的内存地址。
%o以八进制数形式输出整数。
%x以十六进制数形式输出整数。
编译时出现function“memset”declared implicitly原因:
使用了memset所以需要在头文件中添加#include “string.h”
memset()作用:可以方便的清空一个结构类型的变量或数组。
例如:memset(sd_clear, 0, sizeof(sd_clear)); //清空sd_clear数组中的数据
渡鸦MK60学习 【DMA直接存储器读取】相关推荐
- 渡鸦MK60学习 【点亮一个LED】
目标:点亮E6位置的LED灯-将E6口置为低电平输出即可 实现方法:寄存器直接控制 一.准备工作 使用开发板为Kinetis K60-渡鸦系列开发板. 芯片为ARM-M4 内核的 MK60DN512Z ...
- 渡鸦MK60学习 【ADC-PGA单通道16位数据采集】
K60ADC外设特征 == • Linear successive approximation algorithm with up to 16-bit resolution== • Up to fou ...
- TF学习——TF数据读取:TensorFlow中数据读这三张图片的5个epoch +把读取的结果重新存到read 文件夹中
TF学习--TF数据读取:TensorFlow中数据读这三张图片的5个epoch +把读取的结果重新存到read 文件夹中 目录 实验展示 代码实现 实验展示 代码实现 1.如果设置shuffle为T ...
- ffplay.c学习-2-数据读取线程
ffplay.c学习-2-数据读取线程 目录 准备⼯作 avformat_alloc_context 创建上下⽂ ic->interrupt_callback avformat_open_inp ...
- Adam学习25之读取sam生成的alignmentRecord含recordGroupDictionary
Adam学习25之读取sam生成的alignmentRecord含recordGroupDictionary 1.代码: package org.bdgenomics.adam.testimport ...
- 【深度学习】高效读取数据的方法(TFRecord)
Record顾名思义主要是为了记录数据的. 使用TFRocord存储数据的好处: 为了更加方便的建图,原来使用placeholder的话,还要每次feed_dict一下,使用TFRecord+ Dat ...
- [pytorch、学习] - 4.5 读取和存储
参考 4.5 读取和存储 到目前为止,我们介绍了如何处理数据以及如何构建.训练和测试深度学习模型.然而在实际中,我们有时需要把训练好的模型部署到很多不同的设备.在这种情况下,我们可以把内存中训练好的模 ...
- (pytorch-深度学习系列)读取和存储数据-学习笔记
读取和存储数据 我们可以使用pt文件存储Tensor数据: import torch from torch import nnx = torch.ones(3) torch.save(x, 'x.pt ...
- 【opencv学习】【读取图像、视频、摄像头】
今天学习opencv 一:读取图像 import cv2# 展示图像,封装成函数 def cv_show_image(name, img):cv2.imshow(name, img)cv2.waitK ...
最新文章
- 机器学习算法基础——k-means原理
- mysql 金额 类型,SQL实现根据类型对金额进行归类
- Resin 的 watchdog(看门狗)介绍
- Spring Cloud Stream 与 Kafka 整合
- 计算机应用对口升学后能学啥专业,计算机应用专业的对口升学生考什么大学好...
- 事务的传播性和隔离级别
- ffmpeg 为取经而来_伊力特的英雄情结从何而来?
- 看别人情侣空间显示服务器繁忙什么意思,调查13000位80后年轻人,他们的感情状态究竟如何?...
- 你为什么选择计算机这个专业英语,怎样选择计算机专业,英文作文:为什么选择计算机作为你的专业...
- JS去除数组中重复的值(四种方法)
- 【线段树】Interval GCD【线段树维护gcd】
- NetSpeedMonitor
- 服务器推送微信订阅消息,微信小程序-订阅消息服务通知
- Matlab/Simulink 自动代码生成 基于模型设计学习教程(2)---- 闪烁灯实验
- PAT 乙级 1020 月饼
- 新概念英语(第一册)复习(原文及全文翻译)——Lesson 61 - Lesson 90
- 集智全球开源 聚合中国力量 Tungsten Fabric中文社区成立大会暨社区第一次全员大会成功举行
- 均方根误差(RMSE)的含义是什么以及误差大小多少适合?
- CMNET和CMWAP GPRS 连接
- 全世界研发者,联合起来!