硬汉嵌入式论坛

 找回密码
 立即注册
查看: 864|回复: 2
收起左侧

[RL-RTX] 串口DMA设置通道设置串口传输的数据不成功

[复制链接]

5

主题

6

回帖

21

积分

新手上路

积分
21
发表于 2022-3-31 16:29:49 | 显示全部楼层 |阅读模式
1、在安富莱教程的基础上,设置了DMA通道传输的个数,按照参考手册,先禁止DMA通道,设置后,开启DMA通道
void USART3_DMA_Config(void)
{
        /* Deinitialize the stream for new transfer */
        HAL_DMA_DeInit(&USART3_DMA_Handle_RX);

        USART3_DMA_Init();

        //禁止DMA通道
        USART3_DMA_RX_STREAM->CR &=  0xFFFFFFFE;
        //设置传输个数
        USART3_DMA_RX_STREAM->NDTR = BUFFER_MAX_SIZE;
       //打开DMA通道
        USART3_DMA_RX_STREAM->CR |= 0x01;

        USART3_DMA_Handle_RX.Instance = USART3_DMA_RX_STREAM;
        /*usart3 rx对应dma1,数据流0*/
        USART3_DMA_Handle_RX.Init.Request = DMA_REQUEST_USART3_RX;
        /*方向:从外设到内存*/
        USART3_DMA_Handle_RX.Init.Direction = DMA_PERIPH_TO_MEMORY;
        //外设地址是固定的
        USART3_DMA_Handle_RX.Init.PeriphInc = DMA_PINC_DISABLE;
        /*内存地址自增*/
        USART3_DMA_Handle_RX.Init.MemInc = DMA_MINC_ENABLE;
        /*外设数据单位*/
        USART3_DMA_Handle_RX.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
        /*内存数据单位 8bit*/
        USART3_DMA_Handle_RX.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
        /*DMA模式:正常模式,单次*/
        USART3_DMA_Handle_RX.Init.Mode = DMA_CIRCULAR;
        /*优先级:中*/
        USART3_DMA_Handle_RX.Init.Priority = DMA_PRIORITY_MEDIUM;
        /*使能FIFO*/
        USART3_DMA_Handle_RX.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
        USART3_DMA_Handle_RX.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
        /*存储器突发传输 1个节拍*/
        USART3_DMA_Handle_RX.Init.MemBurst = DMA_MBURST_SINGLE;
        /*外设突发传输 1个节拍*/
        USART3_DMA_Handle_RX.Init.PeriphBurst = DMA_PBURST_SINGLE;

        /* Configure the DMA stream */
        HAL_DMA_Init(&USART3_DMA_Handle_RX);
        //设置缓冲区接收的个数
       
        //设置接收设置DMA
        __HAL_LINKDMA(&Usart3Handle, hdmarx, USART3_DMA_Handle_RX);

        /* Deinitialize the stream for new transfer */
        HAL_DMA_DeInit(&USART3_DMA_Handle_TX);
        USART3_DMA_Handle_TX.Instance = USART3_DMA_TX_STREAM;
       
        /*usart1 rx对应dma1,数据流2*/
        USART3_DMA_Handle_TX.Init.Request = DMA_REQUEST_USART3_TX;
        /*方向:从外设到内存*/
        USART3_DMA_Handle_TX.Init.Direction = DMA_MEMORY_TO_PERIPH;
        //外设地址是固定的
        USART3_DMA_Handle_TX.Init.PeriphInc = DMA_PINC_DISABLE;
        /*内存地址自增*/
        USART3_DMA_Handle_TX.Init.MemInc = DMA_MINC_ENABLE;
        /*外设数据单位*/
        USART3_DMA_Handle_TX.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
        /*内存数据单位 8bit*/
        USART3_DMA_Handle_TX.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
        /*DMA模式:正常模式,单次*/
        USART3_DMA_Handle_TX.Init.Mode = DMA_NORMAL;
        /*优先级:中*/
        USART3_DMA_Handle_TX.Init.Priority = DMA_PRIORITY_MEDIUM;
        /*使能FIFO*/
        USART3_DMA_Handle_TX.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
        USART3_DMA_Handle_TX.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
        /*存储器突发传输 1个节拍*/
        USART3_DMA_Handle_TX.Init.MemBurst = DMA_MBURST_SINGLE;
        /*外设突发传输 1个节拍*/
        USART3_DMA_Handle_TX.Init.PeriphBurst = DMA_PBURST_SINGLE;
        /* Configure the DMA stream */
        HAL_DMA_Init(&USART3_DMA_Handle_TX);
        //设置接收设置DMA
        __HAL_LINKDMA(&Usart3Handle, hdmatx, USART3_DMA_Handle_TX);
}
2、设置后,在出口空闲中断中查看的传输个数的初始值,还是默认的256
unsigned short  cnt = __HAL_DMA_GET_COUNTER(&USART3_DMA_Handle_RX);



回复

使用道具 举报

5

主题

6

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2022-3-31 17:20:25 | 显示全部楼层
串口DMA设置通道设置串口传输的数据不个数成功,标题写的有问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106574
QQ
发表于 2022-4-1 10:41:16 | 显示全部楼层
配置阶段,建议全部HAL配置。

下面这些都有对应的函数和参数成员。

      //禁止DMA通道
        USART3_DMA_RX_STREAM->CR &=  0xFFFFFFFE;
        //设置传输个数
        USART3_DMA_RX_STREAM->NDTR = BUFFER_MAX_SIZE;
       //打开DMA通道
        USART3_DMA_RX_STREAM->CR |= 0x01;
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-25 09:29 , Processed in 0.255184 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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