找回密码
 立即注册
查看: 50|回复: 10

STC8H1K17T,DMA_UART传送时,XFR允许开关用完关不关的问题

[复制链接]

27

主题

153

回帖

899

积分

高级会员

积分
899
发表于 前天 15:55 | 显示全部楼层 |阅读模式
这款芯片支持DMA,为简化UART中断服务,已启经用DMA收发传送一段时间。
最省事的就越是串口发送。接收用的时超时机制(T0中一个分支)断句。

作为下位机,判定收到一帧报文后,我有三个环节:
1,报文检验:长度初筛、地址检验、CRC校验、长度自洽检查;
2,报文解析、命令执行:这里略过;
3,等待合适时机应答发送:包括计算CRC校验字,等待总线空闲。
结果最近用示波器观察(用电平翻转某IO)这三个环节的耗时,发觉每个环节都有一个不确定的额外延迟!累计可达3~5mS!

各种检查观察下来,线索收窄到:DMA_UART收发中断中,访问XFR后,没有关闭允许位(P_SW2中的bit7)会拉长:
三个环节中所有访问XRAM的时间!先说结果:退出DMA收发中断时关闭那个允许位就OK!
回复

使用道具 举报 送花

27

主题

153

回帖

899

积分

高级会员

积分
899
 楼主| 发表于 前天 16:19 | 显示全部楼层
附我的UART相关代码:
//-------------------------------------------------
//UART1 DMA 接收传送完指定字节数:
void S1R_DMA_Intr(void) interrupt 51
{
        P_SW2 |= 0x80;                //因需操作SFR
        if (DMA_UR1R_STA & 0x01)        //接收完成
        {        DMA_UR1R_STA &= ~0x01;
                DMA_UR1R_RXA = Rece;
                DRx_OK = 1;
        }
        if (DMA_UR1R_STA & 0x02)        //数据丢弃
        {        DMA_UR1R_STA &= ~0x02;
                DRx_LO = 1;                                //数据丢失
        }
        P_SW2 &= 0x7F;        //这里是否关倒是无所谓
}

//================================================
// 函数: void UART1_DMA_Intr(void) interrupt 50/51
// 描述: UART1 DMA中断函数
//================================================
//UART1 DMA 发送传送完指定字节数:
void S1T_DMA_Intr(void) interrupt 50
{
        P_SW2 |= 0x80;                //因需操作SFR
        if (DMA_UR1T_STA & 0x01)        //发送完成
        {        DMA_UR1T_STA &= ~0x01;
        //        DTx_OK = 1;
        //        DTc_OV = 0;                //清数据覆盖标志
                Txd_In = 0;
        }
        if (DMA_UR1T_STA & 0x04)        //数据覆盖
        {        DMA_UR1T_STA &= ~0x04;
        //        DTc_OV = 1;                //置数据覆盖标志
        //        DTx_OK = 0;
        }
        P_SW2 &= 0x7F;        //这里必须关!
}

//=====================================================
#define MAIN_Fosc        22118400UL
//-----------------------------------------------------
//串口1初始化:
void S1_Init(u16 Baud)
{        u16 Tn_IV;
        Tn_IV = (65536UL-MAIN_Fosc/4/Baud);
        ... 略 ...
}

//=====================================================
// 函数: void DMA_Config(void)
// 描述: UART DMA 功能配置.
//=====================================================
void DMA_Config(void)
{
        P_SW2 |= 0x80;                        //因操作的是:扩展SFR
        //收完:
        DMA_UR1R_CFG = 0x8A;                //b7 1:使能中断
        DMA_UR1R_STA = 0x00;
        DMA_UR1R_AMT = AMT_RLEN-1;        //传输总字节数:n+1
//        DMA_UR1R_AMT = 255;
        DMA_UR1R_RXA = Rece;                //接收数组
        DMA_UR1R_CR = 0xA1;                        //b7 1:使能DMA,
                                                                //b5 1:开始 自动接收,
        //发完:                                        //b0 1:清除 FIFO
        //-------------------------------------------------
        DMA_UR1T_CFG = 0x8A;                //b7 1:使能中断
        DMA_UR1T_STA = 0x00;
        DMA_UR1T_AMT = AMT_TLEN-1;        //设置传输总字节数:n+1
        DMA_UR1T_TXA = Send;                //发送数组
        DMA_UR1T_CR = 0x80;                        //b7 1:使能DMA,
                                                                //b6 1:开始DMA 自动发送
        P_SW2 &= 0x7F;        //手册说:也可以不关,实测不行!
}
回复

使用道具 举报 送花

27

主题

153

回帖

899

积分

高级会员

积分
899
 楼主| 发表于 前天 16:23 | 显示全部楼层
续:
因为我的目标数据,收发缓冲区都在XRAM区,所以没法避免访问XRAM,但STC8H1K17T仅1K XRAM!
回复

使用道具 举报 送花

已绑定手机

2

主题

153

回帖

466

积分

中级会员

积分
466
发表于 前天 16:44 | 显示全部楼层
你外接了XRAM吗,如果没有,在main中初始化时设置EAXFR=1(P_SW2 |= 0x80)后,之后不用再修改。
截图202611051644016317.jpg

点评

没有,进访问1k的片上XRAM。 就是因为实际与手册声明不符,才发帖询问。  发表于 前天 16:51
回复

使用道具 举报 送花

已绑定手机

2

主题

153

回帖

466

积分

中级会员

积分
466
发表于 前天 17:39 | 显示全部楼层
按理来说,exsfr只是一个地址映射开关,
不会影响指令的周期数,也不会增加总线的额外操作。
所以,会不会是其他原因呢。
比如:有不同中断优先级的中断有操作exsfr,出现竞态问题。

回复

使用道具 举报 送花

83

主题

8317

回帖

1万

积分

超级版主

积分
17930
发表于 前天 17:46 | 显示全部楼层
允许P_SW2.7=1后不需要清0,一直保持为1。如果中途操作P_SW2,记得要将最高位写1。
不管怎么设置这个位,都不会影响程序执行时间,你居然可以延时3~5ms,要查下程序别的原因。

点评

确实,论据不充分。因为那个允许访问XFR的开关,影响很广,还没法确定它是影响我有关耗时不固定的唯一原因!还得重新设计测试方法!  发表于 前天 22:51
回复

使用道具 举报 送花

27

主题

153

回帖

899

积分

高级会员

积分
899
 楼主| 发表于 昨天 13:49 | 显示全部楼层
感谢梁工第一时间回应!罪魁祸首找到:
我的(负)脉宽捕获,采用的STC8H的脉宽捕获模式。
外部脉冲仅进入PWM8(捕获上升沿),由内部分路给PWM7(捕获下降沿)。
PWM8中断触发时直接由(PWMBCCR8 - PWMBCCR7)获得(负)脉宽。

问题是:此模式应该关掉PWM7的中断允许,我却没关!

唉!累死这片 STC8H1K17T 了!呵呵,惭愧!
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 10:16 , Processed in 0.074751 second(s), 71 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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