找回密码
 立即注册
查看: 149|回复: 20

提交一个USB和timer3共存的bug | 数据手册中有注意事项

[复制链接]

该用户从未签到

1

主题

12

回帖

43

积分

新手上路

积分
43
发表于 2024-3-26 20:08:00 | 显示全部楼层 |阅读模式
在将程序从stc8h8k64u迁移到stc32g12k128时,发现一个bug,描述如下:

板子:屠龙刀
状况:板子通过CDC与电脑通讯,不初始化定时器3时,工作正常,初始化定时器3后,CDC就出不来了。


代码如下:


#include "..\api\core_api.h"
#include "..\api\usb_uart.h"
#include "..\api\usb\stc32_stc8_usb.h"
#include "stdio.h"


sbit LED_24 = P2^4;
sbit LED_25 = P2^5;

uint debugTimer = 0;
bit B_chkTimeFreq = 0;

void procUartCmd();

void initTimer0ByTest(){
        AUXR &= 0x7F;
        TMOD &= 0xF0;
        TL0 = 0x0;
        TH0 = 0x0;
        TF0 = 0;        
        ET0 = 1;
}

void initTimer2(void){        
        TM2PS = 0;
        AUXR &= 0xFB;
        T2L = 0x30;        
        T2H = 0xF8;               
  T2R = 1;
  ET2 = 1;        
}

void initTimer3(){  //初始化定时器3
  TM3PS = 0;        
        T4T3M &= 0xf0;               
        T3H = 0;
        T3L = 0;
        ET3 = 1;    //加入该行后,CDC出问题
}


void reset(){
        WTST = 0;  
        EAXFR = 1;
        CKCON = 0;
        initTimer2();
        P3n_pure_input(0x03);  //P3.0/P3.1 ºÍ USB µÄ D-/D+¹²Óà PIN ½Å£¬  ÐèÒª½« P3.0/P3.1 ÉèÖÃΪ¸ß×èÊäÈëģʽ
        usb_init();  //USB CDC ½Ó¿ÚÅäÖÃ
        EA = 1;
}

void showDebuger(){
        if(B_chkTimeFreq){
                sendTowDats2Pc(0xb5, 3, 10);
        }
}

void main(void){
        LED_24 = 0;
        reset();
        initTimer3();
        LED_25 = 0;
        
        while(1){
                if (bUsbOutReady) {
                        procUartCmd();         
                        usb_OUT_done();   
                }
               
                if(debugTimer==0){
                        debugTimer = 500;
                        showDebuger();
                }
               
        }
}

uint timer0_Overs = 0;

void timer2_isr() interrupt 12{
        if(debugTimer>0) debugTimer--;
}

void timer0_Isr(void) interrupt 1{
        timer0_Overs++;
}

ulong mathCalcAdd(int nums, int dat1, int dat2){
        int i;
        long res = 0;
        for(i=0;i<nums;i++){
                res = dat1 + dat2;
        }
        return res;
}

ulong mathCalcDec(int nums, int dat1, int dat2){
        int i;
        long res = 0;
        for(i=0;i<nums;i++){
                res = dat1 - dat2;
        }
        return res;
}

ulong mathCalcMul(int nums, int dat1, int dat2){
        int i;
        long res = 0;
        for(i=0;i<nums;i++){
                res = dat1 * dat2;
        }
        return res;
}

ulong mathCalcDiv(int nums, int dat1, int dat2){
        int i;
        long res = 0;
        for(i=0;i<nums;i++){
                res = dat1 / dat2;
        }
        return res;
}

ulong mathCalcMulFloat(int nums, int dat1, int dat2){
        int i;
        long res = 0;
        float f0 = ((float)dat1) / 10.0;
        float f1 = ((float)dat2) / 10.0;
        float f2 = 0;
        for(i=0;i<nums;i++){
                f2 = f0 * f1;
        }
        res = (long)(f2*10.0);
        return res;        
}

ulong mathCalcDivFloat(int nums, int dat1, int dat2){
        int i;
        long res = 0;
        float f0 = ((float)dat1) / 10.0;
        float f1 = ((float)dat2) / 10.0;
        float f2 = 0;
        for(i=0;i<nums;i++){
                f2 = f0 / f1;
        }
        res = (long)(f2*10.0);
        return res;        
}


void checkMathPrefs(){
        long res = 0;
        uint timer = 0;
        uchar idx = 5;
        uchar type = UsbOutBuffer[idx++];
        int nums = (((int)UsbOutBuffer[idx++]) << 8) + UsbOutBuffer[idx++];
        int dat1 = (((int)UsbOutBuffer[idx++]) << 8) + UsbOutBuffer[idx++];
        int dat2 = (((int)UsbOutBuffer[idx++]) << 8) + UsbOutBuffer[idx++];
        initTimer0ByTest();
        timer0_Overs = 0;
        TR0 = 1;
        switch(type){
                case 1:
                        res = mathCalcAdd(nums, dat1, dat2);
                        break;
                case 2:
                        res = mathCalcDec(nums, dat1, dat2);
                        break;
                case 3:
                        res = mathCalcMul(nums, dat1, dat2);
                        break;
                case 4:
                        res = mathCalcDiv(nums, dat1, dat2);
                        break;
                case 5:
                        res = mathCalcMulFloat(nums, dat1, dat2);
                        break;
                case 6:
                        res = mathCalcDivFloat(nums, dat1, dat2);
                        break;
        }
        TR0 = 0;
        timer = (((uint)TH0) << 8) + TL0;
        
        createStartRs232(0xb5, 3, 12);
        addUChar2RS232Buf(type);
        addInt2RS232Buf(nums);
        addInt2RS232Buf(dat1);
        addInt2RS232Buf(dat2);
        flushRS232Buffer();
        
        createStartRs232(0xb5, 3, 11);
        addUInt2RS232Buf(timer0_Overs);
        addUInt2RS232Buf(timer);
        addLong2RS232Buf(res);
        flushRS232Buffer();
}


void procUartCmd(){
        if((UsbOutBuffer[0]==0x8A)&&(UsbOutBuffer[1]==0x8B)){  //´Ó×Ô¼º¿ª·¢µÄÉÏλ»úÈí¼þ·¢À´µÄ
                if(UsbOutBuffer[2]==0x1C){  //³¤¶È¶Ô
                        if(checkRXDatSum()){  //УÑéºÍÕýÈ·
                                switch(UsbOutBuffer[3]){  //¹¦ÄÜ
                                        case 0xa1:  //pwmµ÷ÊÔ
                                                switch(UsbOutBuffer[4]){
                                                        case 0x00:   //ÉÏλ»ú¶ÁÈ¡ÅäÖà                                                        
                                                                break;
                                                        case 0x01:  //±£´æÅäÖÃ
                                                                break;
                                                        case 0x02:  //debug1
                                                                break;
                                                        case 0x03:  //debug2
                                                                break;
                                                        case 0x04:  //debug3
                                                                break;
                                                        case 0x05:  //debug4
                                                                break;
                                                        case 0x06:  //debug5
                                                                break;
                                                        case 0x07:   //ʱÖÓ°´Å¥
                                                                B_chkTimeFreq = ~B_chkTimeFreq;
                                                          break;
                                                        case 0x08:  //»»Ïà¼Ç¼
                                                                break;
                                                        case 0x09:  //¿ª¹ØADC
                                                          break;                                                        
                                                        case 0x20:   //µ÷ÊÔ2 ²»´ø²ÎÊý
                                                                break;
                                                        case 0x21:  //µ¥²½
                                                                break;
                                                        case 0x22:   //Í£Ö¹
                                                                break;
                                                }
                                                break;
                                        case 0xa2:  //ÉÏλ»úдÅäÖÃÀ´                                
                                                break;
          case 0xa3:    //µ÷ÊÔ1 ´ø²ÎÊý(int)
                                                checkMathPrefs();
            break;                                                
                                }
                        }
                }
        }
}

回复 送花

使用道具 举报

该用户从未签到

1

主题

12

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-3-26 20:12:18 | 显示全部楼层
程序涉及的代码见下面的附件,希望官方确认一下,或者哪位大神帮忙看看。

debug_pref.c

4.86 KB, 下载次数: 1

core_api.h

5.17 KB, 下载次数: 1

core_api.c

4.8 KB, 下载次数: 1

usb_uart.c

3.86 KB, 下载次数: 1

usb_uart.h

1.1 KB, 下载次数: 2

回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    6 小时前
  • 签到天数: 109 天

    [LV.6]常住居民II

    10

    主题

    580

    回帖

    916

    积分

    高级会员

    积分
    916
    发表于 2024-3-26 21:08:19 | 显示全部楼层
    看T3的初始化代码,确实是不应该影响其他功能。等官方答复吧
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    12

    回帖

    43

    积分

    新手上路

    积分
    43
     楼主| 发表于 2024-3-26 21:15:40 | 显示全部楼层
    21cnsound 发表于 2024-3-26 21:08
    看T3的初始化代码,确实是不应该影响其他功能。等官方答复吧

    嗯,我反复测试了,只要打开timer3的中断,CDC就出不来了
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    12

    回帖

    43

    积分

    新手上路

    积分
    43
     楼主| 发表于 2024-3-26 21:18:55 | 显示全部楼层
    再次测试了,timer4也一样,换句话说,可以操作IE2的5\6位后,usb的CDC就有问题,但同样的代码,在stc8h下是正常的
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    12

    回帖

    43

    积分

    新手上路

    积分
    43
     楼主| 发表于 2024-3-26 21:27:26 | 显示全部楼层
    请官方尽快看看吧
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    6 小时前
  • 签到天数: 170 天

    [LV.7]常住居民III

    26

    主题

    810

    回帖

    2034

    积分

    金牌会员

    积分
    2034
    发表于 2024-3-26 21:45:04 | 显示全部楼层
    是不是和EUSB有关?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    6 小时前
  • 签到天数: 170 天

    [LV.7]常住居民III

    26

    主题

    810

    回帖

    2034

    积分

    金牌会员

    积分
    2034
    发表于 2024-3-26 21:48:13 | 显示全部楼层
    看看手册这里,估计是与它有关。stc32的这些寄存器可以位寻址,直接用位变量操作
    截图202403262146229261.jpg
    截图202403262148097489.jpg
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    12

    回帖

    43

    积分

    新手上路

    积分
    43
     楼主| 发表于 2024-3-26 21:57:00 | 显示全部楼层
    研究了一下,确实是EUSB的问题,新版手册里面,提到这个问题了,只要操作了IE2,就需要重新置EUSB=1

    点评

    操作IE2后再EUSB=1,EUSB也会被清零一下,可能会导致未知的错误,应该 unsigned char a; a=IE2;//先读出 a|=0x20;//打开定时器3中断 a|=0x80;//打开USB中断 IE2=a;//再写回  详情 回复 发表于 2024-3-26 22:12
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 116 天

    [LV.6]常住居民II

    25

    主题

    304

    回帖

    1053

    积分

    荣誉版主

    Cyber Hamster

    积分
    1053
    发表于 2024-3-26 22:12:34 | 显示全部楼层
    test_tmp 发表于 2024-3-26 21:57
    研究了一下,确实是EUSB的问题,新版手册里面,提到这个问题了,只要操作了IE2,就需要重新置EUSB=1 ...

    操作IE2后再EUSB=1,EUSB也会被清零一下,可能会导致未知的错误,应该
    unsigned char a;
    a=IE2;//先读出
    a|=0x20;//打开定时器3中断
    a|=0x80;//打开USB中断
    IE2=a;//再写回
    (=・ω・=)
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-16 14:44 , Processed in 0.080044 second(s), 71 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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