织梦门户网站源码,沈阳网站排名优化,做电影电视剧网站推广,做一个商城网站多少钱我用的是正点的STM32F103来进行学习#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话#xff0c;用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验#xff08;1#xff09;DMA结构体解释#xff08;2… 我用的是正点的STM32F103来进行学习板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验1DMA结构体解释2DMA结构体初始化3程序验证 2、DMA 存储器到外设模式实验1串口初始化2DMA结构体初始化3程序验证 三、DMA程序验证
1、DMA 存储器到存储器模式实验
1DMA结构体解释
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;DMA_PeripheralBaseAddr 外设地址设定 DMA_CPAR 寄存器的值一般设置为外设的数据寄存器地址如果是存储器到存储器模式则设置为其中一个存储器地址。 DMA_Memory0BaseAddr 存储器地址设定 DMA_CMAR 寄存器值一般设置为我们自定义存储区的首地址。 DMA_DIR 传输方向选择可选外设到存储器、存储器到外设。它设定 DMA_CCR 寄存器的DIR[1:0] 位的值。这里并没有存储器到存储器的方向选择当使用存储器到存储器时只需要把其中一个存储器当作外设使用即可。 DMA_BufferSize 设定待传输数据数目初始化设定 DMA_CNDTR 寄存器的值。 这个DMA_BufferSize 就是要传输的次数。 这个并不是指字节大小而是指DMA的传输次数传输的字节大小由DMA_PeripheralDataSize设置。 DMA传输数据时从DMA_MemoryBaseAddr0地址开始放直到DMA_MemoryBaseAddrDMA_BufferSize-1此时 DMA_CNDTR 变成0传输结束。 DMA_PeripheralInc 如果配置为 DMA_PeripheralInc_Enable使能外设地址自动递增功能它设定 DMA_CCR 寄存器的 PINC 位的值一般外设都是只有一个数据寄存器所以一般不会使能该位。 DMA_MemoryInc 如果配置为 DMA_MemoryInc_Enable使能存储器地址自动递增功能它设定 DMA_CCR 寄存器的 MINC 位的值我们自定义的存储区一般都是存放多个数据的所以要使能存储器地址自动递增功能。 DMA_PeripheralDataSize 外设数据宽度可选字节 (8 位)、半字 (16 位) 和字 (32 位)它设定DMA_CCR 寄存器的 PSIZE[1:0] 位的值。 DMA_MemoryDataSize 存储器数据宽度可选字节 (8 位)、半字 (16 位) 和字 (32 位)它设定DMA_CCR 寄存器的 MSIZE[1:0] 位的值。当外设和存储器之间传数据时两边的数据宽度应该设置为一致大小。 DMA_Mode DMA 传输模式选择可选一次传输Normal或者循环传输Circular它设定 DMA_CCR 寄存器的CIRC 位的值。例程我们的 ADC 采集是持续循环进行的所以使用循环传输模式。 DMA_Priority 软件设置通道的优先级有 4 个可选优先级分别为非常高、高、中和低它设定 DMA_CCR 寄存器的 PL[1:0] 位的值。DMA 通道优先级只有在多个 DMA 通道同时使用时才有意义如果是单个通道优先级可以随便设置。 DMA_M2M 存储器到存储器模式使用存储器到存储器时用到设定 DMA_CCR 的位 14 MEN2MEN 即可启动存储器到存储器模式。
2DMA结构体初始化 DMA_InitTypeDef DMA_InitStructure;// 开启DMA时钟RCC_AHBPeriphClockCmd(DMA_CLOCK, ENABLE);// 源数据地址DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)ShuZu_YouShu; //数组有32个数每个数都是一个字且使用const定义(存储在FLASH)// 目标地址DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)ShuZu_MeiShu; //数组有32个数每个数都是一个字// 方向外设到存储器这里的外设是内部的FLASH DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralSRC;// 传输大小 DMA_InitStructure.DMA_BufferSize 32; //因为数组有32个数所以设32// 外设内部的FLASH地址递增 DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Enable;// 内存地址递增DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable;// 外设数据单位 DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_Word; //因为每个数大小都是一个字所以宽度设为Word// 内存数据单位DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_Word; //因为每个数大小都是一个字所以宽度设为Word// DMA模式一次或者循环模式DMA_InitStructure.DMA_Mode DMA_Mode_Normal ; //一次传输模式//DMA_InitStructure.DMA_Mode DMA_Mode_Circular; // 优先级高 DMA_InitStructure.DMA_Priority DMA_Priority_High;// 使能内存到内存的传输DMA_InitStructure.DMA_M2M DMA_M2M_Enable; //因为本次是FLASH传输到SRAM所以是存储器到存储器// 配置DMA通道 DMA_Init(DMA_CHANNEL, DMA_InitStructure);//清除DMA数据流传输完成标志位DMA_ClearFlag(DMA_FLAG_TC);// 使能DMADMA_Cmd(DMA_CHANNEL,ENABLE);其中
需开启DMA时钟才能使用DMA功能
// 开启DMA时钟
RCC_AHBPeriphClockCmd(DMA_CLOCK, ENABLE);ShuZu_YouShu定义如下
uint32_t ShuZu_YouShu[32] {0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80};需清除 DMA 标志位后再使用DMA功能防止不必要的干扰
//清除DMA数据流传输完成标志位DMA_ClearFlag(DMA_FLAG_TC);3程序验证
DMA传输过后在DEBUG界面可以看到ShuZu_YouShu的数字传输到了ShuZu_MeiShu中
2、DMA 存储器到外设模式实验
具体实验为 将数组中的数字 传输至 串口
1串口初始化 代码解释均放入注释中正文不再复述 /*** brief USART GPIO 配置,工作参数配置* param 无* retval 无*/
void USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打开串口GPIO的时钟DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打开串口外设的时钟DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 将USART Tx的GPIO配置为推挽复用模式GPIO_InitStructure.GPIO_Pin DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, GPIO_InitStructure);// 将USART Rx的GPIO配置为浮空输入模式GPIO_InitStructure.GPIO_Pin DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, GPIO_InitStructure);// 配置串口的工作参数// 配置波特率 为 115200USART_InitStructure.USART_BaudRate 115200;// 配置 数据字长 为 8USART_InitStructure.USART_WordLength USART_WordLength_8b;// 配置 停止位 为 1USART_InitStructure.USART_StopBits USART_StopBits_1;// 配置 校验位 为 0USART_InitStructure.USART_Parity USART_Parity_No ;// 配置硬件流控制USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None;// 配置工作模式收发一起USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx;// 完成串口的初始化配置USART_Init(DEBUG_USARTx, USART_InitStructure); // 使能串口USART_Cmd(DEBUG_USARTx, ENABLE);
}2DMA结构体初始化
因为数据是从存储器到串口所以设置存储器为源地址串口的数据寄存器为目标地址。 要发送的数据有很多且都先存储在存储器中则存储器地址指针递增串口数据寄存器只有一个则外设地址地址不变。 两边数据单位设置成一致传输模式可选一次或者循环传输只有一个 DMA 请求优先级随便设。 最后调用 DMA_Init 函数把这些参数写到 DMA 的寄存器中然后使能 DMA开始传输。
void USARTx_DMA_Config(void)
{DMA_InitTypeDef DMA_InitStructure;// 开启DMA时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);// 设置DMA源地址串口数据寄存器地址*/DMA_InitStructure.DMA_PeripheralBaseAddr USART_DR_ADDRESS;// 内存地址(要传输的变量的指针)DMA_InitStructure.DMA_MemoryBaseAddr (u32)ShuZu_YouShu;// 方向从内存到外设 DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralDST;// 传输数量DMA_InitStructure.DMA_BufferSize 5000; // 传输数量 设为 5000这个数随便设只要不超过数组大小就可// 外设地址不增 DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable;// 内存地址自增DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable;// 外设数据单位 DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_Byte; //因为每次传输1bit所以设为Byte// 内存数据单位DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_Byte; //因为每次传输1bit所以设为Byte// DMA模式一次或者循环模式DMA_InitStructure.DMA_Mode DMA_Mode_Normal ; //一次传输模式//DMA_InitStructure.DMA_Mode DMA_Mode_Circular; // 优先级中 DMA_InitStructure.DMA_Priority DMA_Priority_Medium; // 禁止内存到内存的传输DMA_InitStructure.DMA_M2M DMA_M2M_Disable;// 配置DMA通道 DMA_Init(USART_TX_DMA_CHANNEL, DMA_InitStructure); // 使能DMADMA_Cmd (USART_TX_DMA_CHANNEL,ENABLE);
}其中
外设地址DMA_PeripheralBaseAddr为串口地址需查阅开发手册即
// 外设寄存器地址
#define PERIPH_BASE ((uint32_t)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE 0x10000)
#define USART1_BASE (APB2PERIPH_BASE 0x3800)
#define USART_DR_ADDRESS (USART1_BASE0x04)ShuZu_YouShu数组填充为 A-Z共26个字母再加一个回车 /*填充将要发送的数据*/for(i0; i 5000; i){ShuZu_YouShu[i] A i%27;if(ShuZu_YouShu[i] [){ShuZu_YouShu[i] \n;}}3程序验证
使用USART_DMACmd函数打开USART 的DMA请求。
/* USART1 向 DMA发出TX请求 */USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);它接收三个参数
第一个参数用于设置串口外设可以是 USART1/2/3 和 UART4/5 这 5 个参数可选。第二个参数设置串口的具体 DMA 请求有串口发送请求 USART_DMAReq_Tx 和接收请求 USART_DMAReq_Rx 可选。第三个参数用于设置启动请求 ENABLE 或者关闭请求 DISABLE。
运行该函数后 USART 的DMA 发送传输就开始了根据配置存储器的数据会发送到串口。
验证结果如下 文章转载自: http://www.morning.znnsk.cn.gov.cn.znnsk.cn http://www.morning.zfxrx.cn.gov.cn.zfxrx.cn http://www.morning.bpmnx.cn.gov.cn.bpmnx.cn http://www.morning.yllym.cn.gov.cn.yllym.cn http://www.morning.qhvah.cn.gov.cn.qhvah.cn http://www.morning.qxjck.cn.gov.cn.qxjck.cn http://www.morning.xyrss.cn.gov.cn.xyrss.cn http://www.morning.sglcg.cn.gov.cn.sglcg.cn http://www.morning.kkjhj.cn.gov.cn.kkjhj.cn http://www.morning.krdb.cn.gov.cn.krdb.cn http://www.morning.wnkjb.cn.gov.cn.wnkjb.cn http://www.morning.fwrr.cn.gov.cn.fwrr.cn http://www.morning.lhxrn.cn.gov.cn.lhxrn.cn http://www.morning.cmfkp.cn.gov.cn.cmfkp.cn http://www.morning.jjhrj.cn.gov.cn.jjhrj.cn http://www.morning.tllws.cn.gov.cn.tllws.cn http://www.morning.sqdjn.cn.gov.cn.sqdjn.cn http://www.morning.4r5w91.cn.gov.cn.4r5w91.cn http://www.morning.dhqg.cn.gov.cn.dhqg.cn http://www.morning.qhkx.cn.gov.cn.qhkx.cn http://www.morning.qxmpp.cn.gov.cn.qxmpp.cn http://www.morning.glkhx.cn.gov.cn.glkhx.cn http://www.morning.nyplp.cn.gov.cn.nyplp.cn http://www.morning.smtrp.cn.gov.cn.smtrp.cn http://www.morning.djpps.cn.gov.cn.djpps.cn http://www.morning.smxrx.cn.gov.cn.smxrx.cn http://www.morning.xnpml.cn.gov.cn.xnpml.cn http://www.morning.pgmbl.cn.gov.cn.pgmbl.cn http://www.morning.hyjpl.cn.gov.cn.hyjpl.cn http://www.morning.oumong.com.gov.cn.oumong.com http://www.morning.xhrws.cn.gov.cn.xhrws.cn http://www.morning.zztmk.cn.gov.cn.zztmk.cn http://www.morning.kmqwp.cn.gov.cn.kmqwp.cn http://www.morning.mjtft.cn.gov.cn.mjtft.cn http://www.morning.wjndl.cn.gov.cn.wjndl.cn http://www.morning.tmzlt.cn.gov.cn.tmzlt.cn http://www.morning.qscsy.cn.gov.cn.qscsy.cn http://www.morning.fcqlt.cn.gov.cn.fcqlt.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.dqgbx.cn.gov.cn.dqgbx.cn http://www.morning.zqkr.cn.gov.cn.zqkr.cn http://www.morning.mkydt.cn.gov.cn.mkydt.cn http://www.morning.mkbc.cn.gov.cn.mkbc.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.mbqyl.cn.gov.cn.mbqyl.cn http://www.morning.mnygn.cn.gov.cn.mnygn.cn http://www.morning.kgltb.cn.gov.cn.kgltb.cn http://www.morning.weiwt.com.gov.cn.weiwt.com http://www.morning.xfxqj.cn.gov.cn.xfxqj.cn http://www.morning.tmfm.cn.gov.cn.tmfm.cn http://www.morning.tpchy.cn.gov.cn.tpchy.cn http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn http://www.morning.hrtfz.cn.gov.cn.hrtfz.cn http://www.morning.hclplus.com.gov.cn.hclplus.com http://www.morning.kydrb.cn.gov.cn.kydrb.cn http://www.morning.tnhqr.cn.gov.cn.tnhqr.cn http://www.morning.pnbls.cn.gov.cn.pnbls.cn http://www.morning.ghqyr.cn.gov.cn.ghqyr.cn http://www.morning.pdbgm.cn.gov.cn.pdbgm.cn http://www.morning.kscwt.cn.gov.cn.kscwt.cn http://www.morning.ylqb8.cn.gov.cn.ylqb8.cn http://www.morning.fwnyz.cn.gov.cn.fwnyz.cn http://www.morning.bkryb.cn.gov.cn.bkryb.cn http://www.morning.nrbcx.cn.gov.cn.nrbcx.cn http://www.morning.mprtj.cn.gov.cn.mprtj.cn http://www.morning.rkdnm.cn.gov.cn.rkdnm.cn http://www.morning.rrqgf.cn.gov.cn.rrqgf.cn http://www.morning.nykzl.cn.gov.cn.nykzl.cn http://www.morning.fbdkb.cn.gov.cn.fbdkb.cn http://www.morning.tfgkq.cn.gov.cn.tfgkq.cn http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn http://www.morning.gxwyr.cn.gov.cn.gxwyr.cn http://www.morning.wdprz.cn.gov.cn.wdprz.cn http://www.morning.jlgjn.cn.gov.cn.jlgjn.cn http://www.morning.qsxxl.cn.gov.cn.qsxxl.cn http://www.morning.rwxnn.cn.gov.cn.rwxnn.cn http://www.morning.taojava.cn.gov.cn.taojava.cn http://www.morning.kpxky.cn.gov.cn.kpxky.cn http://www.morning.jykzy.cn.gov.cn.jykzy.cn http://www.morning.crsnb.cn.gov.cn.crsnb.cn