基于stm32F103VET6的DMA

一、什么是DMA 

1、M to M:FLASH to SRAM,把内部FLASH的数据传输到内部的SRAM(FLASH最常用来存储代码)。

2、M to P:SRAM to 串口,DMA的传数据不需要占用CPU。

3、M to M 的编程要点

(1).在FLASH 中定义好要传输的数据,在SRAM中定义好用来接收FLASH数据的变量。

(2).初始化DMA,主要是配置DMA初始化结构体。

(3).编写比较函数。

(4).编写main函数。

二、各个通道的DMA请求

三、DMA的仲裁器 

四、DMA初始化结构体

1、DMA初始化结构体各成员介绍

要注意的是外设地址和寄存器地址都是32位的。只有寄存器到寄存器的模式才使能M2M,传输方向一是外设作为源,二是外设作为目的地。外设的数据宽度与寄存器数据宽度一样。

2、DMA初始化结构体各成员功能

 五、寄存器到串口程序演示DMA的作用

1、DMA的初始化

#include "dma_mtop.h"
//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;

//Memory ->P(USART->DR) 地址偏移 0x04

/* 定义DMA传输目标存储器
 * 存储在内部的SRAM中																		
 */
uint8_t Send_Buffer[BUFFER1_SIZE];

void MYDMA_MTOP_Init(void)
{
	//打开DMA1的时钟
	RCC_AHBPeriphClockCmd(MTP_DMA_CLK,ENABLE);
	//初始化DMA
	DMA_InitTypeDef DMA_InitStruct;
	DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)USART_DR_ADRESS;
	DMA_InitStruct.DMA_MemoryBaseAddr     = (uint32_t)Send_Buffer;
	DMA_InitStruct.DMA_DIR                = DMA_DIR_PeripheralDST;
	DMA_InitStruct.DMA_BufferSize         = BUFFER1_SIZE;
	DMA_InitStruct.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
	DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//4个字节32位
	DMA_InitStruct.DMA_MemoryInc          = DMA_MemoryInc_Enable;
	DMA_InitStruct.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
	DMA_InitStruct.DMA_Mode               = DMA_Mode_Normal;
	DMA_InitStruct.DMA_Priority           = DMA_Priority_High;//由于这里只使用了DAM1这一个通道所以优先级可随意配置,当使用多个通道时则需要比较通道的大小,通道越小优先级越高。且DAM1的优先级大于DMA2的优先级。
	DMA_InitStruct.DMA_M2M                = DMA_M2M_Disable;
	DMA_Init(MTP_DMA_Channel, &DMA_InitStruct);//MtoM模式下,通道可任意选择
	DMA_ClearFlag(MTP_DMA_FLAG_TC);
	DMA_Cmd(MTP_DMA_Channel, ENABLE);
}
#include "stm32f10x.h"
// 要发送的数据大小
#define BUFFER1_SIZE     5000	

#define  MYDMA1 1
#define  MYDMA2 0
#if      MYDMA1
#define  MTP_DMA_CLK  RCC_AHBPeriph_DMA1
#elif    MYDMA2 
#define  MTP_DMA_CLK  RCC_AHBPeriph_DMA2
#endif 

#define  MTP_DMA_Channel  DMA1_Channel4
#define  MTP_DMA_FLAG_TC  DMA1_FLAG_TC4
#define  USART_DR_ADRESS  (USART1_BASE+0x04)

void MYDMA_MTOP_Init(void);
#endif

六、验证

void MtoP(void)
{
    for(uint16_t i=0;i<BUFFER1_SIZE;i++)
	{
		Send_Buffer[i] = 'A';
	}
	MYDMA_MTOP_Init();
	USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE);
}

int main(void)
{
	LED_GPIO_Config();
	KEY_Init();
	KEYPA0_EXTI_Init();
	Myusart_Init();	
	MtoP();
	while(1)
	{
		LED_RED_TOGGLE();
		Delay(0xFFFFFF);
	}
}

首先我们将Send_Buffer[BUFFER1_SIZE]这个数组赋值是每一个元素都为A,然后调用MYDMA_MTOP_Init()这个初始化函数,然后使能串口DMA函数(USART_DMACmd),最后在while(1)中的调用小灯翻转函数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于STM32F103VET6的设计可以涉及到很多应用,下面我将介绍一种可能的设计方案。 STM32F103VET6是一款基于ARM Cortex-M3内核的微控制器,具有72MHz的主频和512KB的Flash存储空间。它集成了丰富的外设接口,包括多个串行通信接口(如UART、SPI、I2C)、模拟输入输出接口(如ADC、DAC)、定时器等,并且支持多种外部设备的协议,如USB、CAN等。 以智能家居系统为例,我们可以将STM32F103VET6用于设计一个控制中心。这个控制中心通过串行通信接口与各个智能设备(如灯光、门锁、温湿度传感器等)连接,并通过WiFi或蓝牙与用户的手机或电脑进行通信。 首先,我们可以使用STM32F103VET6的UART接口与各个智能设备进行通信。我们可以将每个设备连接到一个UART引脚,并采用相应的通信协议来进行控制和数据交换。例如,我们可以通过UART来向灯光设备发送指令控制其开关和亮度,或是接收温湿度传感器的数据。 其次,我们可以使用STM32F103VET6的GPIO和ADC接口来接收来自用户的输入。通过按钮或旋转开关等输入设备,用户可以向控制中心发送指令。通过ADC接口,我们可以接收模拟信号,如光敏传感器的光照强度,用于自动化控制。 最后,我们可以通过STM32F103VET6的WiFi或蓝牙接口与用户的手机或电脑进行通信。通过这种方式,用户可以通过APP或网页来远程控制智能家居设备。STM32F103VET6可以作为一个嵌入式Web服务器,接收来自用户的指令,并通过UART接口发送给相应的设备。同时,STM32F103VET6也可以向用户传输传感器数据,让用户可以随时了解家里的温度、湿度以及其他信息。 综上所述,基于STM32F103VET6的设计可以实现智能家居系统中控制中心的功能。通过它的丰富接口和强大的处理能力,我们可以方便地实现各种智能设备之间的通信和控制。 ### 回答2: stm32f103vet6是一款基于ARM Cortex-M3内核的高性能微控制器。它具有丰富的外设和强大的计算能力,非常适用于各种嵌入式系统设计。 在基于stm32f103vet6的设计中,首先需要了解该微控制器的主要特点和功能。它具有72MHz的主频,512KB的闪存和64KB的SRAM,可以满足大多数嵌入式应用的需求。此外,它还集成了多个串行接口(如USART、SPI和I2C)、通用定时器和PWM输出等常用外设,方便了与外部设备的通信和控制。 基于stm32f103vet6的设计通常需要先进行电路设计和原理图绘制。可以根据具体需求选择合适的外设和接口,并将它们与stm32f103vet6连接起来。例如,如果需要与传感器进行数据交互,可以选择合适的GPIO引脚作为数据线,并通过SPI或I2C接口进行通信。接着,根据原理图进行电路板的设计和制作。 在设计的同时,还需要考虑软件开发。stm32f103vet6支持多种开发环境,如Keil MDK和STM32CubeIDE。在软件开发中,需要编写代码来配置和控制各个外设,实现系统的各项功能。可以使用C语言或汇编语言来编程,根据需要选择合适的编程方法。 此外,还需要进行系统测试和调试。通过连接上开发板和外部设备,进行各项功能测试和性能评估。如果出现问题,需要通过调试工具(如Oscilloscope和串口调试助手)来进行故障排查。 综上所述,基于stm32f103vet6的设计需要进行电路设计、软件开发、系统测试等步骤。它具有强大的性能和丰富的外设,适用于各种嵌入式系统,例如智能家居、工业自动化等。 ### 回答3: 基于STM32F103VET6的设计是一种基于ARM Cortex-M3内核的嵌入式系统设计,其具有高性能和低功耗的特点。它采用了72MHz的主频,具有512KB的Flash存储器和64KB的SRAM,可以满足各种复杂的应用需求。 STM32F103VET6可以用于各种各样的应用,例如工业自动化、智能家居、医疗设备和消费类电子产品等。它能够支持多种通信接口,包括UART、SPI、I2C和USB,方便与外部设备进行数据交互。 在设计中,可以使用STM32CubeMX软件进行硬件的配置和引脚映射,使得系统的搭建更加简单和快捷。同时,STM32F103VET6还提供了丰富的外设功能,如定时器、ADC和DMA等,可以满足不同应用的需求。 在软件开发方面,可以使用Keil MDK等集成开发环境进行程序的编写和调试。STM32F103VET6的编程语言可以选择C语言或者汇编语言进行开发。此外,ST公司还提供了一系列的开发板和示例代码,方便开发者快速上手并且加速项目的进展。 总体而言,基于STM32F103VET6的设计具有高性能、低功耗和灵活性的特点。通过合理的硬件配置和编程开发,可以实现多种不同应用的嵌入式系统设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值