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

8H8K64U Printf_USB 打卡

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2025-04-30 10:59:33

25

主题

1154

回帖

2391

积分

超级版主

积分
2391
发表于 4 天前 | 显示全部楼层 |阅读模式
实验一:printf_usb("Hello World !\r\n"), 第一个完整的C语言

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

如何获得上面"stc8h.h"和"ai usb.h"这2个头文件如已按照前面介绍的方法:
www.STCAL.com 网站,【软件工具|工具软件】处,下载安装最新的【Alapp-ISP 软件】选择其中的选项卡【Keil 仿真设置】
点击【添加型号和头文件到Keil中,并添加仿真器驱动到Keil中】按钮
如何添加 usb cdc 库函数文件,因为要使用到 USB 功能,必须在项目中添加 USB 库函数。这部分可以到:
STCAI的官网:https://www.stcai.com/khs 的 USB 库文件中进行下载:
截图202504271337136479.jpg
打开KEIL编译器并创建项目:
截图202504271439479562.jpg


然后USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库,双击 Source Group 1,找到库文件--STC-CDC库文件中对应的LIB函数进行添加
截图202504271421352330.jpg
截图202504271422165852.jpg
编译通过:0错误0警告
截图202504271442047945.jpg
打开最新ISP-V6.95M软件,把程序烧录到8H8K64U实验箱
截图202504271545356152.jpg
打开CDC串口助手,一直打印Hello Wold!
截图202504271551141801.jpg












8H8K64U实验1.zip

66.17 KB, 下载次数: 0

STC官网:https://www.stcai.com/
QQ:2593903262
微信号:18106296598
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 4 天前 | 显示全部楼层
在嵌入式系统开发中,使用C语言进行编程是非常常见的方式。您提供的代码展示了如何在特定的嵌入式平台上通过USB接口进行串口通信,并输出“Hello World!”信息。以下是对代码的详细解析和相关技术说明:

1. 头文件引入
  1. c
  2. include "stc8hh"  //头文件不分大小写,但关键字分大小写
  3. include "aiusbh" //USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库
复制代码
stc8hh:这是针对特定微控制器的头文件,包含了该芯片的寄存器定义和基本配置。头文件通常用于简化寄存器的访问和配置。
aiusbh:这是USB库的头文件,提供了USB通信相关的函数和配置。通常,这类库会封装底层的USB协议栈,简化开发者的操作。

2. 主函数
  1. c
  2. void main(void)
  3. {
  4.     PSW2 |= 0X80;  // 使能可以访问扩展的特殊功能寄存器XFR,没有冲突不用关闭
  5.     usbinit();     // 初始化 USB 模块,并且会将【P30, P31】初始化为高阻输入,不影响 USB【D-, D+】通讯
  6.     EA = 1;         // 使能总中断
复制代码
PSW2 |= 0X80;:这行代码用于使能访问扩展的特殊功能寄存器(XFR)。在一些嵌入式系统中,特殊功能寄存器需要通过特定配置才能访问。
usbinit();:初始化USB模块。这个函数通常会对USB硬件进行配置,并设置相关的引脚(如P30和P31)为高阻输入模式,以确保USB通信的正常进行。
EA = 1;:使能总中断。在嵌入式系统中,中断是处理异步事件的重要机制。使能总中断后,系统可以响应各种中断请求。

3. 主循环
  1. c
  2.     while(1)
  3.     {
  4.         printfusb("Hello World !\r\n");  // 直接打印输出 “Hello World !” 到主机相应软件的 USB【CDC/HID-串口助手】
  5.     }
  6. }
复制代码
while(1):这是一个无限循环,确保程序持续运行。
printfusb("Hello World !\r\n");:通过USB接口输出“Hello World!”字符串。printfusb是一个自定义的打印函数,它将字符串发送到主机的USB虚拟串口助手。\r\n表示回车和换行,确保每次输出的信息在新的一行显示。

4. 技术细节
USB通信:USB(Universal Serial Bus)是一种常见的串行通信协议,广泛应用于嵌入式系统和计算机外设之间的通信。在您的代码中,USB被配置为虚拟串口(CDC/HID),使得主机可以通过串口助手软件接收数据。
中断机制:在嵌入式系统中,中断用于处理异步事件。使能总中断后,系统可以响应外部事件(如USB数据传输)并执行相应的中断服务程序。
特殊功能寄存器(XFR):在一些嵌入式系统中,特殊功能寄存器用于配置和控制硬件模块。通过设置PSW2寄存器,开发者可以访问这些扩展的特殊功能寄存器。

5. 总结
您的代码展示了如何在嵌入式系统中通过USB接口进行简单的串口通信。通过初始化USB模块并使用printfusb函数,程序能够将“Hello World!”信息发送到主机的串口助手软件中。这种技术可以应用于各种嵌入式应用场景,如调试、数据采集和设备控制等。

如果您有进一步的问题或需要更深入的技术支持,请随时联系。我们将竭诚为您提供帮助。

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2025-04-30 10:59:33

25

主题

1154

回帖

2391

积分

超级版主

积分
2391
发表于 4 天前 | 显示全部楼层
实验二: 查询方式,查询到电脑命令后,printf_usb("Hello World !\r\n")或其他
源代码:
#include "ai8051u.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[0]==6)
    printf_usb("HelloWorld!\r\n");
    //接收到的数据包的第 0 个字节是 6,打印“HelloWorld!”
    else if(UsbOutBuffer[0]==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 库函数内部会自动处理。
  }
}
}


编译通过,0错误0警告
截图202504281013382018.jpg
下载程序到8H8K64U实验箱,并打开串口助手看想象:
点击6按钮,单片机收到 16 进制数6后,回送“Hello World!”给 USB 主机显示。
点击7按钮,单片机收到 16 进制数 7后,回送“China!”给 USB 主机显示。


截图202504280959223124.jpg











8H8K64U实验2.zip

62.14 KB, 下载次数: 0

STC官网:https://www.stcai.com/
QQ:2593903262
微信号:18106296598
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2025-04-30 10:59:33

25

主题

1154

回帖

2391

积分

超级版主

积分
2391
发表于 3 天前 | 显示全部楼层
实验三: 中断方式,单片机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[0] == 6)
          printf_usb("Hello World !\r\n");         //接收到数据 6 后,直接打印输出“Hello World !”到主机相应软件的 USB【CDC/HID-串口助手】  
                                                                                 // \r 是回车,跳到行首,\n 是换行,就是换到下一行;\r\n 不要交换次序
          else if (UsbOutBuffer[0] == 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);
         }


代码编译通过,0错误0警告
截图202504281014377612.jpg

程序下载到8H8K64U实验箱,并打开串口助手看想象(同实验2):
点击6按钮,单片机收到 16 进制数6后,回送“Hello World!”给 USB 主机显示。
点击7按钮,单片机收到 16 进制数 7后,回送“China!”给 USB 主机显示。


截图202504281010472733.jpg







8H8K64U实验3.zip

66.35 KB, 下载次数: 1

STC官网:https://www.stcai.com/
QQ:2593903262
微信号:18106296598
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 22:16 , Processed in 0.159697 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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