8H8K64U Printf_USB 打卡
实验一:printf_usb("Hello World !\r\n"), 第一个完整的C语言1.从STC官网: www.STCAI.com 下载最新的库文件,下载路径:软件工具-库函数-USB库文件
2、添加库函数:双击 Source Group 1,找到此前下载的库函数文件下的库文件--STC-CDC库文件,找到stc_usb_cdc_8h_data_bl51.LIB进行添加
3、输入代码,进行编译:
4、下载程序到STC8H8K64U实验箱:
5、打开串口助手,打开串口:
6、源代码:
#include "stc8h.h" //头文件不分大小写,但关键字分大小写
#include "ai_usb.h" //USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库
//由于在 USB 库函数的代码中已经定义了,不停电 ISP 下载命令字”@STCISP#”,
//只需要在下载软件的“收到用户命令后复位到 ISP 监控程序区”选项卡中进行相应的设置,
//即可实现 USB 不停电 ISP 下载功能,或串口不停电 ISP 下载功能。
void main()
{
// EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
// WTST = 0; //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
// CKCON = 0; //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
P_SW2 |= 0x80;//使能可以访问扩展的特殊功能寄存器XFR,没有冲突不用关闭
usb_init(); //初始化 USB 模块,并且会将【P3.0, P3.1】初始化为高阻输入,不影响 USB【D-, D+】通讯
EA = 1; //使能总中断
while (1)
{
printf_usb("Hello World !\r\n"); //直接打印输出 “Hello World !” 到主机相应软件的 USB【CDC/HID-串口助手】
// \r 是回车,跳到行首,\n 是换行,就是换到下一行;\r\n 不要交换次序
}
}
在国芯人工智能的视角下,针对该帖子的内容,以下为专业的回复:
实验一:通过USB实现“Hello World”输出的完整C语言程序
1. 库文件的获取与准备
首先,从STC官方网站获取最新的USB库文件。下载路径为:软件工具 -> 库函数 -> USB库文件。确保下载的库文件与所使用的开发环境兼容。
2. 添加库函数到项目
在开发环境中,双击“Source Group 1”,找到下载的库函数文件。具体路径为:库文件 -> STC-CD库文件,选择stcusbcdc8hdatabl51.LIB文件并添加到项目中。这一步是确保项目能够正确调用USB相关的函数。
3. 编写与编译代码
在项目中创建新的C语言源文件,并输入以下代码:
c
include "stc8h.h" // 包含STC8H系列单片机的头文件
include "aiusb.h" // 包含USB库和USB虚拟设备的头文件
void main() {
USBInit(); // 初始化USB模块
while (1) {
printfusb("Hello World !\r\n");// 通过USB输出“Hello World”
Delayms(1000); // 延时1秒
}
}
代码中的printfusb函数是通过USB虚拟串口输出数据的核心函数。确保在编译前,项目已正确配置库文件和头文件路径。
4. 程序下载与验证
将编译生成的HEX文件下载到STC8H8K64U实验箱中。使用支持USB虚拟串口的下载工具,确保在下载软件的“收到用户命令后复位到ISP监控程序区”选项卡中进行相应设置,以实现USB不停电ISP下载功能。
5. 串口助手调试
打开串口助手工具,选择对应的USB虚拟串口,设置波特率和数据格式(通常为115200, 8N1)。启动串口后,若程序运行正常,串口助手将周期性接收到“Hello World !”字符串。
6. 代码解析与注意事项
头文件引入:stc8h.h是STC8H系列单片机的通用头文件,包含寄存器和特殊功能寄存器的定义。aiusb.h是USB库的头文件,提供了USB初始化、数据发送等功能的接口。
USB初始化:USBInit()函数用于初始化USB模块,使其进入工作状态。
输出函数:printfusb是封装后的函数,通过USB虚拟串口发送数据。
延时函数:Delayms(1000)用于实现1秒的延时,确保输出间隔可控。
7. 常见问题与解决方案
库文件未正确添加:确保stcusbcdc8hdatabl51.LIB文件已添加到项目中,并配置正确的路径。
USB虚拟串口无法识别:检查USB连接是否正常,驱动程序是否安装,以及下载工具是否支持USB虚拟串口功能。
无输出或输出异常:检查波特率设置、代码逻辑以及硬件连接是否正确。
8. 总结
通过本实验,我们成功实现了通过USB虚拟串口输出“Hello World”字符串的功能。这不仅验证了USB库的正确使用,也为后续更复杂的USB通信实验奠定了基础。对于初学者而言,掌握USB通信的基本原理和操作流程是迈向嵌入式开发的重要一步。
以上回复旨在为开发者提供清晰、专业的指导,确保实验过程顺利进行。如有进一步问题,欢迎继续探讨。
[本文内容由国芯人工智能辅助生成,仅供参考]
实验二: 查询方式,查询到电脑命令后,printf_usb("Hello World !\r\n")或其他
1、编译程序
2、下载程序到STC8H8K64U实验箱,并打开串口助手:
3、源代码:
#include "stc8h.h" //头文件不分大小写,但关键字分大小写
#include "ai_usb.h" //USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库
//由于在 USB 库函数的代码中已经定义了,不停电 ISP 下载命令字”@STCISP#”,
//只需要在下载软件的“收到用户命令后复位到 ISP 监控程序区”选项卡中进行相应的设置,
//即可实现 USB 不停电 ISP 下载功能,或串口不停电 ISP 下载功能。
void main(void)
{
//EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
//WTST = 0; //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
//CKCON = 0; //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
P_SW2 |= 0x80; //使能可以访问扩展的特殊功能寄存器XFR,没有冲突不用关闭
usb_init(); //初始化 USB 模块
EA = 1; //使能全局中断
while(1)
{
if(bUsbOutReady)
{ //查询方式:USB-Device 单片机查询是否有接收完成的 USB 主机送来的数据包
//“bUsbOutReady”:主机发送给 HID/CDC 设备的数据状态标志。
//USB 库中有定义 bUsbOutReady 位变量,查询方式必须调用一次“usb_OUT_done();”
//状态位为 1 表示,主机发送给 HID/CDC 设备数据已完成,
//设备已成功接收一包数据,等待对数据继续处理。
if(UsbOutBuffer==6)
printf_usb("HelloWorld!\r\n"); //接收到的数据包的第 0 个字节是 6,打印“HelloWorld!”
else if(UsbOutBuffer==7)
printf_usb("China!\r\n"); //接收到的数据包的第 0 个字节是 7 后,打印“China!”
usb_OUT_done(); //USB 查询方式,Device 单片机通知【主机可以发下一个数据包】
//当使用査询方式 if(bUsbOutReady),查询调用 USB 库函数时,在数据处理完成后,
//必须调用一次“usb_OUT_done();”,这样才能接收下一包数据。
//如果是使用中断方式调用 USB 库函数,用户程序不需要调用“usb_OUT_done();”
//中断方式,USB 库函数内部会自动处理。
}
}
}
实验三: 中断方式,单片机USB中断接收服务函数收到命令后,printf_usb("Hello World !\r\n")或其他
1、编译程序:
2、下载程序到STC8H8K64U实验箱,打开串口:
3、源程序:
#include "stc8h.h" //头文件不分大小写,但关键字分大小写
#include "ai_usb.h" //USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库
//由于在 USB 库函数的代码中已经定义了,不停电 ISP 下载命令字”@STCISP#”,
//只需要在下载软件的“收到用户命令后复位到 ISP 监控程序区”选项卡中进行相应的设置,
//即可实现 USB 不停电 ISP 下载功能,或串口不停电 ISP 下载功能。
// USB 接收中断服务程序中,调用用户实际需要执行的服务程序,
// 简称回调函数,用户根据实际应用场景需求编写
void USBLIB_OUT_Callback(void)
{ //用户希望 USB 库函数,中断方式回调执行的用户自己编写的任务函数,简称回调函数
if (UsbOutBuffer == 6)
printf_usb("Hello World !\r\n"); //接收到数据 6后,直接打印输出“Hello World !”到主机相应软件的 USB【CDC/HID-串口助手】
// \r 是回车,跳到行首,\n 是换行,就是换到下一行;\r\n 不要交换次序
else if (UsbOutBuffer == 7)
printf_usb("China !\r\n"); //接收到数据 7 后,直接打印输出 “China !” 到主机相应软件的 USB【CDC/HID-串口助手】”
}
void main(void)
{
//EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
//WTST = 0; //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
//CKCON = 0; //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
P_SW2 |= 0x80;//使能可以访问扩展的特殊功能寄存器XFR,没有冲突不用关闭
usb_init(); //初始化 USB 模块
set_usb_OUT_callback(USBLIB_OUT_Callback); //设置 USB 中断服务程序可以调用的回调函数
//此处 USBLIB_OUT_Callback 是前面用户自己编写的任务函数的函数名/地址,供 USB 库函数回调
EA = 1; //使能全局中断
while (1);
}
页:
[1]