Ai8051U教学视频 USB不断电下载
本视频教会USB编译需要的库及需要源码的地方。学习容易。尊敬的用户:
感谢您对国芯人工智能(GOCHEM AI)的关注与支持。关于您提到的“AI8051U教学视频”及“USB不断电下载”的相关内容,我们在此进行专业说明与补充。
AI8051U是基于8051架构的嵌入式微控制器,常用于教学、开发和工业控制等场景。其支持通过USB接口进行程序下载与调试,这一功能在教学过程中具有重要意义,能够提升学习效率与操作便捷性。
在使用USB进行程序下载时,通常需要安装相应的驱动程序与开发环境。例如,在Windows系统下,可能需要安装CH340、CP210x等USB转串口芯片的驱动,以确保设备能够被正确识别。此外,开发工具如Keil uVision、IAR Embedded Workbench或国产开发平台如GD32 MCU Studio等,均需配置正确的库文件与编译选项,以实现代码的正常编译与下载。
针对“USB不断电下载”的需求,建议在开发过程中保持USB连接稳定,避免因断电导致程序丢失或烧录失败。同时,可考虑使用带有电源管理功能的开发板,或在开发环境中设置自动保存与备份机制,以提高开发过程的可靠性。
国芯人工智能致力于提供高效、稳定的嵌入式开发解决方案,涵盖从硬件设计到软件开发的全链条技术支持。若您在使用AI8051U或其他嵌入式平台时遇到技术问题,欢迎随时联系我们的技术支持团队,我们将竭诚为您服务。
感谢您的关注,祝您学习顺利,开发愉快!
国芯人工智能 技术支持部
2025年4月
[本文内容由国芯人工智能辅助生成,仅供参考] <p>8051U学习打卡第三天:USB不停电烧录学习笔记</p>
<h1>1.USB不停电烧录</h1>
<h2>1.1 AiCube生成不停电烧录最小代码(可直接查看规格书教程)</h2>
<p><span class="language-math">\qquad</span> 8051U内部自带高速晶振,并且系统时钟使用的晶振频率是根据 <em><strong>AiCube软件烧录</strong></em> 时选择的频率为准!!!如下图1所示,所以在进行项目配置时除非特殊情况,否则可以无需配置CLK项目,如下图2所示,全部是灰色</p>
<p><img src="data/attachment/forum/202508/08/165536vhybqasmmxgyqyxs.png" alt="image.png" title="image.png" /></p>
<center>图1 系统运行时工作频率</center>
<p></p>
<p><img src="data/attachment/forum/202508/08/165546d22c2gc2lcxdg2cc.png" alt="image-1.png" title="image-1.png" /></p>
<center>图2 CLK配置界面</center>
<p></p>
<p><span class="language-math">\qquad</span> 由于需要使用USB不停电烧录,所以需要使能USB外设,如下图3所示,其中USB协议推荐使用CDC而不是HID协议,虽然两者就是串口并且都可以进行USB不停电 烧录,但是CDC对比HID而言带宽高,支持大数据包传输,灵活性强,更适合进行程序的烧录;同时ISP下载命令可以自定义,不过这里如果自定义之后一定要记住!!!否则后面还是不能进行不停电烧录</p>
<p><img src="data/attachment/forum/202508/08/165551des90c50jqjptst5.png" alt="image-2.png" title="image-2.png" /></p>
<center>图3 USB配置界面</center>
<p></p>
<p><span class="language-math">\qquad</span> 完成以上配置之后既可生成代码,如果需要其他功能可自行添加,这里我就使用第一堂课的LED点灯!!!</p>
<h2>1.2 AiCube不停电烧录配置</h2>
<p><span class="language-math">\qquad</span> 首先第一步就是要确保单片机进入烧录模式,并且电脑的串口链接到了单片机如下图4第一步;<br />
<span class="language-math">\qquad</span> 第二步就是进入Aicube的“收到用户命令后复位到ISP监控程序区”,根据配置工程的USB进行配置,配置时选择的是CDC协议就选择CDC,配置时是HID就选择HID;同时需要根据配置项目时的下载命令更改此处的自定义命令,如果使用默认就直接默认烧录就行,如下图4第二步。同时由于8051U串口默认识别成HID设备和需要不停电烧录,所以也需要√上剩下两个命令!!!</p>
<p><img src="data/attachment/forum/202508/08/165609vzc79ihcru9zi9lf.png" alt="image-3.png" title="image-3.png" /></p>
<center>图4 AiCube不停电烧录配置</center>
<p></p>
<h1>2.生成的系统初始化代码简单说明</h1>
<pre><code class="language-C">EnableAccessXFR(); //使能访问扩展XFR
AccessCodeFastest(); //设置最快速度访问程序代码
AccessIXramFastest(); //设置最快速度访问内部XDATA
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基
</code></pre>
<p><span class="language-math">\qquad</span> 这些就不进行说明了,同第一天学习里面的初始化,代码生成时也给出来简单注释,所有寄存器都可以在规格书找到</p>
<pre><code class="language-C">USBLIB_Init() //USB库初始化
{
usb_init(); //初始化USB模块
USB_SetIntPriority(0); //设置中断为最低优先级
set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令
}
</code></pre>
<p><span class="language-math">\qquad</span> 此处的USBLIB_Init();函数是对USB进行初始化,使得支持USB不停电烧录,里面的函数只有这几个,</p>
<ol>
<li>首先是usb_init();函数,这个函数在stc_usb_cdc_32g.lib文件里面,暂时还没有学到,等到了USB_CDC章节再做笔记;</li>
<li>USB_SetIntPriority(0);备注说明了是根据形参设置中断优先级的函数;</li>
<li>set_usb_ispcmd("@STCISP#");这里面的参数就是配置自定义下载命令的命令,即使生成完成项目之后,依然可以回到Aicube或者直接在工程里面更改不停电烧录命令,同时也需要在Aicube烧录配置那里同时更改。</li>
</ol>
<p>8051U学习打卡第四天:GPIO_INPUT and OUTPUT<br />
昨天忙完了,今天弄完了都转钟了<img alt="liulei" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/liulei.gif" title="liulei" /> <img alt="liulei" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/liulei.gif" title="liulei" /><br />
说明:以后的实验均通过 <em><strong>AiCube生成代码</strong></em> !!!</p>
<h1>1.8051U的GPIO说明</h1>
<h2>1.1模式说明</h2>
<p><span class="language-math">\qquad</span> 如下图1所示,8051U的GPIO一共有四种模式,分别是准双向、推挽输出、高阻输入、开漏;<br />
一般使用最多的就是准双向和推挽输出,除非特别情况,否则一般准双向既可!!!具体的结构图可以看规格书</p>
<p><img src="data/attachment/forum/202508/10/011053qi7uu1331hjbhjj7.png" alt="image.png" title="image.png" /></p>
<center>图1 IO口工作模式</center>
<p></p>
<h2>1.2 施密特触发电气说明</h2>
<p><span class="language-math">\qquad</span> 如下图2所示,此处我使用的VDD是3.3V,还有一个5V版本,施密特触发对IO引脚输入时差别不大,所谓施密特触发简单来说就是限制了一个触发范围,只有在范围之外的电压才能影响电平的状态,如图所示,VIL1和VIH1在打开施密特触发时的电平范围为0.99V~1.18V,中间有接近0.19V的电压误差范围,而没有打开施密特触发的只有0.02V的电压误差,这就可能导致当电压产生细微波动时电平状态会出现翻转<br />
<span class="language-math">\qquad</span> 如输入电平正常情况为1.5V,这种情况8051U认为是高电平1,但是电压不会一直这么稳定,会出现上下波动的情况,而打开施密特触发之后允许的误差范围更大,在没有突破VIL1的最大值时会稳定读取到高电平,使得引脚的读取也会更加稳定。</p>
<p><img src="data/attachment/forum/202508/10/011056bndf27lijynklfmr.png" alt="image-1.png" title="image-1.png" /></p>
<center>图2 IO口施密特触发电气说明</center>
<p></p>
<h1>2.IO口的读取和输出实验</h1>
<p><span class="language-math">\qquad</span> 由于擎天柱出厂的时候只搭配了2个按键和7个LED灯光,所以就使用这2个按键进行IO读取,7个LED进行功能演示;<br />
实验效果说明:</p>
<ol>
<li>
<p>P32按键负责切换LED显示模式,P33负责翻转LED效果;</p>
</li>
<li>
<p>所有IO引脚均配置成为准双向IO;<br />
实验视频效果如下</p>
<video controls="controls" src="forum.php?mod=attachment&aid=111285"></video>
</li>
</ol>
<p>z8051U学习打卡第五集:IO定时器中断(AiCube版本)</p>
<h1>1.Ai8051U中断</h1>
<h2>1.1.中断系统</h2>
<p><span class="language-math">\qquad</span>各个外设的中断优先级和中断所需寄存器如下图1所示,和C52没有什么区别,在代码编写方面也一样</p>
<p><img src="data/attachment/forum/202508/11/125917oxgo5fbbxb8f1j5z.png" alt="image.png" title="image.png" /></p>
<center> 图1.中断系统 </center>
<h2>1.2.定时器中断</h2>
<p><span class="language-math">\qquad</span>这里以定时器0进行学习,如下图2所示,定时器0正常发生中断所需要配置的寄存器</p>
<ol>
<li>当AUXR7/T0x12=0时,就是进行12倍分频,也就是AiCube配置时的12T模式;同理,当AUXR7/T0x12=1时就是1T模式;</li>
<li>当C/T=0时,定时/计数器处于定时模式,C/T=1时,定时/计数器处于计数模式;</li>
<li>同时TR0、GATE、INT0/P32共同配合控制是否开启定时/计数器;</li>
<li>(RL)TH0、(RL)TL0共同实现了16位自动重装载定时器;</li>
<li>TF0就是中断溢出标志位,当它为1时就会产生中断标志位;</li>
<li>当T0CLK=1时,P35引脚就会产生时钟频率输出;</li>
</ol>
<p><img src="data/attachment/forum/202508/11/130632tqxnogoezxow9g89.png" alt="image.png" title="image.png" /></p>
<center> 图2.定时器0配置 </center>
<h1>2.电子木鱼任务</h1>
<h2>2.1.Aicube配置</h2>
<p><span class="language-math">\qquad</span> 重点是进行Timer外设的配置,其余的根据需求更改,如下图3所示,我们只需要重点关注框选的地方</p>
<ol>
<li>时钟输出,就是上面所说的P35引脚,一般可以不需要开启;</li>
<li>定时器模式选择最方便的模式——16位自动重装载+8位预分频;</li>
<li>定时器周期这里可以根据自己需求配置,软件会自动帮我们计算所需要参数,我们只需要根据需要的中断时间更改周期和单位;</li>
<li>是否使能中断一定要开启,否则无法进行中断;</li>
</ol>
<p><img src="data/attachment/forum/202508/11/132637gyznb11o1b1byreg.png" alt="image.png" title="image.png" /></p>
<h2>2.2.效果显示</h2>
<p><img src="data/attachment/forum/202508/11/133254n85yaybz6h8j6j98.png" alt="image.png" title="image.png" /></p>
<p>8051U学习打卡第六集:定时器任务调度实验</p>
<h1>1. 定时器任务调度讲解</h1>
<p><span class="language-math"></span>这一节课的内容就和RTOS挂一点钩了,对于学习过FreeRTOS的人表示很友好<img alt="touxiao" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/touxiao.gif" title="touxiao" /> <img alt="touxiao" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/touxiao.gif" title="touxiao" /></p>
<p>所谓任务调度,就是在你有多个需要定时任务,但是每个任务时间又不一样所需要用到的功能;</p>
<ul>
<li>task0, 要求<strong>50ms</strong>执行一次</li>
<li>task1, 要求<strong>1s</strong>执行一次</li>
<li>task2, 要求<strong>10ms</strong>执行一次</li>
<li>.......</li>
</ul>
<p><span class="language-math"></span>如上所示,有多个不同的任务并且定时时间还不一样,具体干什么我们先不管,当然,为了不计成本的完成任务情况下你也可以选择使用定时器多的MCU进行<strong>多定时器同时开启中断</strong>的方法来完成,如定时器0专门负责task0,定时器1专门负责task1,定时器2专门负责task2,以此类推......;但是这样就会导致成本高、代码维护困难、MCU功耗更高,所以采取了<em><strong>任务调度</strong></em>的方法来完成这个任务</p>
<p><span class="language-math"></span> 任务调度最大优点就是可以节省单片机资源,达到节省功耗,提升运行效率的作用。还是上面的例子,任务调度可以使用一个定时器来完成多个任务,这比多定时器开启的资源消耗明显小很多。</p>
<h1>2. STC官方Task文件代码</h1>
<pre><code class="language-C">static TASK_COMPONENTS Task_Comps[] =
{
//状态计数周期函数
{0, 500,500,Sample_LED0}, /* task 1 Period: 500ms */
{0, 1000, 1000, Sample_LED2}, /* task 2 Period: 1000ms */
{0, 2000, 2000, Sample_LED4}, /* task 3 Period: 2000ms */
{0, 500, 500, Sample_RTC}, /* task 4 Period: 500ms */
/* Add new task here */
};
</code></pre>
<p>如上面代码所示,一个结构体里面包含了一个任务所需要的全部元素,状态,计时时间,周期和函数名</p>
<pre><code class="language-C">//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
u8 i;
for(i = 0; i < Tasks_Max; i++)
{
if(Task_Comps.TIMCount) /* If the time is not 0 */
{
Task_Comps.TIMCount--; /* Time counter decrement */
if(Task_Comps.TIMCount == 0) /* If time arrives */
{
/*Resume the timer value and try again */
Task_Comps.TIMCount = Task_Comps.TRITime;
Task_Comps.Run = 1; /* The task can be run */
}
}
}
}
</code></pre>
<p>Task_Marks_Handler_Callback(void)函数官方说明的比较简单,根据代码可以知道这个函数的主要作用是让任务开始计时,以达到到固定时间任务可以运行和停止的效果,为了确保计时的准确性,一般将它放在**中断函数里面</p>
<pre><code class="language-C">//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
u8 i;
for(i = 0; i < Tasks_Max; i++)
{
if(Task_Comps.Run) /* If task can be run */
{
Task_Comps.Run = 0; /* Flag clear 0 */
Task_Comps.TaskHook(); /* Run task */
}
}
}
</code></pre>
<p>Task_Pro_Handler_Callback()函数就比较容易理解,它只有两个作用,一个是运行任务,另一个就是将任务的运行标志位置零,防止重复运行;它一般放在主函数里面即可,因为如果放在中断函数里面,当中断函数运行任务时,再次触发中断可能会程序跑飞</p>
<h1>3.效果</h1>
<video controls="controls" src="forum.php?mod=attachment&aid=111507"></video>
8051U打卡第7集,虚拟LED和数码管
虚拟LED和数码管在前面的基础上主要是通过USB-CDC功能配合上ISP软件进行实现的
虚拟LED和数码管的硬件与现实中的硬件一样,只需要使用函数就可以正常点亮
在这一集的教学视频中我主要学习到了USB-CDC功能的强大,同时也体会到了Aicube功能之多,贴心的为没有实验箱的朋友准备了这一块内容用作学习
至于该使用什么代码来实现这些功能,在Aicube(ISP)->调试仿真接口->调试接口协议里面都为我们准备好了,有不同的封装、功能,都可以使用,这极大地帮助我们降低了开发的难度,不需要重新编写USB函数库
同时也在该章节重新复习了一遍ASCII码
学习打卡No.8矩阵键盘
矩阵键盘采用思想是通过行列扫描的方式确定按下的按键的编号,这种方法在按键数量较少的时候(0~5个)不适用,因为此时2个IO口才能确定一个按键,4个IO才能确定4个按键;但是当按键数量超过5个时,如有6个按键时,通过行列扫描的方式,只需要5个IO就可以完成这个任务,随着按键数量的增多,这种优势会更加明显!!!
页:
1
[2]