USB-CDC不停电下载在使用了定时器3中断后就不管用了?
USB-CDC不停电下载在使用了定时器3中断后就不管用了?求解答。现只能借用定时器0中断。
是不是,isp不知道扩展中断号
void UartInit(void) //UART3
void UART3_int (void) interrupt 17
用了UART3,不停电下载也不行了 不停电下载是通过CDC或HID实现的和串口3无关吧 interrupt 17
interrupt 19
的使用,usb_cdc无法使用吗? Timer0_init();
Timer1_init();
// Timer2_init();
// Timer3_init();
// Timer4_init();
测试发现,只能用 Timer0_init(); Timer1_init();,用Timer2_init();Timer3_init(); Timer4_init();后,usb_cdc无法使用吗?求破解。 <p>有可能是进入中断太频繁了导致其他任务被堵塞执行。</p>
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次/秒
#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]