gd32DMA配置

#include"stdio.h"
#include"gd32f30x.h"
#include"keydiver.h"
   unsigned char data0[10]={1,2,3,4,5,6,7,8,9,0};
		unsigned char  data1[10]={0};
		dma_parameter_struct dmacfg;
		unsigned char* pdata=0;
		unsigned char data2[10]={0};
void DMA0_Channel0_IRQHandler()
{
		if(dma_interrupt_flag_get(DMA0,DMA_CH0,DMA_INT_FLAG_FTF)){
			dma_interrupt_flag_clear(DMA0,DMA_CH0,DMA_INT_FLAG_FTF);}
		//dmacfg.number++  //cannot corect devise
//		dma_channel_disable(DMA0,DMA_CH0);
//			dmacfg.memory_addr=(uint32_t)pdata;
//		    dmacfg.memory_width = DMA_MEMORY_WIDTH_8BIT;
//dma_init(DMA0,DMA_CH0,&dmacfg);
//			dma_channel_enable(DMA0,DMA_CH0);
			data0[0]++;
		
}
int main()
{
	  pdata=data2;
		rcu_periph_clock_enable(RCU_DMA0);
		
	  dma_deinit(DMA0,DMA_CH0);
		dma_memory_to_memory_enable(DMA0,DMA_CH0);
	  dma_struct_para_init(&dmacfg);
	  dmacfg.periph_addr  =(uint32_t) data0;//shift addrss (uint32_t)
    dmacfg.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; 
    dmacfg.periph_inc   = DMA_PERIPH_INCREASE_ENABLE;
    dmacfg.memory_addr  = (uint32_t)data1;
    dmacfg.memory_width = DMA_MEMORY_WIDTH_8BIT;
    dmacfg.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
    dmacfg.number       = 10U;
    dmacfg.direction    = DMA_PERIPHERAL_TO_MEMORY;
    dmacfg.priority     = DMA_PRIORITY_LOW;
	  dma_init(DMA0,DMA_CH0,&dmacfg);
	dma_interrupt_enable(DMA0,DMA_CH0,DMA_INT_FLAG_FTF);
	nvic_irq_enable(DMA0_Channel0_IRQn,2,2);
	dma_circulation_enable(DMA0,DMA_CH0);
	dma_channel_enable(DMA0,DMA_CH0);
	  while(!dma_flag_get(DMA0,DMA_CH0,DMA_FLAG_FTF));
	while(1){}
	
	
}

首先配置DMA,将data0作为外设地址,外设和内存都设置8个字长,外设地址自增,内存地址自增,传输10次,方向是外设到内存,配置循环模式,传输优先级为低,打开dma的中断,先等待dma发送完成,此时data1已经被赋值,然后进入中断,先失能dma通道,不然直接修改不起作用,然后可以将内存地址改为pdata,这样就向pdata赋值,然后初始化,使能通道就可以成功的向pdata赋值啦

### 关于GD32E103微控制器DMA配置方法 对于GD32E103系列微控制器而言,其DMA(Direct Memory Access, 直接存储器访问)模块允许数据传输不经过CPU干预而直接发生在外设之间或是内存与外设间。这不仅提高了效率还减轻了处理器负担。 #### 配置USART接收端口使用DMA的具体实现方式如下: 定义头文件`bsp_dma.h`用于封装DMA初始化函数及相关宏定义[^1]。此文件包含了必要的硬件资源声明以及对外提供了一个名为`USART_RX_DMA_Config()`的接口来设置串行通信接收模式下的DMA操作参数。 ```c #ifndef __BSP_DMA_H #define __BSP_DMA_H #include "gd32e10x.h" // 定义使用的DMA设备及其通道号 #define USART_RX_DMA DMA0 #define USART_RX_DMA_CHANNEL DMA_CH5 #define USART_RX_DMA_CLOCK RCU_DMA0 #define USART_DR_ADDRESS (USART1_BASE + 0x04) /** * @brief 初始化并启动基于DMA的USART接收过程. * * @param Memory_Base_Address 接收缓冲区首地址指针 * @param Transfer_Number 要传输的数据量大小(字节数) */ void USART_RX_DMA_Config(uint8_t* Memory_Base_Address,uint8_t Transfer_Number); #endif /* __BSP_DMA_H */ ``` 实际应用中还需要编写对应的源码文件`.c`去完成具体的寄存器级配置工作,比如使能时钟、设定优先级等细节处理。此外,在其他项目文档里也有关于如何利用ADC配合USART打印输出的信息可供参考[^2]。 考虑到不同应用场景下可能涉及到更多复杂的外围电路连接情况,因此建议开发者仔细阅读官方提供的技术手册了解更详尽的功能描述和最佳实践指南[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值