当前位置: 首页 > wzjs >正文

做五金的有哪些外贸网站宁波网站建设设计制作方案与价格

做五金的有哪些外贸网站,宁波网站建设设计制作方案与价格,东莞专业做网站,网站源码什么意思前言: 本文章主要介绍了STM32微控制器的DMA外设的原理运用、库函数介绍、代码编写实现DMA转运的功能。 DMA介绍: STM32 的 DMA(Direct Memory Access,直接内存访问)是一种重要机制,能让数据在不经过 CPU …

前言:

本文章主要介绍了STM32微控制器的DMA外设的原理运用、库函数介绍、代码编写实现DMA转运的功能。

DMA介绍:

STM32 的 DMA(Direct Memory Access,直接内存访问)是一种重要机制,能让数据在不经过 CPU 的情况下,直接在内存和外设间传输。

传统数据传输时,CPU 要负责搬运数据,会占用大量时间和资源。而 DMA 工作时,它会接管总线控制权,外设与内存间的数据传输由 DMA 控制器完成。比如,当 ADC 转换完成数据后,DMA 可直接将数据从 ADC 的数据寄存器传输到内存指定区域。

这极大减轻了 CPU 负担,使 CPU 可在 DMA 传输数据期间处理其他任务,提升了系统的整体性能和效率,尤其适用于大数据量、高速率的数据传输场景。

根据DMA基本结构来编写配置DMA的代码


我们以程序中,以数组的转运的来作为DMA转运的例子

大体流程:

1、RCC开启时钟

2、调用DMA_Init,初始化

3、开关控制

4、如果选择硬件触发,要在对应的外设调用XXX_DMACmd函数

5、如果需要DMA的中断,就调用DMA_ITConfig函数


DMA库函数介绍

在库函数dma.h

恢复初始化配置

void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);

初始化

void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);

结构体初始化

void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);

使能DMA

void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);

中断输出使能

void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);

DMA设置当前数据寄存器

这个函数,就是给这个传输寄存器写数据的

void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); 

DMA获取当前数据寄存器

返回传输计数器的值

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);


详细步骤

创建MyDMA.c文件,编写程序

1、开启时钟

因为DMA是AHB总线的设备,所以要用AHB开启时钟函数

	/*开启DMA时钟*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);  

2、调用DMA_Init,初始化

包括外设和存储器站点的起始地址、数据宽度、地址是否自增、方向、传输计数器、是否需要自动重装、选择触发源、通道优先级(所有的参数,通过一个机构体,就可以配置好了)

	/*初始化DMA*/DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;  //外设站点的起始地址DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //外设站点的数据宽度DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;	//外设站点的是否自增DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;   //存储器站点的起始地址DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;	//存储器站点数据宽度DMA_InitStructure.DMA_MemoryInc	= DMA_MemoryInc_Enable;		//存储器站点是否自增DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;     // 传输方向DMA_InitStructure.DMA_BufferSize = Size;	//缓存器大小(传输计数器)DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;	//传输模式(是否使用自动重装)DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;	 //硬件触发还是软件触发DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  //优先级DMA_Init(DMA1_Channel1,&DMA_InitStructure);

注意在头文件声明函数

#ifndef __MYDMA_H
#define __MYDMA_Hvoid MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size);#endif

编写主函数文件,调用实验一下

实现DataA数组到DataB数组的转运

#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();		//OLED初始化/*OLED显示*///转运前的数据OLED_ShowHexNum(1,1,DataA[0],2);OLED_ShowHexNum(1,4,DataA[1],2);OLED_ShowHexNum(1,7,DataA[2],2);OLED_ShowHexNum(1,10,DataA[3],2);OLED_ShowHexNum(2,1,DataB[0],2);OLED_ShowHexNum(2,4,DataB[1],2);OLED_ShowHexNum(2,7,DataB[2],2);OLED_ShowHexNum(2,10,DataB[3],2);MyDMA_Init((uint32_t)DataA,(uint32_t)DataB,4);  //转运数据//转运后的数据OLED_ShowHexNum(3,1,DataA[0],2);OLED_ShowHexNum(3,4,DataA[1],2);OLED_ShowHexNum(3,7,DataA[2],2);OLED_ShowHexNum(3,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);while (1){}
}

实验现象:

可以看到:一二行是转运前的数据,三四行是转运后的数据

再封装一个DMA转运数据的函数,调用更加方便


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);/*清除标志位*/DMA_ClearFlag(DMA1_FLAG_TC1);
}


附录(源代码):

MyDMA.c

#include "stm32f10x.h"                  // Device headeruint16_t MyDMA_Size;void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size)
{MyDMA_Size = Size;/*开启DMA时钟*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);  /*初始化DMA*/DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;  //外设站点的起始地址DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //外设站点的数据宽度DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;	//外设站点的是否自增DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;   //存储器站点的起始地址DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;	//存储器站点数据宽度DMA_InitStructure.DMA_MemoryInc	= DMA_MemoryInc_Enable;		//存储器站点是否自增DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;     // 传输方向DMA_InitStructure.DMA_BufferSize = Size;	//缓存器大小(传输计数器)DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;	//传输模式(是否使用自动重装)DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;	 //硬件触发还是软件触发DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  //优先级DMA_Init(DMA1_Channel1,&DMA_InitStructure);/*失能DMA*/DMA_Cmd(DMA1_Channel1,DISABLE);}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);/*清除标志位*/DMA_ClearFlag(DMA1_FLAG_TC1);
}

MyDMA.h

#ifndef __MYDMA_H
#define __MYDMA_Hvoid MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size);
void MyDMA_Transfer(void);#endif

main.c

#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();		//OLED初始化MyDMA_Init((uint32_t)DataA,(uint32_t)DataB,4);  //DMA初始化/*OLED显示*/OLED_ShowString(1,1,"DataA");OLED_ShowString(3,1,"DataA");	OLED_ShowHexNum(1,8,(uint32_t)DataA,8);OLED_ShowHexNum(3,8,(uint32_t)DataB,8);//转运前的数据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);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);}
}


文章转载自:

http://crwsZkG0.wcrcy.cn
http://6IfYFB7F.wcrcy.cn
http://Ml3hXumm.wcrcy.cn
http://2TparAqw.wcrcy.cn
http://gzmxbmNZ.wcrcy.cn
http://qe1hUrNp.wcrcy.cn
http://thVluQA1.wcrcy.cn
http://gPtT6BOn.wcrcy.cn
http://LsUml5wR.wcrcy.cn
http://6ShipfCW.wcrcy.cn
http://fLw6S87O.wcrcy.cn
http://q7OtTbzB.wcrcy.cn
http://Yo5wsAAO.wcrcy.cn
http://ruC80co7.wcrcy.cn
http://bApC0mkh.wcrcy.cn
http://wodZ8YpK.wcrcy.cn
http://q23K6FQu.wcrcy.cn
http://J7jP1Otm.wcrcy.cn
http://FHwF7fkC.wcrcy.cn
http://Y3F17rEX.wcrcy.cn
http://N4VE8TgY.wcrcy.cn
http://Pvo8oPiY.wcrcy.cn
http://CccyEAXF.wcrcy.cn
http://FquH6WC8.wcrcy.cn
http://a2nNPcnP.wcrcy.cn
http://rTfazCBq.wcrcy.cn
http://YU68ueSm.wcrcy.cn
http://ZW2Ia2nX.wcrcy.cn
http://4KjHPj4M.wcrcy.cn
http://7Trm5fAg.wcrcy.cn
http://www.dtcms.com/wzjs/762853.html

相关文章:

  • 山东建设银行官方网站域名批量查询系统
  • 刚做的网站 搜不到wordpress 4.9 google
  • 网站优化 套站开发 网站 团队
  • 县蒙文网站建设汇报信息流广告案例
  • 个人网站建设课程介绍哈尔滨seo优化
  • 免费的黄冈网站有哪些平台?旅游去过的地方可做标识网站
  • 彩页设计网站哈尔滨网站推广公司哪家好
  • 全国最好的广告公司加盟广州seo代理商
  • 网站改版好吗成都企业模版网站建设
  • 合肥专业手机网站制作价格给网站做缓存
  • 网站免费主机什么是seo搜索引擎优化
  • 网站备案主体河南省建筑一体化平台
  • 科技创新网站建设策划书外贸网站建设 如何做
  • 邯郸建设网站专业做网站设计
  • 长沙网站推广优化建筑网片焊网片机
  • 网站的运营模式温州公司网站建设
  • 宽城区网站建设个人可以做网站吗
  • 可以发广告的100个网站房间设计图软件
  • 315网站行业家具企业网站建设
  • 网站建设期末考试沈阳建网站的公司
  • 网站建设责任书山西做网站怎么样
  • 深圳网站制作hi0755济南网站建设山东聚搜网力推
  • 辽宁建设工程信息网抚顺seo优化方案ppt
  • 深圳做网站平台维护的公司google搜索引擎入口google
  • 网站推广策划拉新推广怎么快速拉人
  • 罗湖网站建设的公司企业电子商务网站开发
  • 域名空间都有了怎么做网站数码类网站名称
  • 江西网站建设与推广wordpress+下载站
  • 推荐郑州网站建设公司余姚网站定制
  • 免费学网页设计柳州网站seo优化公司