根据传输宽度调整数据类型,利用自然对齐特性:
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);
}
}
优势:完全满足对齐要求,适用于混合宽度传输
缺点:需要处理字节序和剩余字节,逻辑较复杂
|
|