ch32v307RCT6 485通信问题

我芯片使用内部时钟72Mhz 主频 ,使用环境:DMA1_Channel5  通道接收usart1 , DMA1_Channel4 通道发送Usart1,硬件RTS ,串口空闲中断开启,485芯片 max3485,在接收数据时usart1只有第一个byte能正确接收,其它数据都不正确。在用DMA发送时完全接收不到数据。请问这个情况怎么处理。软件控制收发吗

icon_rar.gifradar.rar

程序源码


您好,附件为CH32V307 串口1DMA收发的例程,同样使用了串口空闲中断,你可以参考一下。此外注意一下,若ld文件中将FLASH和RAM大小配置为288+32的话,需要通过ISP工具下载配置一下,否则建议用256+64,不然程序可能会有问题。后续若有问题,可通过邮箱和我沟通(lzs@wch.cn)。

WCHISPTool工具下载链接:https://www.wch.cn/downloads/WCHISPTool_Setup_exe.html?

icon_rar.gifCH32V307 USART1_DMA收发.zip

image.png

图1

image.png

图2


DMA通信这个配置我这边用其它的端口测试都没有问题。但就485通信不正常

配置没有奇偶效验,但偶效验能收到数据,但发不出来数据


    DMA_Channel_TypeDef *channel, uint8_t *adsRx, uint32_t size) {

    GPIO_InitTypeDef GPIO_InitStructure = { 0 };

    USART_InitTypeDef USART_InitStructure = { 0 };

    DMA_InitTypeDef DMA_InitStructure = { 0 };

    NVIC_InitTypeDef NVIC_InitStructure = { 0 };


    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


    USART_InitStructure.USART_BaudRate = baudrate;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No;

    USART_InitStructure.USART_HardwareFlowControl =

    USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Rx;


    DMA_DeInit(channel);

    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) (&usart->DATAR); /* USART2->DATAR:0x40004404 */

    DMA_InitStructure.DMA_MemoryBaseAddr = (u32) adsRx;

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

    DMA_InitStructure.DMA_BufferSize = size;

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;


    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,

                ENABLE);

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

        /* USART1 TX-->A.9   RX-->A.10 */

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(GPIOA, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

        GPIO_Init(GPIOA, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; /* RTS-->A.12 */

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_Init(GPIOA, &GPIO_InitStructure);


        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

        USART_InitStructure.USART_HardwareFlowControl =

        USART_HardwareFlowControl_RTS;


        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;


    USART_ITConfig(usart, USART_IT_IDLE, ENABLE);

    USART_Init(usart, &USART_InitStructure);


    DMA_Init(channel, &DMA_InitStructure);

    DMA_Cmd(channel, ENABLE);

    NVIC_Init(&NVIC_InitStructure);


        //配置发送DMA

        DMA_DeInit(DMA1_Channel4);

        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) (&USART1->DATAR); /* USART2->DATAR:0x40004804 */

        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) USART_TX_BUF;

        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

        DMA_InitStructure.DMA_BufferSize = USART_TEC_LEN;

        DMA_Init(DMA1_Channel4, &DMA_InitStructure);

        USART_DMACmd(usart, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE);


1666185962120803.png

1666185963183053.png

1666185963193953.png

1666185963147605.png



您好,您可以尝试由串口引脚直接读取串口打印的输出,检查打印内容是否正确。如果还有问题,可以发送邮件至lbw@wch.cn进一步沟通。


只有登录才能回复,可以选择微信账号登录