SMT32:DMA代码部分(内含:1.接线图/实物图+2.代码部分+3.补充的DMA数据传输部分库函数)

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据同步 1个月
简介: SMT32:DMA代码部分(内含:1.接线图/实物图+2.代码部分+3.补充的DMA数据传输部分库函数)

1.接线图/实物图如下:

 

426730f098604796bd48d06df511319a.png

702abfd4f06f41b591aed119e3af07f2.png


2.代码部分如下:

主函数(main.c)代码部分:

 

 8854e6e873c24190b5d1ca7275289134.png

8ba7f099ec6c47968a5243b5712f4c8b.png

ac6804594d674cd89877ff752db926e8.png

#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyDMA.h"
uint8_t DataA[] = {0x01, 0x02, 0x03, 0x04};
uint8_t DataB[] = {0, 0, 0, 0};
int main(void)
{
OLED_Init();
MyDMA_Init((uint32_t)DataA, (uint32_t)DataB, 4);
OLED_ShowString(1, 1, "DataA");
OLED_ShowString(3, 1, "DataB");
OLED_ShowHexNum(1, 8, (uint32_t)DataA, 8);
OLED_ShowHexNum(3, 8, (uint32_t)DataB, 8);
while (1)
{
DataA[0] ++;
DataA[1] ++;
DataA[2] ++;
DataA[3] ++;
OLED_ShowHexNum(2, 1, DataA[0], 2);
OLED_ShowHexNum(2, 4, DataA[1], 2);
OLED_ShowHexNum(2, 7, DataA[2], 2);
OLED_ShowHexNum(2, 10, DataA[3], 2);
OLED_ShowHexNum(4, 1, DataB[0], 2);
OLED_ShowHexNum(4, 4, DataB[1], 2);
OLED_ShowHexNum(4, 7, DataB[2], 2);
OLED_ShowHexNum(4, 10, DataB[3], 2);
Delay_ms(1000);
MyDMA_Transfer();
OLED_ShowHexNum(2, 1, DataA[0], 2);
OLED_ShowHexNum(2, 4, DataA[1], 2);
OLED_ShowHexNum(2, 7, DataA[2], 2);
OLED_ShowHexNum(2, 10, DataA[3], 2);
OLED_ShowHexNum(4, 1, DataB[0], 2);
OLED_ShowHexNum(4, 4, DataB[1], 2);
OLED_ShowHexNum(4, 7, DataB[2], 2);
OLED_ShowHexNum(4, 10, DataB[3], 2);
Delay_ms(1000);
}
}


//补充:


//在寄存器里,OLED_ShowHexNum(2, 1, (uint32_t)&ADC1->DR,8);//&ADC1->DR,取结构体指针成员的地址。


//&ADC1->HexNum表示ADC结构指针指向ADC1外设的起始地址,访问结构体成员,就相当于加一个地址偏移.起始地址+偏移=寄存器


//我们可以自己定义:


//#define ADC_DR (uint32_t*)0x4001244C


//*ADC1_DR


直接存储器(DMA.c)代码部分:


f3e2ad4b3c0c42e78e5a143d00f7b3ce.png

b16c93820c4f4b06b85562ce737fb71a.png

MyDMA_Size=Size;
//1.RCC开启DMA时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//2.初始化DMA_Init结构体
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_MemoryBaseAddr=AddrB;//存储器站点的起始地址(32位),参数代替固定的地址。
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;//存储器站点的数据宽度(字节形式)
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//存储器站点的是否自增
DMA_InitStructure.DMA_PeripheralBaseAddr=AddrA;//外设站点的起始地址
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//外设站点的数据宽度
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;//外设站点的是否自增
DMA_InitStructure.DMA_BufferSize=Size;//缓冲区大小,(传输计数器,指定传输几次)
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//数据传输方向(DST:存储器-->外设站点,SRC:外设站点-->存储器)
DMA_InitStructure.DMA_M2M=DMA_M2M_Enable;//选择硬件触发还是软件触发(M2M_Enable存储器到存储器就是软件触发,Disable是硬件触发)
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//传输模式(指定是否自动重装)DMA_Mode_Normal:正常模式,转运之后停止
DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//优先级(多个通道需要设置优先级,此处无所谓)
DMA_Init(DMA1_Channel1,&DMA_InitStructure);//把结构体配置的参数给DMA1里的通道1.
//第一个参数:既选择了是哪个DMA,又选择了是哪个通道。
//3.开关控制DMA_Cmd
DMA_Cmd(DMA1_Channel1,DISABLE);
}//转运一次,传输寄存器自减一次。传输寄存器为0时,转运结束。
//调用该函数,就在进行一次转运(给传输计数器重新赋值)
void MyDMA_Transfer(void)
{
DMA_Cmd(DMA1_Channel1,DISABLE);//关闭
DMA_SetCurrDataCounter(DMA1_Channel1,MyDMA_Size);//给传输计数器赋值
DMA_Cmd(DMA1_Channel1,ENABLE);//开启
while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);//检查DMA1的通道1转运完成标志位,转运完成,标志位置1
DMA_ClearFlag(DMA1_FLAG_TC1);//清除标志位状态
}

直接存储器(DMA.h)代码部分:


eef6569a5b5a441a95287df85d0ac582.png

#ifndef __MyDMA_H
#define __MyDMA_H
void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size);
#endif

3.//补充的DMA(数据传输部分)库函数:


//void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);//中断输出使能


//void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); //给传输计数器赋值


//uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);//获取数据寄存器的数据


//FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);//获取标志位状态函数


//void DMA_ClearFlag(uint32_t DMAy_FLAG);清除标志位状态


//ITStatus DMA_GetITStatus(uint32_t DMAy_IT);//获取中断状态


//void DMA_ClearITPendingBit(uint32_t DMAy_IT);//清除中断状态


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
4月前
|
容灾 NoSQL 关系型数据库
数据传输DTS同步问题之二分库到四分库如何解决
数据传输服务(DTS)是一项专注于数据迁移和同步的云服务,在使用过程中可能遇到多种问题,本合集精选常见的DTS数据传输问题及其答疑解惑,以助用户顺利实现数据流转。
|
4月前
|
NoSQL 数据库连接 数据处理
数据传输DTS迁移问题之全量加增量发到目标库如何解决
数据传输服务(DTS)是一项专注于数据迁移和同步的云服务,在使用过程中可能遇到多种问题,本合集精选常见的DTS数据传输问题及其答疑解惑,以助用户顺利实现数据流转。
|
9月前
|
NoSQL MongoDB 数据库
DMS(数据传输服务)支持对MongoDB数据库的整库导出
DMS(数据传输服务)支持对MongoDB数据库的整库导出
135 1
|
4月前
|
SQL 分布式计算 监控
在数据传输服务(DTS)中,要查看每个小时源端产生了多少条数据
【2月更文挑战第32天】在数据传输服务(DTS)中,要查看每个小时源端产生了多少条数据
49 6
|
4月前
|
存储 SQL NoSQL
数据传输DTS同步问题之同步失败如何解决
数据传输服务(DTS)是一项专注于数据迁移和同步的云服务,在使用过程中可能遇到多种问题,本合集精选常见的DTS数据传输问题及其答疑解惑,以助用户顺利实现数据流转。
|
4月前
|
Cloud Native NoSQL 关系型数据库
数据传输DTS校验问题之校验报错如何解决
数据传输服务(DTS)是一项专注于数据迁移和同步的云服务,在使用过程中可能遇到多种问题,本合集精选常见的DTS数据传输问题及其答疑解惑,以助用户顺利实现数据流转。
|
4月前
DTS数据传输延迟可能有多种原因
【1月更文挑战第16天】【1月更文挑战第79篇】DTS数据传输延迟可能有多种原因
249 2
|
4月前
|
NoSQL Redis 数据库
数据传输DTS中金融云跨账号同步Redis,增量校验报错了
【1月更文挑战第16天】【1月更文挑战第80篇】数据传输DTS中金融云跨账号同步Redis,增量校验报错了
100 1
|
1月前
|
存储 安全 关系型数据库
跨越地域的数据传输大冒险!如何轻松更换DTS实例地域,全面攻略揭秘!
【8月更文挑战第15天】在数字时代的浪潮中,数据传输服务(DTS)是企业跨地域扩张的重要桥梁。然而,更换DTS实例地域就像是一场冒险旅程,充满了未知和挑战。本文将带你踏上这场跨越地域的数据传输大冒险,揭示如何轻松更换DTS实例地域的秘密。无论你是追求速度的迁移高手,还是成本敏感的手动操作者,这里都有你需要的答案。让我们一起探索这个神秘的世界,解锁数据传输的无限可能!
33 0
|
20天前
|
关系型数据库 MySQL OLAP
数据传输DTS是什么?
【8月更文挑战第30天】数据传输DTS是什么?
46 3