【第四课 USB不停电下载 补课】
一、USB库文件下载
在官网下载USB库文件。库文件包含CDC和HID两种下载模式。
1.1 CDC模式和HID模式
1. CDC模式:
是一种 USB 设备类规范,主要用于设备与主机之间的通信,实现数据的传输,其功能类似于传统的串口通信。其数据传输量相对灵活,可以进行大数据量的传输。
2. HID模式:
是一种用于人机交互设备的 USB 设备类规范,专注于人机交互,是为了方便用户操作主机设备或者接收主机反馈而设计的。它主要用于连接输入设备(如鼠标、键盘)和输出设备(如简单的状态指示灯设备)。其数据传输量通常较小。因为它主要传输的是用户操作信息(如鼠标移动的坐标变化、按键的按下和松开状态)或者简单的设备状态反馈信息,这些数据相对简洁。

1.2 查询模式和中断模式
USB库还包含两种模式,一个是查询模式,一个是中断模式。
1. 查询模式: 将USB库的传输相关代码写在while
循环中。MCU会按顺序执行,每次循环到传输语句时执行传输命令。这种方法的好处是不会影响系统其他代码段的运行,仅在执行到代码传输语句时才会传输,其他时刻不会传输。
2. 中断模式: 类似一种外部中断方式。初始化USB语句后,注册一个名为usb_OUT_callback()
的回调函数。回调函数由USB中断在接收到串口数据时自动调用。这种中断触发方式可能会影响到系统的执行。
STC工具箱使用CDC下载模式比较好用(老师说的)。另外,选择查询模式的32位文件。文件名为stc32g_cdc_query_demo
。
二、USB库文件移植
2.1 添加头文件
将点灯文件另存为,并以此为基础进行usb库文件移植。
前面提到,选择32位模式、查询模式下的CDC传输方式。该库文件名为stc_usb_cdc_32.LIB
,将这个文件连同stc32_stc8_usb.h
文件复制到工程文件main.c
相同目录下。在工程目录中添加LIB文件之后,在main.c
文件中添加下方头文件并编译无报错即可。
#include "stc32_stc8_usb.h"
使用.LIB文件的好处是看不到USB库的源代码,这样就防止误改代码导致的功能错误。
2.2 USB初始化函数
按照示例代码中的内容,添加初始化函数,定义有关变量。
#include "AI8051U.h"
#include "stc32_stc8_usb.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
//配置所有IO为准双向口
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
usb_init(); //USB-CDC 接口初始化
//这里需要继续配置命令参数
while(1)
{
//这里需要继续配置命令参数
}
}
其中 内部自定义命令 char *USER_STCISPCMD = "@STCISP#";
要和ISP软件的自定义命令内容相一致。

2.3 配置命令参数
对比示例代码同时需要添加以下几方面代码:
P_SW2 = 0x80; //使能访问XFR,没有冲突不用关闭
或者是EAXFR=1;
因为USB属于特殊功能寄存器,其存储在XFR列表当中。

EA = 1;

中断使能在后面的计时器、外部等中断功能需求时需要配置该选项。(但是这里视频写了IE2 |= 0x80;
但是示例代码中没有。)
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
另外,在while
循环中添加USB数据传输相关语句:
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
编译后会报*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
,意思是.h
库函数内有很多未调用的函数。可以在Options中关闭。

2.3 烧录程序
这里进行最后一次手动烧录。保持P32按下状态后点按Power按键然后松开,系统进入下载模式。

烧录完成后在ISP将如下设置勾选后就可以了。打开自动下载按钮,编译完成会自动下载。

(但是这里为什么是“下次使用HID接口进行ISP下载”????)