引言
在现代汽车电子系统中,大量的传感器数据、通信数据和控制信号需要在CPU、内存和外设之间高效传输。传统的CPU轮询方式不仅效率低下,还会占用大量的处理器资源。YTM32B1ME0x集成的16通道DMA(Direct Memory Access)控制器,为系统提供了强大的数据传输能力,能够在不占用CPU资源的情况下实现高效的数据搬移。
DMA系统架构概览
核心特性
YTM32B1ME0x的DMA系统具备以下核心特性:
硬件规格:
-
16个独立DMA通道:支持并发数据传输
-
128个硬件触发源:覆盖所有主要外设
-
灵活的数据宽度:支持8/16/32位数据传输
-
可配置的地址模式:支持地址递增、递减、保持不变
-
链式传输支持:通道间可以级联操作
-
循环传输模式:支持连续的数据流处理
传输模式:
-
软件触发:CPU直接启动传输
-
硬件触发:外设事件自动触发传输
-
链式触发:通道完成后触发下一个通道
DMA通道传输结构(CTS)
每个DMA通道都有一个专用的通道传输结构(Channel Transfer Structure),定义了传输的所有参数:
// DMA通道传输结构
typedef struct {
uint32_t source_addr; // 源地址
uint16_t source_offset; // 源地址偏移
uint16_t transfer_control; // 传输控制
uint32_t byte_count; // 字节计数
uint32_t source_last_offset; // 源最后偏移
uint32_t dest_addr; // 目标地址
uint16_t dest_offset; // 目标地址偏移
uint16_t trigger_count; // 触发计数
uint32_t dest_last_offset; // 目标最后偏移
uint16_t control_status; // 控制状态
uint16_t trigger_reload; // 触发重载值
} dma_cts_t;
DMA硬件触发源详解
触发源分类
YTM32B1ME0x提供了丰富的硬件触发源,覆盖了所有主要外设:
通信接口触发源:
| 触发源编号 | 外设 | 描述 |
|---|---|---|
| 8-9 | I2C1 | I2C1接收/发送请求 |
| 14-15 | SPI0 | SPI0接收/发送请求 |
| 16-17 | SPI1 | SPI1接收/发送请求 |
| 18-19 | SPI2 | SPI2接收/发送请求 |
| 20-27 | LINFlexD0-3 | LIN接收/发送请求 |
| 42-43 | ADC0-1 | ADC转换完成请求 |
定时器触发源:
| 触发源编号 | 外设 | 描述 |
|---|---|---|
| 28-35 | eTMR0-1 | 增强定时器通道事件 |
| 36-41 | pTMR0 | 周期定时器通道事件 |
| 44-51 | eTMR2-5 | 增强定时器通道事件 |
特殊触发源:
| 触发源编号 | 外设 | 描述 |
|---|---|---|
| 63 | Always On | 始终有效触发源 |
| 74-75 | HCU | 硬件加密单元 |
触发源配置
// DMA触发源配置
typedef enum {
DMA_TRIGGER_DISABLED = 0,
DMA_TRIGGER_I2C1_RX = 8,
DMA_TRIGGER_I2C1_TX = 9,
DMA_TRIGGER_SPI0_RX = 14,
DMA_TRIGGER_SPI0_TX = 15,
DMA_TRIGGER_ADC0 = 42,
DMA_TRIGGER_ADC1 = 43,
DMA_TRIGGER_ALWAYS_ON = 63
} dma_trigger_source_t;
void configure_dma_trigger(uint8_t channel, dma_trigger_source_t trigger) {
DMA0->CHMUX[channel] = trigger & 0x7F;
}
DMA配置与操作
基本DMA传输配置
// DMA传输配置结构
typedef struct {
void *source_addr; // 源地址
void *dest_addr; // 目标地址
uint32_t transfer_size; // 传输大小
uint8_t source_width; // 源数据宽度
uint8_t dest_width; // 目标数据宽度
int16_t source_offset; // 源地址偏移
int16_t dest_offset; // 目标地址偏移
dma_trigger_source_t trigger; // 触发源
bool enable_interrupt; // 中断使能
} dma_config_t;
// 配置DMA传输
void configure_dma_transfer(uint8_t channel, dma_config_t *config) {
// 1. 禁用DMA通道
DMA0->REQEN &= ~(1U << channel);
// 2. 配置源地址和目标地址
DMA0->CTS_SADDR[channel] = (uint32_t)config->source_addr;
DMA0->CTS_DADDR[channel] = (uint32_t)config->dest_addr;
// 3. 配置传输控制
uint16_t tcr = 0;
tcr |= (config->source_width << 8); // 源数据宽度
tcr |= (config->dest_width << 0); // 目标数据宽度
DMA0->CTS_TCR[channel] = tcr;
// 4. 配置偏移量
DMA0->CTS_SOFF[channel] = config->source_offset;
DMA0->CTS_DOFF[channel] = config->dest_offset;

最低0.47元/天 解锁文章
1823

被折叠的 条评论
为什么被折叠?



