BL618评估版教程第四篇:使用DMA传输数据
DMA传输时DMA控制器得到总线的控制权,完成对数据的传输而不需要CPU的参与。此时CPU可以完成其他任务,所以可以降低CPU负载,提高性能。
目标
使用DMA控制数据传输
实现过程
代码在官方例程中的examples\peripherals\dma\dma_normal
的基础上进行改动。
原代码如图所示在内存中分配了六块区域作为三组数据的起止点。其中src意味source,dst意为destination,src1与dst1对应,以此类推。
但是测试时为了简单,可以只传输一组,并且信息更改为可以被串口调试助手正常显示的字母(这里使用的是微软商店下载的串口调试助手)。代码如下
#include "bflb_mtimer.h"
#include "bflb_dma.h"
#define DMA_BUFFER_LENGTH 4100
extern void board_init(void);
static ATTR_NOCACHE_NOINIT_RAM_SECTION uint8_t src1_buffer[DMA_BUFFER_LENGTH];
static ATTR_NOCACHE_NOINIT_RAM_SECTION uint8_t dst1_buffer[DMA_BUFFER_LENGTH];
static uint8_t dma_tc_flag0 = 0;
struct bflb_device_s *dma0_ch0;
void dma0_ch0_isr(void *arg)
{
dma_tc_flag0++;
printf("tc done\r\n");
}
void sram_init()
{
uint32_t i;
memset(src1_buffer, 'a', DMA_BUFFER_LENGTH);
src1_buffer[0] = 'A';
src1_buffer[1] = 'B';
src1_buffer[2] = 'C';
src1_buffer[3] = 'D';
src1_buffer[4] = 'E';
memset(dst1_buffer, 'b', DMA_BUFFER_LENGTH);
}
为了适配一组数据,main函数中也需要进行修改,框出的行中需要将3改成1。
最后在main中插入printf函数,虽然传输完成本来就会print tc done
,但显示内存中的具体内容更加直观。在初始化内存之后和传输完成之后加入如下代码,这会print传输前后,source和destination中的内容。
printf ("Source: ");
for (int i = 0; i < 5; i ++)
{
printf ("%c", src1_buffer[i]);
}
printf ("\n");
printf ("Destination: ");
for (int i = 0; i < 5; i ++)
{
printf ("%c", dst1_buffer[i]);
}
printf ("\n");
如下图所示完成编译后,使用博流工具进行烧写,具体操作过程参见BL618的Windows CMD环境搭建 VS Code+RISC-V 工具链+BL_MCU_SDK
结果
因为在初始化时我在destination中填满了b,所以一开始显示内容为b,传输完成后source和destination中内容一致,证明DMA工作正常