数据类型适配与转换

[复制链接]
561|5
逢dududu必shu 发表于 2025-9-29 13:34 | 显示全部楼层 |阅读模式
根据传输宽度调整数据类型,利用自然对齐特性:
c
运行
// 对于32位DMA传输,使用uint32_t数组并处理剩余字节
#define BUF_SIZE 100
#define ALIGNED_BUF_SIZE ((BUF_SIZE + 3) / 4)  // 向上取整

uint32_t aligned_buffer[ALIGNED_BUF_SIZE] = {0};
uint8_t *data_ptr = (uint8_t *)aligned_buffer;  // 8位访问指针

// 填充数据(8位方式)
void fill_buffer(const uint8_t *data, uint32_t len) {
    for(uint32_t i = 0; i < len; i++) {
        data_ptr[i] = data[i];
    }
}

// 配置DMA传输(32位方式)
void configure_dma() {
    uint32_t transfer_words = (BUF_SIZE + 3) / 4;  // 总字数
    uint32_t remaining_bytes = BUF_SIZE % 4;       // 剩余字节数

    // 配置DMA传输大部分数据(32位)
    if(transfer_words > 0) {
        DMA_Config(aligned_buffer, transfer_words - (remaining_bytes ? 0 : 1));
    }

    // 处理剩余字节(若有)
    if(remaining_bytes) {
        // 使用8位DMA传输剩余字节
        DMA_Config_8bit(&data_ptr[BUF_SIZE - remaining_bytes], remaining_bytes);
    }
}
优势:完全满足对齐要求,适用于混合宽度传输

缺点:需要处理字节序和剩余字节,逻辑较复杂

麻花油条 发表于 2025-9-30 12:08 | 显示全部楼层
建议简化剩余字节处理
麻花油条 发表于 2025-9-30 12:09 | 显示全部楼层
完全使用 32 位传输,逻辑简单。
classroom 发表于 2025-9-30 13:09 | 显示全部楼层
满足严格对齐要求,提升传输效率。适用于混合宽度传输场景。
duo点 发表于 2025-9-30 15:10 | 显示全部楼层
建议用填充法简化剩余字节处理。统一字节序,避免解析错误。
jcky001 发表于 2025-9-30 12:43 | 显示全部楼层
适用高性能、严格对齐的 DMA 传输场景。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

502

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部