打印
[研电赛技术支持]

GD32 UART使用DMA发送时间测量

[复制链接]
1408|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Puchou|  楼主 | 2025-4-12 15:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
波特率2400
发送2个字节,只需要432us,UART带有一级缓存,一次可以写入2个字节



发送4个字节,0.432+2*4.16=8.75ms



使用DMA发送完成作为数据发送完成的标志是不合适的。



//等待TC置位,作为发送完成标志
void USART1_IRQHandler(void)
{
uint8_t u8Tmp;
if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_TC))
{
usart_interrupt_flag_clear(USART1,USART_INT_FLAG_TC);
//用户处理过程
}
}
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/lljss1980/article/details/127461575

使用特权

评论回复
沙发
磨砂| | 2025-5-5 10:10 | 只看该作者
使用UART配合DMA进行发送时,测量发送时间的方法通常涉及配置和启动DMA传输,并通过中断或状态标志来捕获发送完成的时间点

使用特权

评论回复
板凳
晓伍| | 2025-5-5 12:35 | 只看该作者
UART外设时钟(如[size=0.875]RCU_USART0)。
DMA外设时钟(如[size=0.875]RCU_DMA1)。
GPIO时钟(用于UART引脚)。

使用特权

评论回复
地板
八层楼| | 2025-5-5 14:53 | 只看该作者
设置UART的TX和RX引脚为复用模式,并指定复用功能

使用特权

评论回复
5
观海| | 2025-5-5 17:23 | 只看该作者
dma_single_data_parameter_struct dma_init_struct;
dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
dma_init_struct.memory0_addr = (uint32_t)tx_buffer;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.number = buffer_size; // 发送数据长度
dma_init_struct.periph_addr = USART0_DATA_ADDRESS;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_single_data_mode_init(DMA1, DMA_CH7, &dma_init_struct); // 假设使用DMA1通道7


使用特权

评论回复
6
guanjiaer| | 2025-5-5 19:42 | 只看该作者
配置UART参数如波特率、数据位、停止位等,还需要使能UART的DMA发送功能

使用特权

评论回复
7
heimaojingzhang| | 2025-5-5 22:01 | 只看该作者
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200); // 设置波特率
usart_word_length_set(USART0, USART_WL_8BIT); // 8位数据
usart_stop_bit_set(USART0, USART_STB_1BIT); // 1个停止位
usart_parity_config(USART0, USART_PM_NONE); // 无奇偶校验
usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE); // 禁用RTS
usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE); // 禁用CTS
usart_receive_config(USART0, USART_RECEIVE_ENABLE); // 使能接收(可选)
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); // 使能发送
usart_dma_transmit_config(USART0, USART_DMACFG_DMAMODE_NORMAL); // 正常DMA模式
usart_enable(USART0); // 使能UART


使用特权

评论回复
8
keaibukelian| | 2025-5-6 08:08 | 只看该作者
将发送缓冲区地址和数据长度配置到DMA通道。使能DMA通道并启动传输。

使用特权

评论回复
9
paotangsan| | 2025-5-6 10:31 | 只看该作者
dma_interrupt_enable(DMA1, DMA_CH7, DMA_INT_FTF); // 使能传输完成中断
// 中断回调函数
void DMA1_Channel7_IRQHandler(void) {
    if (dma_interrupt_flag_get(DMA1, DMA_CH7, DMA_INT_FLAG_FTF)) {
        dma_interrupt_flag_clear(DMA1, DMA_CH7, DMA_INT_FLAG_FTF);
        // 记录发送完成时间
        uint32_t end_time = systick_get(); // 假设使用SysTick计时
        printf("Send time: %lu us


使用特权

评论回复
10
renzheshengui| | 2025-5-6 12:49 | 只看该作者
在主循环中轮询DMA状态标志,记录发送完成时间

使用特权

评论回复
11
wowu| | 2025-5-6 15:05 | 只看该作者
确保发送过程中CPU负载较低,避免任务调度影响DMA传输速度

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

120

帖子

0

粉丝