21cnsound
发表于 2025-5-12 19:38:19
大家有没有遇到同样的问题?官方能否测试一下?
使用擎天柱做printf_usb的测试,烧录时取消选择“复位脚用作IO”,烧录后重新上电,ISP串口助手中打开CDC串口能正常输出,按RESET按键也能正常复位(通过P2的指示灯判断复位成功了),但CDC串口不再能正常输出,不断电下载也就不能正常使用。只能重新下电再上电才能恢复。
代码如下:
// 8bit模式
#include "ai8051u.h"
#include "ai_usb.h"
void Delay1ms(unsigned int ms) //@40.000MHz
{
unsigned char data i, j;
do
{
i = 52;
j = 240;
do
{
while (--j);
} while (--i);
} while(--ms);
}
void USBLIB_OUT_Callback(void)//中断方式回调执行的用户自己编写的任务函数,简称回调函数
{
if(UsbOutBuffer == '0'+6)
printf_usb("Hello World!"); //接收到数据6后,打印输出“Hello World!”
else if(UsbOutBuffer == '0'+7)
printf_usb("China!"); //接收到数据7后,打印输出“China!” \r\n
}
void main(void)
{
unsigned char count;
P_SW2 |= 0x80;//使能可以访问扩展的特殊功能寄存器XFR,没有冲突不用关闭
WTST = 0; //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
P0M0 = 0x00; P0M1 = 0x00; //初始化P0口为准双向口模式
P1M0 = 0x00; P1M1 = 0x00; //初始化P1口为准双向口模式
P2M0 = 0x00; P2M1 = 0x00; //初始化P2口为准双向口模式
P3M0 = 0x00; P3M1 = 0x00; //初始化P3口为准双向口模式 //如使用usb_init()建议放在这句之后,有“冲突”
P4M0 = 0x00; P4M1 = 0x00; //初始化P4口为准双向口模式
P5M0 = 0x00; P5M1 = 0x00; //初始化P5口为准双向口模式
P6M0 = 0x00; P6M1 = 0x00; //初始化P6口为准双向口模式
P7M0 = 0x00; P7M1 = 0x00; //初始化P7口为准双向口模式
usb_init(); //初始化 USB 模块,特别注意会将P30/P31初始化为高阻输入,不影响USB【D-,D+】通信
set_usb_OUT_callback(USBLIB_OUT_Callback); //设置 USB 中断服务程序可以调用的回调函数
EA = 1; //使能全局中断
count = 255;
while (1)
{
printf_usb("printf_usb test!");
Delay1ms(200);
P2 = count;
count -= 1;
}
}
ercircle
发表于 2025-5-12 20:19:47
21cnsound 发表于 2025-5-12 19:38
大家有没有遇到同样的问题?官方能否测试一下?
使用擎天柱做printf_usb的测试,烧录时取消选择“复位脚用 ...
用了USB不能直接复位的,
要把P47改为I/O,
代码释放USB后再复位。
神农鼎
发表于 2025-5-12 20:26:36
21cnsound
发表于 2025-5-12 22:33:34
ercircle 发表于 2025-5-12 20:19
用了USB不能直接复位的,
要把P47改为I/O,
代码释放USB后再复位。
搞定了,谢谢!
// 8bit模式,40MHz
#include "ai8051u.h"
#include "ai_usb.h"
static bit Key_Flag = 0;
static u16 Key_cnt = 0;
void Delay1ms(u16 ms) //@40.000MHz
{
u8 i, j;
do
{
i = 52;
j = 240;
do
{
while (--j);
} while (--i);
} while(--ms);
}
void KeyResetScan(void) //检查P47口长按1秒触发软件复位
{
if(!P47)
{
if(!Key_Flag)
{
Key_cnt++;
if(Key_cnt >= 6)
{
Key_Flag = 1;
USBCON = 0x00; //复位前清除USB设置
USBCLK = 0x00;
IRC48MCR = 0x00;
Delay1ms(10);
IAP_CONTR = 0x20; //复位到用户APP区;IAP_CONTR = 0x20是复位用ISP区
}
}
else Key_cnt = 0, Key_Flag = 0;
}
}
void USBLIB_OUT_Callback(void) //中断方式回调执行的用户自己编写的任务函数,简称回调函数
{
if(UsbOutBuffer == '0'+6)
printf_usb("Hello World!"); //接收到数据6后,打印输出“Hello World!”
else if(UsbOutBuffer == '0'+7)
printf_usb("China!"); //接收到数据7后,打印输出“China!” \r\n
else if(UsbOutBuffer == '0')
{
USBCON = 0x00; //复位前清除USB设置
USBCLK = 0x00;
IRC48MCR = 0x00;
Delay1ms(10);
IAP_CONTR = 0x20; //复位到用户APP区;IAP_CONTR = 0x20是复位用ISP区
}
}
void main(void)
{
u8 count;
P_SW2 |= 0x80; //使能可以访问扩展的特殊功能寄存器XFR,没有冲突不用关闭
WTST = 0; //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
P0M0 = 0x00; P0M1 = 0x00; //初始化P0口为准双向口模式
P1M0 = 0x00; P1M1 = 0x00; //初始化P1口为准双向口模式
P2M0 = 0x00; P2M1 = 0x00; //初始化P2口为准双向口模式
P3M0 = 0x00; P3M1 = 0x00; //初始化P3口为准双向口模式 //如使用usb_init()建议放在这句之后,有“冲突”
P4M0 = 0x00; P4M1 = 0x00; //初始化P4口为准双向口模式
P5M0 = 0x00; P5M1 = 0x00; //初始化P5口为准双向口模式
P6M0 = 0x00; P6M1 = 0x00; //初始化P6口为准双向口模式
P7M0 = 0x00; P7M1 = 0x00; //初始化P7口为准双向口模式
usb_init(); //初始化 USB 模块,特别注意会将P30/P31初始化为高阻输入,不影响USB【D-,D+】通信
set_usb_OUT_callback(USBLIB_OUT_Callback); //设置 USB 中断服务程序可以调用的回调函数
EA = 1; //使能全局中断
count = 255;
while(1)
{
printf_usb("printf_usb test!--%bu", 255-count);
Delay1ms(200);
P2 = count;
count -= 1;
KeyResetScan();
}
}
dcc20250218
发表于 2025-6-29 20:31:03
自己搭建的STC8H8K64U,点亮一个LED正常后,想打出“hello world",但是一点反应也没有,都是照着视频做的。
能帮忙看看是那里出了问题吗?
神农鼎
发表于 2025-6-29 21:10:06
STC8H8K64U 直接连接电脑,不要经过那个 USB转双串口
神农鼎
发表于 2025-6-29 21:14:04
这是 USB转串口下载器,不是硬件USB直接下载
BH4TDV
发表于 2025-7-28 10:46:57
patch1582 发表于 2025-6-7 19:23
永远的Hello World
测过USB发送时间么,我这边USB发送10个字节,要80ms
patch1582
发表于 2025-7-28 17:05:55
BH4TDV 发表于 2025-7-28 10:46
测过USB发送时间么,我这边USB发送10个字节,要80ms
没测过实际,配置了多大速率
BH4TDV
发表于 2025-7-29 19:47:09
patch1582 发表于 2025-7-28 17:05
没测过实际,配置了多大速率
用的官网下载的最新USB库250716的库的DEMO ,使用8H8K64U