13818880150 发表于 2025-1-30 21:59:30

USB-CDC不停电下载在使用了定时器3中断后就不管用了?

USB-CDC不停电下载在使用了定时器3中断后就不管用了?求解答。

现只能借用定时器0中断。
是不是,isp不知道扩展中断号

13818880150 发表于 2025-1-30 22:21:23

void UartInit(void)                //UART3
void UART3_int (void) interrupt 17
用了UART3,不停电下载也不行了

soma 发表于 2025-1-30 22:55:44

不停电下载是通过CDC或HID实现的和串口3无关吧

13818880150 发表于 2025-2-4 14:35:51

interrupt 17
interrupt 19
的使用,usb_cdc无法使用吗?

13818880150 发表于 2025-2-4 14:49:40

   Timer0_init();
   Timer1_init();
//   Timer2_init();
//   Timer3_init();
//    Timer4_init();
测试发现,只能用 Timer0_init(); Timer1_init();,用Timer2_init();Timer3_init(); Timer4_init();后,usb_cdc无法使用吗?求破解。

angmall 发表于 2025-2-4 15:46:41

<p>有可能是进入中断太频繁了导致其他任务被堵塞执行。</p>

13818880150 发表于 2025-2-4 20:34:42

angmall 发表于 2025-2-4 15:46
有可能是进入中断太频繁了导致其他任务被堵塞执行。

考虑中断太频繁,用相同timer0--ok,Timer2--no;Timer3--no;Timer4--no
#define Timer0_Reload   (MAIN_Fosc / 1000)      //Timer 0 中断频率, 1000次/秒
#define Timer1_Reload   (MAIN_Fosc / 2000)      //Timer 1 中断频率, 2000次/秒
#define Timer2_Reload   (MAIN_Fosc / 1000)      //Timer 2 中断频率, 3000次/秒
#define Timer3_Reload   (MAIN_Fosc / 300)      //Timer 3 中断频率, 4000次/秒
#define Timer4_Reload   (MAIN_Fosc / 100)      //Timer 4 中断频率, 5000次/秒

13818880150 发表于 2025-2-4 20:37:33

#include "stc32g.h"
#include "stc32_stc8_usb.h"

#define FOSC 24000000UL                                       // ISP下就时需将工作频率设置为24MHz
#define MAIN_Fosc 24000000UL                          
char *USER_DEVICEDESC= NULL;                       
char *USER_PRODUCTDESC = NULL;                       
char *USER_STCISPCMD   = "@STCISP#";                            // 不停电自动ISP下就命令,可以自定义

#define Timer0_Reload   (MAIN_Fosc / 1000)      //Timer 0 中断频率, 1000次/秒
#define Timer1_Reload   (MAIN_Fosc / 2000)      //Timer 1 中断频率, 2000次/秒
#define Timer2_Reload   (MAIN_Fosc / 1000)      //Timer 2 中断频率, 3000次/秒
#define Timer3_Reload   (MAIN_Fosc / 300)      //Timer 3 中断频率, 4000次/秒
#define Timer4_Reload   (MAIN_Fosc / 100)      //Timer 4 中断频率, 5000次/秒

void    Timer0_init(void);
void    Timer1_init(void);
void    Timer2_init(void);
void    Timer3_init(void);
void    Timer4_init(void);

void Delay2000ms(void)        //@24.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 11999998UL;
        while (i) i--;
}

void main()
{
    WTST=0;
    CKCON=0;
    EAXFR=1;

    P0M1=0x00;P0M0=0x00;
    P1M1=0x00;P1M0=0x00;
    P2M1=0x00;P2M0=0x00;
    P3M1=0x00;P3M0=0x00;
    P4M1=0x00;P4M0=0x00;
    P5M1=0x00;P5M0=0x00;
    P6M1=0x00;P6M0=0x00;
    P7M1=0x00;P7M0=0x00;

    P3M0 &=~0x03;                                                   // P3.0,P3.1和USB的D-D+共用PIN引脚
    P3M1 =0x03;                                                   // 需要将P3.P3.1设置为高阻输入模式
    IRC48MCR=0x80;                                                                        // 使能内部48M前USB专用IRC
                                                                                                          
    while (!(IRC48MCR & 0x01));                                           
    USBCLK = 0x00;                                                                        // 设置USB时钟源为内部48M的USB专用IRC
    USBCON = 0x90;                                                                        // 使能USB功能
                                                                                                          
    usb_init();                                                                                // 源用USB CDC初始化库函数
    EUSB=1;                                                                                 // 使能USB中断
                                                                                                          
    EA=1;                                                      
    while (DeviceState != DEVSTATE_CONFIGURED);         // 等特USB完成配置
//    Timer0_init();
//Timer1_init();
    Timer2_init();
//    Timer3_init();
//    Timer4_init();
    while (1)
        {P21 = !P21;
                Delay2000ms();
                P20 = !P20;
//当硬件接收完成上位机通过串口助手发来的数据后,会自动将bUsbOutReady置1
//接收的数据字节数保存在OutNumber变量中,接收的数据保存在UsbOutBuffer数组
                if (bUsbOutReady)
                {P20 = !P20;
                        USB_SendData(UsbOutBuffer,OutNumber);        // 使用USB_SendData可向上位机发送数据
                                                                                                        // 这里的代码为将接收到的数据原样返回
                        usb_OUT_done();                              // 处理完成接收的数据后
                                                                                                        // 源用usb_OUT_done准备接收下一笔数据
                }                       
        }
}
void Timer0_init(void)
{
      TR0 = 0;    //停止计数

    #if (Timer0_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
      #error "Timer0设置的中断过快!"

    #elif ((Timer0_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
      ET0 = 1;    //允许中断
    //PT0 = 1;    //高优先级中断
      TMOD &= ~0x03;
      TMOD |= 0;//工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
    //T0_CT = 1;//计数
      T0_CT = 0;//定时
    //T0CLKO = 1; //输出时钟
      T0CLKO = 0; //不输出时钟

      #if (Timer0_Reload < 65536UL)
            T0x12 = 1;//1T mode
            TH0 = (u8)((65536UL - Timer0_Reload) / 256);
            TL0 = (u8)((65536UL - Timer0_Reload) % 256);
      #else
            T0x12 = 0;//12T mode
            TH0 = (u8)((65536UL - Timer0_Reload/12) / 256);
            TL0 = (u8)((65536UL - Timer0_Reload/12) % 256);
      #endif

      TR0 = 1;    //开始运行

    #else
      #error "Timer0设置的中断过慢!"
    #endif
}

//========================================================================
// 函数: void Timer1_init(void)
// 描述: timer1初始化函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void Timer1_init(void)
{
      TR1 = 0;    //停止计数

    #if (Timer1_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
      #error "Timer1设置的中断过快!"

    #elif ((Timer1_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
      ET1 = 1;    //允许中断
    //PT1 = 1;    //高优先级中断
      TMOD &= ~0x30;
      TMOD |= (0 << 4);   //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
    //T1_CT = 1;//计数
      T1_CT = 0;//定时
    //T1CLKO = 1; //输出时钟
      T1CLKO = 0; //不输出时钟

      #if (Timer1_Reload < 65536UL)
            T1x12 = 1;//1T mode
            TH1 = (u8)((65536UL - Timer1_Reload) / 256);
            TL1 = (u8)((65536UL - Timer1_Reload) % 256);
      #else
            T1x12 = 0;//12T mode
            TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
            TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
      #endif

      TR1 = 1;    //开始运行

    #else
      #error "Timer1设置的中断过慢!"
    #endif
}

//========================================================================
// 函数: void Timer2_init(void)
// 描述: timer2初始化函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void Timer2_init(void)
{
      T2R = 0;    //停止计数

    #if (Timer2_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
      #error "Timer2设置的中断过快!"

    #elif ((Timer2_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
      ET2 = 1;    //允许中断
    //T2_CT = 1;//计数
      T2_CT = 0;//定时
    //T2CLKO = 1; //输出时钟
      T2CLKO = 0; //不输出时钟

      #if (Timer2_Reload < 65536UL)
            T2x12 = 1;    //1T mode
            T2H = (u8)((65536UL - Timer2_Reload) / 256);
            T2L = (u8)((65536UL - Timer2_Reload) % 256);
      #else
            T2x12 = 0;    //12T mode
            T2H = (u8)((65536UL - Timer2_Reload/12) / 256);
            T2L = (u8)((65536UL - Timer2_Reload/12) % 256);
      #endif

      T2R = 1;    //开始运行

    #else
      #error "Timer2设置的中断过慢!"
    #endif
}

//========================================================================
// 函数: void Timer3_init(void)
// 描述: timer3初始化函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void Timer3_init(void)
{
      T3R = 0;    //停止计数

    #if (Timer3_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
      #error "Timer3设置的中断过快!"

    #elif ((Timer3_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
      ET3 = 1;    //允许中断
    //T3_CT = 1;//计数
      T3_CT = 0;//定时
    //T3CLKO = 1; //输出时钟
      T3CLKO = 0; //不输出时钟

      #if (Timer3_Reload < 65536UL)
            T3x12 = 1;    //1T mode
            T3H = (u8)((65536UL - Timer3_Reload) / 256);
            T3L = (u8)((65536UL - Timer3_Reload) % 256);
      #else
            T3x12 = 0;    //12T mode
            T3H = (u8)((65536UL - Timer3_Reload/12) / 256);
            T3L = (u8)((65536UL - Timer3_Reload/12) % 256);
      #endif

      T3R = 1;    //开始运行

    #else
      #error "Timer3设置的中断过慢!"
    #endif
}

//========================================================================
// 函数: void Timer4_init(void)
// 描述: timer4初始化函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void Timer4_init(void)
{
      T4R = 0;    //停止计数

    #if (Timer4_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
      #error "Timer4设置的中断过快!"

    #elif ((Timer4_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
      ET4 = 1;    //允许中断
    //T4_CT = 1;//计数
      T4_CT = 0;//定时
    //T4CLKO = 1; //输出时钟
      T4CLKO = 0; //不输出时钟

      #if (Timer4_Reload < 65536UL)
            T4x12 = 1;    //1T mode
            T4H = (u8)((65536UL - Timer4_Reload) / 256);
            T4L = (u8)((65536UL - Timer4_Reload) % 256);
      #else
            T4x12 = 0;    //12T mode
            T4H = (u8)((65536UL - Timer4_Reload/12) / 256);
            T4L = (u8)((65536UL - Timer4_Reload/12) % 256);
      #endif

      T4R = 1;    //开始运行

    #else
      #error "Timer4设置的中断过慢!"
    #endif
}

//========================================================================
// 函数: void timer0_int (void) interrupt TIMER0_VECTOR
// 描述:timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer0_int (void) interrupt 1
{
   P67 = ~P67;
}

//========================================================================
// 函数: void timer1_int (void) interrupt TIMER1_VECTOR
// 描述:timer1中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer1_int (void) interrupt 3
{
   P66 = ~P66;
}

//========================================================================
// 函数: void timer2_int (void) interrupt TIMER2_VECTOR
// 描述:timer2中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer2_int (void) interrupt 12
{
    P65 = ~P65;
}

//========================================================================
// 函数: void timer3_int (void) interrupt TIMER3_VECTOR
// 描述:timer3中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer3_int(void) interrupt 19
{
    P64 = ~P64;
}

//========================================================================
// 函数: void timer4_int (void) interrupt TIMER4_VECTOR
// 描述:timer4中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer4_int(void) interrupt 20
{
    P63 = ~P63;
}
页: [1]
查看完整版本: USB-CDC不停电下载在使用了定时器3中断后就不管用了?