- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2026-02-24 17:21:41
已绑定手机
新手上路
- 积分
- 4
|
发表于 2026-2-24 17:21:41
|
显示全部楼层
我用的是stc8h4k64TL, 因为带串口接收超时中断毕竟是少数,如果还开串口发送接收中断,就失去了使用DMA的意义,因此我换了一个思路接收不定长的数据,那就是周期读取DMA_UR1R_DONE的大小,获取已经接收的数据大小,如果大于1,说明已经开始接收,如果不在增大,说明接收完成。
我是30M主频,115200波特率,1ms定时中断查询。实际测试通过,挺好用。
void Timer0_Isr(void) interrupt TMR0_VECTOR
{
// 帧接收计时
if( uart1.stu == 10 )
{
// 开始DMA接收
if( (DMA_UR1R_DONE - uart1.recv_cnt) < 8 )
{
// 帧接收完成
uart1.stu = 20;
}
uart1.recv_cnt = DMA_UR1R_DONE;
uart1.idle_tov = ee.idle_tset;
if( uart1.idle_tov != 0 )
{
uart1.idle_tov--;
}
}
// 接收空闲计时
else if( uart1.stu == 0 )
{
// 开始DMA接收
if( (DMA_UR1R_DONE - uart1.recv_cnt) > 1 )
{
uart1.stu = 10;
uart1.recv = buf;
uart1.recv_cnt = DMA_UR1R_DONE;
uart1.idle_tov = ee.idle_tset;
}
}
}
void UART1_DMA_Transmit(char* ptr, int len)
{
DMA_UR1T_CFG = 0x80; //中断允许和中断优先级
DMA_UR1T_STA = 0x00; //状态寄存器全部清零
DMA_UR1T_TXAH = (u8)((u16)ptr >> 8); //发送数组地址高
DMA_UR1T_TXAL = (u8)((u16)ptr); //发送数组地址低
DMA_UR1T_STA = 0x00; //状态寄存器全部清零
DMA_UR1T_AMT = (u8)len-1; //设置传输总字节数:n+1
DMA_UR1T_CR = 0xc0; //bit7 1:使能 UART1_DMA, bit6 1:开始 UART1_DMA 自动发送
}
void UART1_DMA_Receive(char* ptr, int len)
{
DMA_UR1R_CFG = 0x80; //中断允许和中断优先级
DMA_UR1R_STA = 0x00; //状态寄存器全部清零
DMA_UR1R_RXAH = (u8)((u16)ptr >> 8); //数组地址高
DMA_UR1R_RXAL = (u8)((u16)ptr); //数组地址低
DMA_UR1R_STA = 0x00; //状态寄存器全部清零
DMA_UR1R_AMT = (u8)len; //设置传输总字节数:n+1
DMA_UR1R_CR = 0x00;
DMA_UR1R_CR = 0xa1; //bit7 1:使能 UART1_DMA, bit5 1:开始 UART4_DMA 自动接收, bit0 1:清除 FIFO
uart1.recv_cnt = DMA_UR1R_DONE;
}
//========================================================================
// 函数: void UART1_DMA_Interrupt (void) interrupt 50/51
// 描述: UART1 DMA中断函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-5-8
// 备注:
//========================================================================
void UART1_DMA_Isr(void) interrupt USER_VECTOR
{
if (DMA_UR1T_STA & 0x01) //发送完成
{
DMA_UR1T_STA &= ~0x01;
uart1.stu = 0;
UART1_DMA_Receive(uart1.recv ,250);
}
if (DMA_UR1T_STA & 0x04) //数据覆盖
{
DMA_UR1T_STA &= ~0x04;
}
if (DMA_UR1R_STA & 0x01) //接收完成
{
DMA_UR1R_STA &= ~0x01;
}
if (DMA_UR1R_STA & 0x02) //数据丢弃
{
DMA_UR1R_STA &= ~0x02;
}
}
|
|