jswd2420 发表于 2022-1-21 14:44:29

感觉STC8A8K64D4的串口DMA不如串口中断稳定

同样的硬件,我用串口中断,通讯正常,COM3-发送:01 10 08 34 00 10 82 6b
COM3-接收:01 03 07 d0 00 0a c5 40
COM3-发送:01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 8f 16
COM3-接收:01 10 08 34 00 10 20 00 00 10 00 00 00 00 01 00 00 00 00 00 00 00 00 80 bf 00 00 00 00 00 00 00 00 00 00 00 00 01 00 bc 96
COM3-发送:01 10 08 34 00 10 82 6b
COM3-接收:01 03 07 d0 00 0a c5 40
COM3-发送:01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 8f 16
COM3-接收:01 10 08 34 00 10 20 00 00 10 00 00 00 00 01 00 00 00 00 00 00 00 00 80 bf 00 00 00 00 00 00 00 00 00 00 00 00 01 00 bc 96
COM3-发送:01 10 08 34 00 10 82 6b
COM3-接收:01 03 07 d0 00 0a c5 40
COM3-发送:01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 8f 16
COM3-接收:01 10 08 34 00 10 20 00 00 10 00 00 00 00 01 00 00 00 00 00 00 00 00 80 bf 00 00 00 00 00 00 00 00 00 00 00 00 01 00 bc 96
COM3-发送:01 10 08 34 00 10 82 6b
COM3-接收:01 03 07 d0 00 0a c5 40
COM3-发送:01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 8f 16
COM3-接收:01 10 08 34 00 10 20 00 00 10 00 00 00 00 01 00 00 00 00 00 00 00 00 80 bf 00 00 00 00 00 00 00 00 00 00 00 00 01 00 bc 96
COM3-发送:01 10 08 34 00 10 82 6b
COM3-接收:01 03 07 d0 00 0a c5 40
COM3-发送:01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 8f 16
COM3-接收:01 10 08 34 00 10 20 00 00 10 00 00 00 00 01 00 00 00 00 00 00 00 00 80 bf 00 00 00 00 00 00 00 00 00 00 00 00 01 00 bc 96
COM3-发送:01 10 08 34 00 10 82 6b
COM3-接收:01 03 07 d0 00 0a c5 40
用DMA就有误码COM3-发送:01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 8f 16
COM3-接收[校验异常]:01 10 08 34 00 10 20 00 00 10 00 00 00 00 01 00 00 00 00 00 00 00 00 80 17 00 00 00 00 00 00 00 00 00 00 00 00 01 00 bc 96
COM3-接收:01 03 07 d0 00 0a c5 40
COM3-发送:01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 8f 16
COM3-接收[校验异常]:01 10 08 34 00 10 20 00 00 10 00 00 00 00 01 00 00 00 00 00 00 00 00 80 17 00 00 00 00 00 00 00 00 00 00 00 00 01 00 bc 96
COM3-接收:01 03 07 d0 00 0a c5 40
COM3-发送:01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 8f 16
COM3-接收:01 10 08 34 00 10 20 00 00 10 00 00 00 00 01 00 00 00 00 00 00 00 00 80 bf 00 00 00 00 00 00 00 00 00 00 00 00 01 00 bc 96
COM3-发送:01 10 08 34 00 10 82 6b
COM3-接收:01 03 07 d0 00 0a c5 40
我的DMA代码如下
        DMA_UR2T_CFG = 0x80;                //bit7 1:Enable Interrupt
        DMA_UR2T_STA = 0x00;
        DMA_UR2T_AMT = 7;                //设置传输总字节数:n+1
        DMA_UR2T_TXA = rd_tx;      //发送目标地址   
        DMA_UR2T_CR = 0xc0;                        //bit7 1:使能 UART2_DMA, bit6 1:开始 UART2_DMA 自动发送

        DMA_UR2R_CFG = 0x80;                //bit7 1:Enable Interrupt
        DMA_UR2R_STA = 0x00;
        DMA_UR2R_AMT = (rec_number-1);                //设置传输总字节数:n+1
        DMA_UR2R_RXA = rec;      //接收目标地址
   
        DMA_UR2R_CR = 0xa1;                        //bit7 1:使能 UART2_DMA, bit5 1:开始 UART2_DMA 自动接收, bit0 1:清除 FIFO
难道是我的打开方式不对吗?请高位大佬指点一下,谢谢!

shhludb 发表于 2022-1-21 22:38:05

不要说STC,我用的microCHIP 串口DMA运行几小时后,系统就复位一次,找了很久找不到原因,干脆直接用串口发送和接收中断,没任何问题。

jswd2420 发表于 2022-1-22 10:35:04

shhludb 发表于 2022-1-21 22:38
不要说STC,我用的microCHIP 串口DMA运行几小时后,系统就复位一次,找了很久找不到原因,干脆直接用串口发 ...

就想着DMA可以减少中断次数,省事一点{:lol:}

jswd2420 发表于 2022-1-28 08:31:06

shhludb 发表于 2022-1-21 22:38
不要说STC,我用的microCHIP 串口DMA运行几小时后,系统就复位一次,找了很久找不到原因,干脆直接用串口发 ...

我知道原因了,串口中断发送时数据确定,发送过程中数据不会变化,而DMA发送过程中数据有可能是变化的,我现在在DMA发送前用一个数组缓存要发送的数据,完成后再发送就正常了

shhludb 发表于 2022-1-28 10:05:48

jswd2420 发表于 2022-1-28 08:31
我知道原因了,串口中断发送时数据确定,发送过程中数据不会变化,而DMA发送过程中数据有可能是变化的, ...

你是有误码,我是没无误码,但是运行几小时后会导致系统复位一次,确认是串口DMA引起的

jswd2420 发表于 2022-1-28 11:04:49

shhludb 发表于 2022-1-28 10:05
你是有误码,我是没无误码,但是运行几小时后会导致系统复位一次,确认是串口DMA引起的 ...

是不是串口数组越界了?

小李非刀 发表于 2022-2-8 16:54:20

楼主可以用STC的例程测试下,没问题的。

jswd2420 发表于 2022-2-8 20:24:45

本帖最后由 jswd2420 于 2022-2-8 20:30 编辑

小李非刀 发表于 2022-2-8 16:54
楼主可以用STC的例程测试下,没问题的。

版主,我现在单个的DMA中断发送,接收都没有问题,但是我多个串口发送接收的时候有点问题,感觉串口缓冲区串了,但是我每个串口都是单独的缓冲区xdata u8 UART1_TX_DMABUFFER;//串口1DMA发送缓冲区
xdata u8 UART2_TX_DMABUFFER;//串口2DMA发送缓冲区
xdata u8 UART3_TX_DMABUFFER;//串口3DMA发送缓冲区
xdata u8 UART4_TX_DMABUFFER;//串口4DMA发送缓冲区

xdata u8 UART1_RX_DMABUFFER;//串口1DMA接收缓冲区
xdata u8 UART2_RX_DMABUFFER;//串口2DMA接收缓冲区
xdata u8 UART3_RX_DMABUFFER;//串口3DMA接收缓冲区
xdata u8 UART4_RX_DMABUFFER;//串口4DMA接收缓冲区
//========================================================================
// 函数: void UART2_DMA_Config(u8 tx_len,u8 rx_len)
// 描述: UART2 DMA 功能配置.
// 参数:1、 tx_len:发送长度
//      2、 rx_len:接收长度

// 返回: none.
// 版本: V1.0, 2021-5-6
//========================================================================
void UART2_DMA_Config(u8 tx_len,u8 rx_len)
{
    P_SW2 |= 0x80;
        DMA_UR2T_CFG = 0x80;                //bit7 1:Enable Interrupt
        DMA_UR2T_STA = 0x00;
        DMA_UR2T_AMT = tx_len-1;                //设置传输总字节数:n+1
    DMA_UR2T_TXA = UART2_TX_DMABUFFER;//       
        DMA_UR2T_CR = 0xc0;                        //bit7 1:使能 UART2_DMA, bit6 1:开始 UART2_DMA 自动发送

        DMA_UR2R_CFG = 0x80;                //bit7 1:Enable Interrupt
        DMA_UR2R_STA = 0x00;
        DMA_UR2R_AMT = rx_len-1;                //设置传输总字节数:n+1
        DMA_UR2R_RXA = UART2_RX_DMABUFFER;
        DMA_UR2R_CR = 0xa1;                        //bit7 1:使能 UART2_DMA, bit5 1:开始 UART2_DMA 自动接收, bit0 1:清除 FIFO
}

//========================================================================
// 函数: void UART3_DMA_Config(u8 tx_len,u8 rx_len)
// 描述: UART3 DMA 功能配置.
// 参数:1、 tx_len:发送长度
//      2、 rx_len:接收长度

// 返回: none.
// 版本: V1.0, 2021-5-6
//========================================================================
void UART3_DMA_Config(u8 tx_len,u8 rx_len)
{
    P_SW2 |= 0x80;
        DMA_UR3T_CFG = 0x80;                //bit7 1:Enable Interrupt
        DMA_UR3T_STA = 0x00;
        DMA_UR3T_AMT = tx_len-1;                //设置传输总字节数:n+1
    DMA_UR3T_TXA = UART3_TX_DMABUFFER;//       
        DMA_UR3T_CR = 0xc0;                        //bit7 1:使能 UART2_DMA, bit6 1:开始 UART3_DMA 自动发送

        DMA_UR3R_CFG = 0x80;                //bit7 1:Enable Interrupt
        DMA_UR3R_STA = 0x00;
        DMA_UR3R_AMT = rx_len-1;                //设置传输总字节数:n+1
        DMA_UR3R_RXA = UART3_RX_DMABUFFER;
        DMA_UR3R_CR = 0xa1;                        //bit7 1:使能 UART2_DMA, bit5 1:开始 UART3_DMA 自动接收, bit0 1:清除 FIFO
}

//========================================================================
// 函数: void UART4_DMA_Config(u8 tx_len,u8 rx_len)
// 描述: UART4 DMA 功能配置.
// 参数:1、 tx_len:发送长度
//      2、 rx_len:接收长度

// 返回: none.
// 版本: V1.0, 2021-5-6
//========================================================================
void UART4_DMA_Config(u8 tx_len,u8 rx_len)
{
    P_SW2 |= 0x80;
        DMA_UR4T_CFG = 0x80;                //bit7 1:Enable Interrupt
        DMA_UR4T_STA = 0x00;
        DMA_UR4T_AMT = tx_len-1;                //设置传输总字节数:n+1
    DMA_UR4T_TXA = UART4_TX_DMABUFFER;//       
        DMA_UR4T_CR = 0xc0;                        //bit7 1:使能 UART2_DMA, bit6 1:开始 UART4_DMA 自动发送

        DMA_UR4R_CFG = 0x80;                //bit7 1:Enable Interrupt
        DMA_UR4R_STA = 0x00;
        DMA_UR4R_AMT = rx_len-1;                //设置传输总字节数:n+1
        DMA_UR4R_RXA = UART4_RX_DMABUFFER;
        DMA_UR4R_CR = 0xa1;                        //bit7 1:使能 UART2_DMA, bit5 1:开始 UART4_DMA 自动接收, bit0 1:清除 FIFO
}

void UART3_SON(u8 slave_add1) //功能码伺服使能01 06 04 51 20 01 01 2B
{
    u16 crcdata = 0;
    UART3_TX_DMABUFFER = slave_add1; //从机地址
    UART3_TX_DMABUFFER = 0x06; //功能码0x06
    UART3_TX_DMABUFFER = 0x04; //写入地址首位高位
    UART3_TX_DMABUFFER = 0x51; //写入地址首位低位
    UART3_TX_DMABUFFER = 0x20;
    UART3_TX_DMABUFFER = 0x01;

    crcdata = Crc16 (UART3_TX_DMABUFFER, 6);
    UART3_TX_DMABUFFER = (u8) (crcdata >> 8);
    UART3_TX_DMABUFFER = (u8) crcdata;
    UART3_DMA_Config(8,8);
    UART3_flag_rec = 1;
    time_out3 = 0;
   
}

void UART3_SOFF(u8 slave_add1) //功能码伺服使能01 06 04 51 00 00
{
    u16 crcdata = 0;
    UART3_TX_DMABUFFER = slave_add1; //从机地址
    UART3_TX_DMABUFFER = 0x06; //功能码0x06
    UART3_TX_DMABUFFER = 0x04; //写入地址首位高位
    UART3_TX_DMABUFFER = 0x51; //写入地址首位低位
    UART3_TX_DMABUFFER = 0x00;
    UART3_TX_DMABUFFER = 0x00;

    crcdata = Crc16 (UART3_TX_DMABUFFER, 6);
    UART3_TX_DMABUFFER = (u8) (crcdata >> 8);
    UART3_TX_DMABUFFER = (u8) crcdata;
    UART3_DMA_Config(8,8);
    UART3_flag_rec = 1;
    time_out3 = 0;
   
}

国学芯用 发表于 2022-2-10 10:35:13

请参考这个资料
页: [1]
查看完整版本: 感觉STC8A8K64D4的串口DMA不如串口中断稳定