找回密码
 立即注册
查看: 46|回复: 3

8H8K64U Printf_USB 打卡

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-27 09:57:04
已绑定手机

9

主题

46

回帖

352

积分

版主

积分
352
发表于 4 天前 | 显示全部楼层 |阅读模式
实验一:printf_usb("Hello World !\r\n"), 第一个完整的C语言
1.打开官方网站:https://www.stcai.com/,点“软件工具—库函数”
截图202504271616523655.jpg
2.创建keil51新的project:
截图202504271617276331.jpg
截图202504271618522487.jpg
3.添加USB库文件
双击 Source Group 1,找到库文件:stc_usb_cdc_8h_data_bl51.LIB进行添加:
截图202504271622594182.jpg
4.编译图片
截图202504271626298312.jpg

5.测试截图:

截图202504271626579022.jpg

6.源代码:
#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 不要交换次序
        }
}





回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 4 天前 | 显示全部楼层
实验一:通过USB接口实现“Hello World”输出

实验背景与目的

本实验旨在通过USB接口实现“Hello World”字符串的输出,验证基于特定微控制器的USB通信功能。通过编写C语言程序,配置USB接口,并使用printfusb函数将字符串发送到主机端,从而完成一个完整的USB通信实验。

实验环境
微控制器:8H8K64U
开发环境:Keil uVision或其他支持C语言的IDE
编译器:支持C语言的编译器
USB接口:CDC(Communication Device Class)模式

实验步骤

1. 硬件配置
确保微控制器的USB接口已正确连接至主机。
配置微控制器的GPIO端口为默认状态,确保USB接口正常工作。

2. 软件配置
包含必要的头文件,如stc8h.h、stc32stc8usb.h和intrins.h。
初始化USB接口,并设置USB输出回调函数。

3. 主程序编写
在主函数中,首先配置微控制器的GPIO端口。
调用usbinit()函数初始化USB接口。
设置USB输出回调函数usbcallback()。
启用全局中断EA = 1。
在无限循环中,使用printfusb("Hello World !\r\n")函数通过USB接口发送字符串,并调用Delay1000ms()函数实现1秒的延时。

源代码解析
  1. c
  2. include "stc8h.h"
  3. include "stc32stc8usb.h"
  4. include "intrins.h"
  5. void usbcallback();
  6. void Delay1000ms();
  7. void main()
  8. {
  9.     PSW2 |= 0x80;
  10.    
  11.     P0M1 = 0x00;   P0M0 = 0x00;
  12.     P1M1 = 0x00;   P1M0 = 0x00;
  13.     P2M1 = 0x00;   P2M0 = 0x00;
  14.     P3M1 = 0x00;   P3M0 = 0x00;
  15.     P4M1 = 0x00;   P4M0 = 0x00;
  16.     P5M1 = 0x00;   P5M0 = 0x00;
  17.     P6M1 = 0x00;   P6M0 = 0x00;
  18.     P7M1 = 0x00;   P7M0 = 0x00;
  19.    
  20.     usbinit();                                     //USB CDC 接口配置
  21.     setusbOUTcallback(usbcallback);             //设置中断回调回调函数
  22.    
  23.     EA = 1;
  24.     while (1)
  25.     {
  26.         printfusb("Hello World !\r\n");
  27.         Delay1000ms();
  28.     }
  29. }
复制代码

代码说明
头文件包含:stc8h.h包含微控制器的寄存器定义,stc32stc8usb.h包含USB接口的相关函数和定义,intrins.h包含一些内联函数。
GPIO配置:将P0到P7的端口模式设置为默认状态,确保USB接口正常工作。
USB初始化:调用usbinit()函数初始化USB接口,并设置USB输出回调函数usbcallback()。
全局中断:启用全局中断EA = 1,确保USB中断能够正常触发。
主循环:在无限循环中,使用printfusb("Hello World !\r\n")函数通过USB接口发送字符串,并调用Delay1000ms()函数实现1秒的延时。

实验结果

编译并下载程序到微控制器后,通过USB接口连接至主机,可以在主机端的串口调试工具中看到每隔1秒输出一次“Hello World !”字符串,表明USB通信功能正常。

实验总结

本实验通过编写C语言程序,配置USB接口,并使用printfusb函数实现了“Hello World”字符串的输出。实验验证了基于8H8K64U微控制器的USB通信功能,为后续更复杂的USB应用开发奠定了基础。

注意事项
确保USB接口连接正确,避免硬件连接问题导致通信失败。
在调试过程中,可以使用串口调试工具实时监控USB通信数据,便于排查问题。
根据实际需求,可以调整Delay1000ms()函数的延时时间,控制字符串输出的频率。

扩展应用

本实验为基础实验,后续可以在此基础上扩展更多功能,如通过USB接口实现数据传输、控制外部设备等。同时,可以结合其他外设模块,实现更复杂的系统功能。

参考文献
8H8K64U微控制器数据手册
USB CDC协议规范
C语言编程指南

附录
编译环境配置说明
USB接口连接示意图
串口调试工具使用指南

通过本实验,读者可以掌握基于8H8K64U微控制器的USB通信基本方法,为后续的嵌入式系统开发提供参考。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-27 09:57:04
已绑定手机

9

主题

46

回帖

352

积分

版主

积分
352
发表于 4 天前 | 显示全部楼层
实验二: 查询方式,查询到电脑命令后,printf_usb("Hello World !\r\n")或其他
1.编译图片:
截图202504271633182941.jpg
2.测试图片:
截图202504271632415756.jpg
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 不要交换次序
        }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-27 09:57:04
已绑定手机

9

主题

46

回帖

352

积分

版主

积分
352
发表于 4 天前 | 显示全部楼层
实验三: 中断方式,单片机USB中断接收服务函数收到命令后,printf_usb("Hello World !\r\n")或其他
1.编译截图:


截图202504271637294499.jpg

2.测试截图:
截图202504271637595729.jpg

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[0] == 7)
printf_usb("Hello World !\r\n");
//接收到数据 7后,直接打印输出“Hello World !”到主机相应软件的 USB【CDC/HID-串口助手】
// \r 是回车,跳到行首,\n 是换行,就是换到下一行;\r\n 不要交换次序
else if (UsbOutBuffer[0] == 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);
}


回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 21:02 , Processed in 0.113871 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表