OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 163|回复: 0

GD32F470VGT6,把 TxBuf 数组的数据用 DMA1 发送到 USART5,卡几天了搞不出来。

[复制链接]

59

主题

6295

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11748
金钱
11748
注册时间
2014-4-1
在线时间
1355 小时
发表于 4 天前 | 显示全部楼层 |阅读模式
1金钱


GD32F470VGT6,把 TxBuf 数组的数据用 DMA1 发送到 USART5 。

以最新的官方库为基础,做了最简化的 IAR 工程。不开任何中断,纯查询方式。

查手册,要使用通道 7(DMA_CH7),申请 DMA 的外设号码是 5 ( DMA_SUBPERI5 )。
使能 DMA1,运行后报 TAEIF7 错误,通道7传输错误,一个字节也没有发出。

仔细查过配置,甚至把寄存器的数值与手册一一对照,没有发现问题。
换了三块电路板,问题都一样。
搞了好几天,一直没有成功。

请官方技术客服看过,同样没有发现问题。


//---------------------------------------------//

( USART5 的配置不是重点,略过。串口用硬件测试过,收发都没问题。)

usart_dma_transmit_config( USART5, USART_TRANSMIT_DMA_ENABLE );
//---------------------------------------------//

rcu_periph_clock_enable( RCU_DMA1 );

dma_deinit( DMA1, DMA_CH7 );
dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
dma_init_struct.memory0_addr = (uint32_t)TxBuf;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.periph_addr = ( uint32_t )&USART_DATA( USART5 );
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;

dma_init_struct.number = 10;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;

dma_single_data_mode_init( DMA1, DMA_CH7, &dma_init_struct );

dma_circulation_disable( DMA1, DMA_CH7 );
dma_channel_subperipheral_select( DMA1, DMA_CH7, DMA_SUBPERI5 );
//---------------------------------------------//
dma_channel_enable( DMA1, DMA_CH7 );                        //enable DMA channel7

usart_enable( USART5 );

while        ( dma_flag_get( DMA1, DMA_CH7, DMA_FLAG_FTF ) == RESET );

while        ( 1 );

//---------------------------------------------//



有人遇到过吗?





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-3-24 07:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表