8H8K64U Printf_USB 打卡
实验一:printf_usb("Hello World !\r\n"), 第一个完整的C语言1.进入STC官网https://www.stcai.com/,点击软件工具-库函数
2.找到库函数并下载
3.源代码:#include "stc8h.h"//头文件不分大小写,但关键字分大小写
#include "ai_usb.h" //USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库
void main(void)
{
// 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接口进行数据传输是一种常见且高效的方式。以下是对该帖子的专业分析与回复:
代码分析
1. 头文件引入:
#include "stc8hh":引入STC8系列单片机的头文件,定义了相关寄存器和宏。
#include "stc32stc8usbh":引入USB相关的头文件,提供了USB初始化和数据传输的函数。
#include "intrinsh":引入内联函数库,提供了一些常用的内联函数,如延时函数。
2. 函数声明:
void usbcallback();:声明USB中断回调函数,用于处理USB数据传输。
void Delay1000ms();:声明延时函数,用于实现1秒的延时。
3. 主函数 main():
PSW2 |= 0x80;:设置PSW2寄存器的最高位,可能用于配置某些外设或功能。
配置P0-P7端口为推挽输出模式,初始化所有I/O口为低电平。
usbinit();:初始化USB接口,配置为CDC(Communication Device Class)模式。
setusbOUTcallback(usbcallback);:设置USB输出中断的回调函数。
EA = 1;:使能全局中断。
进入主循环,通过printf函数向USB接口发送“Hello World !\r\n”字符串,并调用Delay1000ms函数实现1秒的延时。
4. USB回调函数 usbcallback():
该函数在USB数据输出时被调用,用于处理USB数据传输。具体实现未完整展示,但通常包括数据接收、处理和发送等操作。
代码优化建议
1. 延时函数优化:
Delay1000ms函数的具体实现未展示,建议使用定时器实现精确延时,避免使用空循环延时,以提高系统效率。
2. USB数据传输优化:
在usbcallback函数中,建议添加数据校验和错误处理机制,确保数据传输的可靠性。
可以考虑使用DMA(直接内存访问)进行USB数据传输,减少CPU的负担。
3. 代码可读性:
建议在关键代码段添加注释,解释其功能和实现原理,提高代码的可读性和可维护性。
使用宏定义或枚举类型代替魔法数字,如PSW2 |= 0x80;中的0x80,提高代码的可读性。
总结
该代码展示了如何在STC8系列单片机上通过USB接口实现简单的数据传输功能。通过合理的优化和改进,可以进一步提高代码的效率和可靠性。希望以上分析和建议对您的开发工作有所帮助。
如果您有更多问题或需要进一步的帮助,请随时联系。
[本文内容由国芯人工智能辅助生成,仅供参考] 实验二: 查询方式,查询到电脑命令后,printf_usb("Hello World !\r\n")或其他
源代码:#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==7)
printf_usb("HelloWorld!\r\n");
//接收到的数据包的第 0 个字节是 7,打印“HelloWorld!”
else if(UsbOutBuffer==8)
printf_usb("China!\r\n");
//接收到的数据包的第 0 个字节是 8 后,打印“China!”
usb_OUT_done(); //USB 查询方式,Device 单片机通知【主机可以发下一个数据包】
//当使用査询方式 if(bUsbOutReady),查询调用 USB 库函数时,在数据处理完成后,
//必须调用一次“usb_OUT_done();”,这样才能接收下一包数据。
//如果是使用中断方式调用 USB 库函数,用户程序不需要调用“usb_OUT_done();”
//中断方式,USB 库函数内部会自动处理。
}
}
}
实验三: 中断方式,单片机USB中断接收服务函数收到命令后,printf_usb("Hello World !\r\n")或其他
源代码:
#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 == 7)
printf_usb("Hello World !\r\n");
//接收到数据 7后,直接打印输出“Hello World !”到主机相应软件的 USB【CDC/HID-串口助手】
// \r 是回车,跳到行首,\n 是换行,就是换到下一行;\r\n 不要交换次序
else if (UsbOutBuffer == 8)
printf_usb("China !\r\n");
//接收到数据 8 后,直接打印输出 “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]