感觉STC8A8K64D4的串口DMA不如串口中断稳定
同样的硬件,我用串口中断,通讯正常,COM3-发送:01 10 08 34 00 10 82 6bCOM3-接收: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
难道是我的打开方式不对吗?请高位大佬指点一下,谢谢! 不要说STC,我用的microCHIP 串口DMA运行几小时后,系统就复位一次,找了很久找不到原因,干脆直接用串口发送和接收中断,没任何问题。 shhludb 发表于 2022-1-21 22:38
不要说STC,我用的microCHIP 串口DMA运行几小时后,系统就复位一次,找了很久找不到原因,干脆直接用串口发 ...
就想着DMA可以减少中断次数,省事一点{:lol:} shhludb 发表于 2022-1-21 22:38
不要说STC,我用的microCHIP 串口DMA运行几小时后,系统就复位一次,找了很久找不到原因,干脆直接用串口发 ...
我知道原因了,串口中断发送时数据确定,发送过程中数据不会变化,而DMA发送过程中数据有可能是变化的,我现在在DMA发送前用一个数组缓存要发送的数据,完成后再发送就正常了 jswd2420 发表于 2022-1-28 08:31
我知道原因了,串口中断发送时数据确定,发送过程中数据不会变化,而DMA发送过程中数据有可能是变化的, ...
你是有误码,我是没无误码,但是运行几小时后会导致系统复位一次,确认是串口DMA引起的 shhludb 发表于 2022-1-28 10:05
你是有误码,我是没无误码,但是运行几小时后会导致系统复位一次,确认是串口DMA引起的 ...
是不是串口数组越界了? 楼主可以用STC的例程测试下,没问题的。 本帖最后由 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;
} 请参考这个资料
页:
[1]