lijinlei 发表于 2025-4-9 17:12:03

AiCube@AIapp-ISP V6.95M - USB通信就是简单!printf_usb("Hello World !\r\n”)

<h1>AiCube 试用 -USB 打印 Hello World</h1>
<p><img src="https://www.stcaimcu.com/data/attachment/forum/202504/09/155552nn3tuf3jyt3jauzj.jpg" alt="" /></p>
<p>本文介绍了 Aiapp-ISP 仿真调试平台软件的 <strong>AiCube</strong> 工具实现 USB 打印 Hello World 的主要流程。</p>
<h2>项目介绍</h2>
<p><strong>该项目通过定时器中断实现硬件 USB-CDC 直接打印字符串,同时翻转 P20 的输出电平。</strong></p>
<p><strong>程序流程图</strong></p>
<p><img src="file:///D:/SoftwarePackage/51MCU/MyStudyDiary/AICube_printf-USB/flowchart.jpg?lastModify=1744189447" alt="" /><br />
<img src="data/attachment/forum/202504/09/170707onjcq76pc7jnc4z4.jpg" alt="flowchart.jpg" title="flowchart.jpg" /></p>
<h2>硬件平台</h2>
<p>硬件测试平台为基于 AI8051U-34K64 主控的 <strong>擎天柱</strong> 开发板</p>
<p><img src="file:///D:/SoftwarePackage/51MCU/MyStudyDiary/AICube_printf-USB/board.jpg?lastModify=1744189447" alt="" /><br />
<img src="data/attachment/forum/202504/09/170718yhysosqh7y7hyndq.jpg" alt="board.jpg" title="board.jpg" /></p>
<h2>下载软件</h2>
<p><a href="https://www.stcai.com/gjrj">下载</a> 最新版 <code>AIapp-ISP</code> 软件;</p>
<p>解压并打开该软件,右侧操作界面选择并进入 <code>Keil 仿真设置</code> 标签项;</p>
<h2>仿真设置</h2>
<p><strong>选择目标单片机型号 - 添加型号和头文件到 Keil - 选择 Keil 安装目录文件夹 - 确定,提示添加成功;</strong></p>
<p><img src="file:///D:/SoftwarePackage/51MCU/MyStudyDiary/AICube/Keil_MCU_add.jpg?lastModify=1744189447" alt="" /><br />
<img src="data/attachment/forum/202504/09/170832ovf7f4fz94413ff2.jpg" alt="Keil_MCU_add.jpg" title="Keil_MCU_add.jpg" /></p>
<h2>创建项目</h2>
<p>菜单栏点击 <code>AiCube</code> 标签,进入 <code>项目创建助手</code></p>
<p>选择目标单片机型号 - 填写项目名称 - 设置保存路径 - 点击 <code>下一步</code></p>
<h2>参数配置</h2>
<p><strong>进入参数配置界面</strong></p>
<p>取消勾选 <code>CLK 时钟</code> 项</p>
<p>勾选 <code>外设</code> - <code>USB 通用串行总线</code> 项,并进行相关配置</p>
<p><img src="data/attachment/forum/202504/09/170904j5kkqvjoqoqqqhhe.jpg" alt="aicube_usb.jpg" title="aicube_usb.jpg" /></p>
<p>勾选 <code>TIMER 定时器</code> - <code>TIMER0</code>,并进行相关配置,打开定时器0</p>
<p><img src="file:///D:/SoftwarePackage/51MCU/MyStudyDiary/AICube_printf-USB/aicube_timer.jpg?lastModify=1744189447" alt="" /><br />
<img src="data/attachment/forum/202504/09/170914puqm39ua9dphp7b2.jpg" alt="aicube_timer.jpg" title="aicube_timer.jpg" /></p>
<p>注意 <code>定时器周期</code> 需根据实际情况设置合适的数值和单位。</p>
<h2>生成工程</h2>
<p>点击 <code>创建项目</code> 即可获得预先配置参数的 Keil 工程。</p>
<p><strong>此时查看目标路径发现 AiCube 工具创建的工程文件,包括 Keil 文件、库文件夹等标准工程格式;</strong></p>
<p>双击打开生成的 Keil 文件,进入 <code>main.c</code> 主函数文件</p>
<p><strong>可见代码已根据 AiCube 工具的配置,提前配置完成定时器和中断初始化等函数。</strong></p>
<p><strong>编译一下直接生成的工程,确保无误。</strong></p>
<h2>代码添加</h2>
<p><strong>根据项目流程图,在主循环中增加中断标志判断语句,当满足中断条件时,进入中断并执行 USB 打印指令;</strong></p>
<p><img src="data/attachment/forum/202504/09/171000cd0ti5wwjtbdyj38.jpg" alt="code_while.jpg" title="code_while.jpg" /></p>
<pre><code class="language-c++">bit t0_flag = 0;
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    SYS_Init();

    while (1)
    {
                        if(t0_flag)
                        {
                                t0_flag = 0;
                                printf_usb(&quot;Hello World! \r\n&quot;);
                        }
      USBLIB_OUT_Done();            //查询方式处理USB接收的数据
    }
}
</code></pre>
<p><strong>之后在定时器中断函数中添加 GPIO 输出电平的控制语句,实现 LED 状态翻转,用以提示 USB 消息发送状态</strong></p>
<p><img src="data/attachment/forum/202504/09/171011o7e067l7htiusake.jpg" alt="code_timer-isr.jpg" title="code_timer-isr.jpg" /></p>
<pre><code class="language-c++">////////////////////////////////////////
// 定时器0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
        P20 = ~P20;
        t0_flag = 1;
}
</code></pre>
<p><strong>之后保存并重新编译工程。</strong></p>
<p><strong>完整工程见附件。</strong></p>
<h2>固件烧录</h2>
<p>生成的 HEX 烧录固件位于 <code>Objects</code> 文件夹下,</p>
<p>使用 Type-C 数据线连接开发板和电脑,按住 <code>P32</code> 按键的同时,短按 <code>POWER</code> 按键,</p>
<p>此时 Aiapp-ISP 软件自动识别 <code>HID</code> 设备</p>
<p><img src="file:///D:/SoftwarePackage/51MCU/MyStudyDiary/AICube_printf-USB/isp_writer.jpg?lastModify=1744189447" alt="" /><br />
<img src="data/attachment/forum/202504/09/171049h123gkdd1qu2a1k2.jpg" alt="isp_writer.jpg" title="isp_writer.jpg" /></p>
<p>点击 <code>下载/编程</code> 按钮,待烧录结束,程序自动运行。</p>
<h2>效果演示</h2>
<p>进入 <code>CDC/HID-串口助手</code> 标签,选择目标 <code>USB-CDC</code> 设备,波特率 <code>115200 bps</code>,打开串口即可接收硬件 USB 打印的消息</p>
<p><img src="data/attachment/forum/202504/09/171113a6699690bxb1w5zz.jpg" alt="isp_printf.jpg" title="isp_printf.jpg" /></p>
<p><strong>动态效果</strong></p>
<p><img src="data/attachment/forum/202504/09/171125dqq7gkrvzjvdma5j.gif" alt="usb-cdc.gif" title="usb-cdc.gif" /></p>
<p><strong>同时 P20 输出翻转电平,对应的板载 LED 闪烁,间隔为 1 个定时器周期</strong></p>
<p><img src="file:///D:/SoftwarePackage/51MCU/MyStudyDiary/AICube_printf-USB/blink_P20.gif?lastModify=1744189447" alt="" /><br />
<img src="data/attachment/forum/202504/09/171144shh1mezf172pxcm7.gif" alt="blink_P20.gif" title="blink_P20.gif" /></p>
<h2>总结</h2>
<p>本文介绍了 Aiapp-ISP 仿真调试平台软件的 <strong>AiCube</strong> 工具实现硬件 USB 打印 Hello World 的主要流程,为 STC 系列单片机的快速开发和应用提供了参考。</p>
<p><a href="forum.php?mod=attachment&amp;aid=92533" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:printf_usb_hello.zip</a></p>

国芯人工智能 发表于 2025-4-9 17:18:00

AiCube 试用 - USB 打印 Hello World 项目解析

本文详细解析了基于 Aiapp-ISP 仿真调试平台软件的 AiCube 工具,实现 USB 打印 "Hello World" 字符串的项目流程。该项目利用定时器中断机制,通过硬件 USB-CDC 直接输出字符串,并同步翻转 P20 引脚的电平状态。

一、项目概述

目标: 实现 USB 打印 "Hello World" 字符串,并控制 P20 引脚电平翻转。
硬件平台: 基于 AI8051U-34K64 主控的擎天柱开发板。
软件工具: Aiapp-ISP 仿真调试平台软件、Keil 开发环境。

二、项目流程

1. 软件下载与安装:
   下载最新版 Aiapp-ISP 软件并解压。
   打开软件,在右侧操作界面选择并进入 "Keil 仿真设置" 标签项。
   选择目标单片机型号,添加型号和头文件到 Keil,选择 Keil 安装目录文件夹,确认后提示添加成功。

2. 项目创建:
   点击菜单栏 "AiCube" 标签,进入 "项目创建助手"。
   选择目标单片机型号,填写项目名称,设置保存路径,点击 "下一步"。
   进入参数配置界面,取消勾选 "CLK 时钟" 项。
   勾选 "外设 - USB 通用串行总线" 项,并进行相关配置。
   勾选 "TIMER 定时器 - TIMER0",并进行相关配置,打开定时器0。
   注意:定时器周期需根据实际情况设置合适的数值和单位。
   点击 "创建项目" 即可获得预先配置参数的 Keil 工程。

3. 代码编写与编译:
   双击打开生成的 Keil 文件,进入 main.c 主函数文件。
   可见代码已根据 AiCube 工具的配置,提前配置完成定时器和中断初始化等函数。
   编译一下直接生成的工程,确保无误。
   根据项目流程图,在主循环中增加中断标志判断语句,当满足中断条件时,执行 USB 打印 "Hello World" 字符串和 P20 引脚电平翻转操作。

三、关键点解析

AiCube 工具: 该工具简化了项目创建流程,自动生成包含必要配置的 Keil 工程文件,提高了开发效率。
定时器中断: 利用定时器中断机制,实现周期性触发 USB 打印和引脚电平翻转操作。
USB-CDC: 通过硬件 USB-CDC 直接输出字符串,无需额外的 USB 驱动,简化了开发流程。

四、总结

本项目展示了如何利用 AiCube 工具快速搭建基于 AI8051U-34K64 主控的开发环境,并实现 USB 打印和引脚控制功能。该项目流程清晰,代码简洁,为后续更复杂的应用开发奠定了基础。

五、未来展望

可以进一步探索 AiCube 工具的其他功能,例如 GPIO 配置、串口通信等。
可以结合其他外设模块,例如传感器、显示屏等,开发更丰富的应用。
可以优化代码结构,提高代码效率和可读性。

免责声明: 本文仅供参考,实际操作请以官方文档为准。

[本文内容由国芯人工智能辅助生成,仅供参考]

神农鼎 发表于 2025-4-10 08:03:09





////////////////////////////////////////
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2025-04-09) 创建文件
////////////////////////////////////////

#include "config.h"                     //默认已包含stdio.h、intrins.h、ai_usb.h等头文件

bit t0_flag = 0;
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    SYS_Init();

    while (1)
    {
      if(t0_flag)
      {
               t0_flag = 0;
               printf_usb("Hello World! \r\n");
      }
      USBLIB_OUT_Done();            //查询方式处理USB接收的数据
    }
}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramFastest();               //设置最快速度访问内部XDATA
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基

    P0M0 = 0x00; P0M1 = 0x00;         //初始化P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;         //初始化P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;         //初始化P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;         //初始化P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;         //初始化P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;         //初始化P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;         //初始化P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;         //初始化P7口为准双向口模式

    TIMER0_Init();                      //定时器0初始化
    USBLIB_Init();                      //USB库初始化

    EnableGlobalInt();                  //使能全局中断
}

////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
    uint16_t i;

    do
    {
      i = MAIN_Fosc / 6000;
      while (--i);
    } while (--ms);
}

////////////////////////////////////////
// 定时器0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
      P20 = ~P20;
      t0_flag = 1;
}


////////////////////////////////////////
// 定时器0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_Init(void)
{
#define T0_PSCR         25
#define T0_RELOAD       (65536 - (float)SYSCLK / 12 / (T0_PSCR + 1) * 500 / 1000)

    TIMER0_TimerMode();               //设置定时器0为定时模式
    TIMER0_12TMode();                   //设置定时器0为12T模式
    TIMER0_Mode0();                     //设置定时器0为模式0 (16位自动重载模式)
    TIMER0_DisableGateINT0();         //禁止定时器0门控
    TIMER0_SetIntPriority(0);         //设置中断为最低优先级
    TIMER0_EnableInt();               //使能定时器0中断
    TIMER0_SetPrescale(T0_PSCR);      //设置定时器0的8位预分频
    TIMER0_SetReload16(T0_RELOAD);      //设置定时器0的16位重载值
    TIMER0_Run();                     //定时器0开始运行
}

////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
    usb_init();                         //初始化USB模块
    USB_SetIntPriority(0);            //设置中断为最低优先级
    set_usb_ispcmd("@STCISP#");         //设置USB不停电下载命令
}

////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
    while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
}

////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
    if (bUsbOutReady)                   //查询是否有接收到数据
    {
      USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
      usb_OUT_done();               //当前包的数据处理完成
    }
}

中书门下平章事 发表于 2025-4-11 06:02:04

{:4_250:}

East Wind 41 发表于 2025-4-11 08:04:40

AiCube工具很强大,抓紧学习,谢谢楼主的使用例程

zhangrenbee 发表于 2025-4-11 08:35:45

后续其他芯片也支持就好了

神农鼎 发表于 2025-4-11 16:46:08

zhangrenbee 发表于 2025-4-11 08:35
后续其他芯片也支持就好了按下面顺序补全:
1, AI8051U-32Bit;
2, AI8051U-8Bit;
3, STC32G12K128系列;
4, STC8H8K64U系列;


ybw620813 发表于 2025-4-12 14:08:58

越来越好用了

jackfangxq 发表于 2025-4-19 18:53:51

神农鼎 发表于 2025-4-11 16:46
按下面顺序补全:
1, AI8051U-32Bit;
2, AI8051U-8Bit;


{:qiang:}
页: [1]
查看完整版本: AiCube@AIapp-ISP V6.95M - USB通信就是简单!printf_usb("Hello World !\r\n”)