04、USB不停电下载
本集看似只是讲了USB不停电下载,其实涉及到了挺多硬件知识,看视频时一直边看边查手册,以下为个人学习心得。
1、USB不停电下载介绍及所需文件(USB库文件下载)
- 开发过程中经常需要反复修改代码,重新编译生成HEX。反复的停电/上电进行下载模式就成了一件冗余且繁琐的事。有了USB不停电下
载这个功能,可以省去这些冗余且繁琐的事。修改代码后,只需重新编译生成HEX文件,AiCube-ISP就可以自动将最新的代码下载进单片机。
- USB库文件下载方法:进入STC官网(www.stcai.com)首页->软件工具,找到“库函数-USB库文件”下载
2、USB库函数详解:USB-CDC库函数和USB-HID库函数区别
- USB-CDC:即虚拟串口,基于USB通讯设备类协议。USB-CDC虚拟串口忽略传统串口的波特率和起始位、停止位等冗余信息,传输
速度的比特率为全速USB的通讯速度12Mpbs(即每秒12M位,约1.5M/S,有效传输速度一般可达800K/S)。丢弃传统串口简单的软件奇
偶校验机制,有USB硬件CRC校验,以及校验出错重传机制,保证数据100%正确。可自动缓存数据,未处理完上位机上一笔数据,如有
新数据下传,可自动将新数据缓存,以保证数据100%不丢失或被覆盖,适用于大数据量的快速传输项目。
- USB-HID:基于 USB 人机交互接口协议。所有版本Windows系统中都可免装驱动程序,即插即用。但数据传输速度较低,理论数据
带宽仅64K/S,仅适用于小数据量的数据传输项目。
3、USB库函数详解:不同Lib库文件适用范围
库文件名 |
功能说明 |
stc_usb_cdc_8h_data.LIB |
Ai8051U-8系列/STC8H系列Small存储模式USB-CDC库函数 |
stc_usb_cdc_8h_data_bl51.LIB |
Ai8051U-8系列/STC8H系列Small存储模式,超64K代码USB-CDC库函数 |
stc_usb_cdc_8h_xdata.LIB |
Ai8051U-8系列/STC8H系列Large存储模式USB-CDC库函数 |
stc_usb_cdc_8h_xdata_bl51.LIB |
Ai8051U-8系列/STC8H系列Large存储模式,超64K代码USB-CDC库函数 |
stc_usb_cdc_32g.LIB |
Ai8051U-32系列/STC32G系列64K代码模式USB-CDC库函数 |
stc_usb_cdc_32g_huge.LIB |
Ai8051U-32系列/STC32G系列Huge代码模式USB-CDC库函数 |
库文件名 |
功能说明 |
stc_usb_hid_8h_data.LIB |
Ai8051U-8系列/STC8H系列Small存储模式USB-HID库函数 |
stc_usb_hid_8h_data_bl51.LIB |
Ai8051U-8系列/STC8H系列Small存储模式,超64K代码USB-HID库函数 |
stc_usb_hid_8h_xdata.LIB |
Ai8051U-8系列/STC8H系列Large存储模式USB-HID库函数 |
stc_usb_hid_8h_xdata_bl51.LIB |
Ai8051U-8系列/STC8H系列Large存储模式,超64K代码USB-HID库函数 |
stc_usb_hid_32g.LIB |
Ai8051U-32系列/STC32G系列64K代码模式USB-HID库函数 |
stc_usb_hid_32g_huge.LIB |
Ai8051U-32系列/STC32G系列Huge代码模式USB-HID库函数 |
4、USB库函数详解:query(查询方式)和interrupt(中断方式)区别
- query(查询方式):固定的执行间隔,只有一个循环执行完,到达执行语句才会响应。适应于非紧急、大数据量的非实时性传输(如传感器数据、
网页数据、文件下载)。
- interrupt(中断方式):不管代码执行到哪一行,当产生了“中断请求”时会立即响应,主机收到后优先处理该数据。适应于紧急、小数据量、
低延迟的实时性传输(如设备错误码、状态切换通知)。
5、USB库函数详解:头文件
- STC USB库文件包含两个头文件“ai_usb.h”和“stc32_stc8_usb.h”。官方手册注解“ai_usb.h”为“Ai8051U系列USB库函数头文件”,
“stc32_stc8_usb.h”为“STC8H/STC32G系列USB库函数头文件”。实际比较了下,代码是一致的。
6、移植USB不停电下载关键部分到工程

(复制工程需要的头文件和lib库文件到工程项目文件夹内,并调用头文件和将lib文件添加到项目)

((冲哥视频的项目文件下是没有“ai8051u.h”,但为何编译时也不会报错?是因为之前使用AiCube添加过型号和头文件到Keil安装目录下。双引号调用的头
文件会先在工程目录下查找头文件是否存在,如果工程目录下没有对应的头文件,会继续到Keil的安装目录下查找。如未提前添加过STC的头文件到Keil
目录下,才会报错。)
usb_init(); //USB-CDC接口配置(USB初始化)
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
(最新的USB库函数内已包含了用户程序中不需要再对USER_DEVICEDESC,USER_PRODUCTDESC,USER_STCISPCMD进行定义。因此使用新USB库
函数时,用户程序中无需再进行定义。如定义了,需要删除掉。)
P_SW2 |= 0x80; //使能访问XFR
IE2 |= 0x80; //使能USB中断
EA = 1; //使能中断总开关
a. P_SW2功能脚切换控制寄存器的B7(EAXFR)为“扩展 RAM 区特殊功能寄存器(XFR)访问控制寄存器”,而USB的一些寄存器都在"EAXFR"的列表里(可查看
Ai8051U手册的第13.4章节(扩展特殊功能寄存器列表))。因此需要使能B7位(EAXFR),才可正常访问USB的这些寄存器。为何不直接赋值要使用“|= 0x80”(或=)
呢?如果直接赋值,会改变P_SW2寄存器的其它位状态,因此使用“|= 0x80”只会改变B7的状态(P_SW2支持位寻址,也可以写为 EAXFR = 1)

b. IE2中断使能寄存器的B7(EUSB)为"USB中断允许位",因此需要对IE2的B7位进行赋值使能。同样为了不影响IE2的其它位,使用“|= 0x80”对IE2的B7位(EUSB)进
行赋值(IE2也支持位寻址,同样可以写为 EUSB = 1)

c. EA为总中断允许控制位,也就是所有中断的总开关(可查看Ai8051U手册第15.2章节了解)。如果EA未使能,就算中断允许位使能了,也同样无法实现功能。

if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
(最新USB库函数,不需要等待USB配置完成,在printf_usb和USB_SendData函数中对配置状态和忙标志进行了检测。因些无需添加
"while (DeviceState = DEVSTATE_CONFIGURED);"这段代码。
7、完整工程代码(Ai8051U 擎天柱核心板_版本)
#include "Ai8051U.h"
#include "ai_usb.h"
void main(void)
{
P_SW2 |= 0x80; //使能访问XFR
P2M1 = 0x00; P2M0 = 0x00; //P2端口设置为准双向模式
usb_init(); //USB-CDC接口配置(USB初始化)
IE2 |= 0x80; //使能USB中断
EA = 1; //使能中断总开关
while(1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
P20 = 0; //点亮P20对应的LED
//P22 = 0; //点亮P22对应的LED
}
}
8、学习USB不停电下载_实验视频