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("Hello World! \r\n");
}
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&aid=92533" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:printf_usb_hello.zip</a></p>
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 配置、串口通信等。
可以结合其他外设模块,例如传感器、显示屏等,开发更丰富的应用。
可以优化代码结构,提高代码效率和可读性。
免责声明: 本文仅供参考,实际操作请以官方文档为准。
[本文内容由国芯人工智能辅助生成,仅供参考]
////////////////////////////////////////
// 文件名称: 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(); //当前包的数据处理完成
}
}
{:4_250:} AiCube工具很强大,抓紧学习,谢谢楼主的使用例程 后续其他芯片也支持就好了 zhangrenbee 发表于 2025-4-11 08:35
后续其他芯片也支持就好了按下面顺序补全:
1, AI8051U-32Bit;
2, AI8051U-8Bit;
3, STC32G12K128系列;
4, STC8H8K64U系列;
越来越好用了 神农鼎 发表于 2025-4-11 16:46
按下面顺序补全:
1, AI8051U-32Bit;
2, AI8051U-8Bit;
{:qiang:}
页:
[1]