YTM32B1ME0x芯片深度解读系列(四):DMA系统与高效数据传输

引言

在现代汽车电子系统中,大量的传感器数据、通信数据和控制信号需要在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;
  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VehSwHwDeveloper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值