时间:2025-12-15 11:09
人气:
作者:admin
19.7.1.3
定义传输源和目标存储器
首先,要使用DMA传输,就肯定要有一个源地址和一个目标地址,这里我们定义SRC_Buffer数组的首地址作为源地址,DST_Buffer数组的首地址作为DMAC传输的目标地址。SRC_Buffer数组由于有const声明为常量,因此其数据存储在内部Flash 中,DST_Buffer为普通的全局变量,其数据存储在RAM中。这两个数组的大小由宏定义BUFFER_SIZE来决定。
列表2:代码清单20‑1 定义传输源和目标存储器
左右滑动查看完整内容
// 用户要发送的数据大小
#defineBUFFER_SIZE 32
/**
* 定义 SRC_Buffer 数组作为 DMAC 传输数据源
* const 关键字将 SRC_Buffer 数组变量定义为常量类型,数据存储在内部的 FLASH 中
*/
constuint32_tSRC_Buffer[BUFFER_SIZE] = {
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};
/**
* 定义 DMAC 传输目标存储器
* 存储在内部的 SRAM 中
*/
uint32_tDST_Buffer[BUFFER_SIZE] = {0};
19.7.1.4
设置源地址和目标地址函数
DMAC传输的配置,可以选择在FSP配置界面中进行配置,但是要注意,在FSP配置界面中进行配置的话是不方便配置传输地址的,所以此时我们其实还没有配置传输的源地址和目标地址,这部分需要在代码里面配置。
列表3:代码清单20‑2 设置源地址和目标地址函数
左右滑动查看完整内容
/* 设置传输的源地址和目的地址 */
voidset_transfer_dst_src_address(transfer_cfg_tconst *constp_config,
voidconst * volatile p_src,
voidconst * volatile p_dest )
{
p_config->p_info->p_src = (void*) p_src;
p_config->p_info->p_dest = (void*) p_dest;
}
19.7.1.5
使用FSP配置器生成的配置
前面我们在FSP配置界面上的配置其实是保存在hal_data.c文件中。如下图所示。

我们完全可以在hal_data.c文件中找到定义好的数据,重新复制一份,再改个变量名,在此基础上重新配置各个参数。在本例程中也使用了这种方法,主要是为了使用宏去方便切换不同模式的配置代码,在代码中配置DMAC。在头文件“bsp_dmac_m2m.h”中,默认定义了USE_MY_TRANSFER_INFOR_CONFIG来选择使用我们在代码里自定义的传输信息配置,但是现在让我们先注释掉这个宏定义,从而选择使用在FSP配置界面上的配置。
下面的是与我们之前在FSP配置界面上的配置等效的配置代码:
列表4:代码清单20‑3与FSP配置界面上的配置等效的配置代码
左右滑动查看完整内容
/* FSP 配置界面的传输信息配置(正常传输模式)等效于下面 fsp_transfer_info_normal 里
的配置(除了源地址和目标地址)
源地址和目标地址在 FSP 配置界面设置的话不太方便,我们会在 DMAC_Init 函数里设置。
关于偏移值(Offset value)和源缓冲大小(Source Buffer Size),在 transfer_info_
→t 里没有这两项设置,建议在 FSP 配置界面设置
- 偏移值只有在地址模式是偏移模式的情况下才会用到;
- 而源缓冲大小与之相关的功能本例程不会涉及到,所以暂不考虑。
下面的 fsp_transfer_info_normal 仅作为对比参考,在本例程中是没有用到的。
*/
//transfer_info_t fsp_transfer_info_normal =
//{
// .transfer_settings_word_b.dest_addr_mode = TRANSFER_ADDR_MODE_FIXED,␣
→//每次传输后,目标地址指针固定不变
// .transfer_settings_word_b.repeat_area = TRANSFER_REPEAT_AREA_
→SOURCE,//源区域重复 (正常模式下无效)
// .transfer_settings_word_b.irq = TRANSFER_IRQ_END, ␣
→//传输完成后中断
// .transfer_settings_word_b.chain_mode = TRANSFER_CHAIN_MODE_
→DISABLED,//不使能(DMAC 没有该功能,仅 DTC 有)
// .transfer_settings_word_b.src_addr_mode = TRANSFER_ADDR_MODE_FIXED,␣
→//每次传输后,源地址指针固定不变
// .transfer_settings_word_b.size = TRANSFER_SIZE_2_BYTE, ␣
→//每次传输 2 字节
// .transfer_settings_word_b.mode = TRANSFER_MODE_NORMAL, ␣
→//正常传输模式
// .p_dest = (void *) DST_Buffer, ␣
→//目标地址
// .p_src = (void const *) SRC_Buffer,
→//源地址
// .num_blocks = 0, //指定传输的块数(正常模式下无效,仅在重复、块或
重复-块模式下有效)
// .length = 1, //指定传输的长度(即正常和重复模式下的传输次数␣
→或 块和重复-块模式下传输的块大小)
/