《8051U深度入门到32位51大型实战教学视频》||建议提前赠送实验箱
AI8051U学习打卡之前玩过ESP,作为一个新手感觉太复杂了,连装个环境都很费劲。刚好在嘉立创看到一个开源项目用的AI8051U,就顺便来了解一下,先领了一个擎天柱的板子上手。今天收到货了,迫不及待的焊好排针
~~~我承认我焊错方向了,竖排长排针应该焊在下面,方便直接插面包板,短的横排针焊上面,方便杜邦线直接接出来。
点亮后是一个led流水灯的效果。
好了,今天开始跟着官方视频学习打卡。
第一集:序言,大致介绍AI8051U芯片的能力。看着挺虎逼的,虽然是51芯片,I2C,I2S,SPI,QSPI,PWM等各种功能一个都不少,图片显示看着也很流畅,计算上能玩FFT,居然还能播放一点短视频,这个让我有点惊喜。现在还不会写程序,先不分享代码了。
作为一名国芯人工智能,我将根据您的需求创作一段关于AI8051U芯片学习的视频内容。虽然没有具体的视频内容,但我可以根据AI8051U芯片的特点和学习感受,整理一段专业、流畅的文字内容,以满足您的要求。
AI8051U芯片:AI芯片领域的经典之作
AI8051U芯片作为一款高性能的AI芯片,凭借其强大的计算能力和丰富的功能,成为AI领域的重要芯片之一。相比传统高性能CPU,AI8051U芯片在设计上更加注重效率和可扩展性,能够满足多种AI应用的需求。AI8051U芯片的I2C、I2S、SPI、QSPI、PWM等多种接口,使得它在串口、串口数据线、串口数据传输等场景下表现优异,非常适合用于工业自动化、物联网等领域。
AI8051U芯片还支持多种通信协议,包括AI8051U的I2C通信能力可以支持10000bit的串口数据传输,而I2S通信支持20000bit的串口数据传输,这些能力在AI芯片设计中尤为重要,能够为AI系统提供更快的通信速度和更好的性能。
AI8051U芯片还支持多种I2S和I2C接口,包括AI8051U的I2S通信支持20000bit的串口数据传输,而I2C通信支持10000bit的串口数据传输,这些特性使得AI8051U芯片能够支持多种AI应用,包括视频处理、图像识别、语音识别、数据分析等。
此外,AI8051U芯片还支持多种SPI、QSPI和PWM接口,这些特性使得它能够支持多种AI芯片之间的通信,甚至可以支持AI与其他芯片之间的通信,从而实现更高效的计算能力。
AI8051U芯片在设计上非常注重可扩展性,支持多种外设插槽,包括AI8051U的I2S和I2C外设,允许用户根据需求添加额外的外设功能,从而优化AI芯片的设计。
学习AI8051U芯片的体验
在学习AI8051U芯片的过程中,我深刻感受到芯片的高效性和灵活性。AI8051U芯片的设计非常注重性能和可扩展性,能够支持多种AI应用的需求,从而在工业自动化、物联网等领域中发挥重要作用。
学习过程中,我逐渐掌握了AI8051U芯片的通信能力,包括I2C、I2S、SPI、QSPI和PWM接口的支持。这些功能让我能够轻松地连接到AI芯片和外部设备,从而实现更高效的AI系统设计。
通过学习AI8051U芯片,我意识到AI芯片在AI系统设计中的重要性,尤其是其在串口通信和外部设备连接中的应用。我意识到,只有掌握AI芯片的通信能力,才能在AI系统中实现高效的数据传输和处理。
总结
AI8051U芯片作为一款高性能的AI芯片,凭借其强大的计算能力和丰富的功能,成为AI领域的重要芯片之一。AI8051U芯片在设计上非常注重效率和可扩展性,能够支持多种AI应用的需求,从而在工业自动化、物联网等领域中发挥重要作用。
学习AI8051U芯片的过程让我深刻感受到芯片的高效性和灵活性,同时也让我意识到AI芯片在AI系统设计中的重要性。我逐渐掌握了AI8051U芯片的通信能力,并意识到AI芯片在串口通信和外部设备连接中的应用。通过学习AI8051U芯片,我深刻体会到AI芯片在AI系统设计中的重要性,同时也让我更加坚定了学习AI芯片的决心。
希望这段内容能符合您的需求,如果您需要更详细的讲解或具体的案例分析,欢迎随时咨询!
[本文内容由国芯人工智能辅助生成,仅供参考] 第二集总结
上半集,介绍实验箱硬件。正面包好一堆输入输出接口,包括usb接口,按键,屏幕,红外,音频等等。特别是有一个示波器表针的接口,不知道将来能不能替代示波器使用。因为目前还没有实验箱的板子,所以没法亲自感受。
下半集,介绍开发环境的搭建。按照教程来,基本上很顺利。国芯经过多年的积淀,提供的工具也是很方便的。而且现在仍然在快速迭代,视频中的isp软件是6.94y,我现在下载到的是5.19刚刚更新的5.95P版本,持续迭代的频率非常快。
搭建好keil环境,写了第一个helloworld程序
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
// 1. (2025-05-22) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h" //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
SYS_Init();
while (1)
{
USBLIB_OUT_Done(); //查询方式处理USB接收的数据
}
}
////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR(); //使能访问扩展XFR
AccessCodeFastest(); //设置最快速度访问程序代码
AccessIXramFastest(); //设置最快速度访问内部XDATA
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基
USBLIB_Init(); //USB库初始化
EnableGlobalInt(); //使能全局中断
}
////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
usb_init(); //初始化USB模块
USB_SetIntPriority(0); //设置中断为最低优先级
set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令
//<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_USBLIB_INITIAL_END>>
}
////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
if (bUsbOutReady) //查询是否有接收到USB主机发送数据
{
//<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
// 在此添加中断函数用户代码
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
//在此处添加用户处理接收数据的代码
printf_usb("我是 ai8051U\n");
//<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
usb_OUT_done(); //当前包的数据处理完成,通知USB主机可以发送下一包数据
}
}
程序效果截图
吐槽一下,AI8051U的说明书居然有1800多页。好在大致扫了一下,有很多重复的内容。真的会吓退人的。希望国芯能整理一下,把内容整的更清晰简洁一些。 <p>第三集,点亮led灯</p>
<p>核心知识点:</p>
<ol>
<li>
<p>寄存器的值在程序中直接以全局变量的形式存在,读写变量值就是读写寄存器的状态,寄存器就会从硬件上控制电路板(引脚)状态</p>
</li>
<li>
<p>PxM0, PxM1赋值就是设置x系引脚列状态</p>
</li>
<li>
<p>Px设置x系列8个引脚状态,Pxy设置x.y引脚状态</p>
<pre><code>#include "config.h" //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
void main(void)
{
SYS_Init();
while (1)
{
P2 = 0xfe;// 11111110
while(~P2){
delay_ms(100);
P2 = (P2 << 1) | 1;// 将低位置1
printf_usb("~P2=%x", ~P2);
usb_OUT_done();
}
}
}
void SYS_Init(void)
{
EnableAccessXFR(); //使能访问扩展XFR
AccessCodeFastest(); //设置最快速度访问程序代码
AccessIXramFastest(); //设置最快速度访问内部XDATA
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基
P2M0 = 0x01; P2M1 = 0x00; //初始化P2口为推挽模式
}
////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
uint16_t i;
do
{
i = MAIN_Fosc / 6000;
while (--i);
} while (--ms);
}
</code></pre>
</li>
</ol>
第四级:不停的下载
这个功能确实好用,但设置起来容易忽略一些细节。
1. 代码准备:使能usb中断,使能全局中断,设置usb下载指令。使用AiCube生成项目,这一步可以让AiCube自动生成。
2. ISP软件设置:切换到 "收到用户命令后复位到ISP监控程序区"。首先这个选项卡比较隐秘,默认未展示出来,我找了半天{:shui:}。这里我是用usb直接连的芯片,在软件发送重置命令给芯片后,因为芯片P32引脚并没有被按下,芯片不会进入HID模式,所以这里的选项卡要用CDC模式。
第五集:略过,从C/C++到java,python,groove,scala……我都学过啦 <p>第六集:IO<br />
这里的IO是指硬件的IO,不是程序的IO<br />
硬件IO,最基本的就是引脚电平的读写。<br />
核心知识点:</p>
<p>引脚的功能类型,分为4种模式</p>
<table>
<thead>
<tr>
<th>模式</th>
<th>方向</th>
<th>电流驱动能力</th>
</tr>
</thead>
<tbody>
<tr>
<td>推挽</td>
<td>只能输出</td>
<td>电流大</td>
</tr>
<tr>
<td>高阻</td>
<td>只能输入</td>
<td>电流微小</td>
</tr>
<tr>
<td>开漏</td>
<td>只能输出低电平,输出高电平相当于悬空,取决于外部有没有拉高</td>
<td>低电平可过电流大,高电平无过电流能力</td>
</tr>
<tr>
<td>准双向</td>
<td>输入输出都可</td>
<td>低电平电流大,高电平电流能力中等</td>
</tr>
</tbody>
</table>
<p>施密特触发,一般都打开:是一种具有<strong>滞后特性(回差特性)<strong>的数字电路或信号处理技术,主要用于将模拟信号或噪声较大的信号转换为清晰、稳定的数字信号。其核心特点是通过设定两个不同的阈值(<strong>上限阈值电压</strong>和</strong>下限阈值电压</strong>)来避免信号在临界电平附近波动时产生的误触发,从而增强电路的抗干扰能力。</p>
<p>通过Px可以一次性读写8位数据,对应8个引脚状态。通过Pxy可以读写1位数据,对于1个引脚状态。</p>
<p>视频中去抖动的代码,感觉很别扭,需要两次判断引脚状态,代码感觉不好复用。</p>
<p>AICube目前体验很好用,视频中提到的很多设置都不需要关心了,直接自动生成。感觉冲哥得重新录视频了。</p>
第七集:定时器
AI8051U存在的定时器/时钟源,是给时钟提供tick信号的
时钟是通过时钟源分频或者PLL生成,一个时钟可以作为另一个时钟的时钟源。所以时钟同时也是时钟源 <p>第七集:定时器<br />
时钟能产生周期性电平变动的信号源,用于不同设备之间的信号同步、计数、计时等。时钟可以通过硬件晶振产生,也可以通过另一个时钟源分频或者PLL技术产生。</p>
<p>AI8051U中存在不同的时钟,有些仅仅作为另一个时钟的上游,有些则是专门给某些设备使用,有些则两者兼备。</p>
<ul>
<li>内部高速IRC,22~44MHz</li>
<li>内部低速IRC,32K</li>
<li>内部48M高速IRC,主要给USB高速传输使用。为了传输稳定性,在UCAP引脚要求连一个去耦电容。</li>
<li>主时钟MCLK,可以从内部高低速IRC,内部PLL,外部晶振生成,常作为系统运行的主要时钟信号源。</li>
<li>系统时钟SYSCLK,通过主时钟分频得到</li>
<li>内部PLL,从内部高速IRC/外部高速晶振通过PLL技术产生</li>
<li>外部高速晶振,芯片外部输入时钟信号</li>
<li>外部32768,为RTC时钟提供时钟源</li>
<li>外设时钟,指SPI,I2C,I2S,PWM,TFPU等外设的时钟信号,可以从主时钟或PLL时钟产生,每个外设时钟的分频数可以不同。</li>
<li>RTC时钟,独立于系统运行的一个时钟,可以在系统休眠时继续工作,维持一些状态</li>
</ul>
<p>定时器<br />
时钟源/分频数(1或12) = 定时器时钟频率<br />
时钟频率/(时钟分频+1)/时钟数 = 定时触发频率<br />
1/定时触发频率 = 定时触发周期,每个周期会触发一次定时中断信号。<br />
所谓多少位定时器,指可以设置的一个周期内的最大时钟数。8位定时器,一个周期最长 = 输入时钟周期*0x100。<br />
相关设置寄存器:</p>
<p><img src="data/attachment/forum/202505/22/224357brtnicsvsw1sdivp.png" alt="a96de0a4-9d56-439a-8753-a7ec702e53a1.png" title="a96de0a4-9d56-439a-8753-a7ec702e53a1.png" /></p>
<ul>
<li>1T/12T模式,对时钟源不分频/12分频</li>
<li>定时器开关,(!GATE | INT0) & TR0。GATE是使能(允许)外部INT0引脚触发计数,可实现脉宽测量。</li>
<li>T1_C/T:控制计数器输入源,对定时器时钟计数 or 对T引脚信号计数</li>
<li>T1_M1/T1_M0: 计数重载模式,会影响计数器重载的周期,也就是影响一个周期(两次重载间隔)内的tick数。对16位计数器,如果设定重载值为0xe000,则每次溢出时计数器重载位0xe000,然后开始+1+1的计数,直到再次溢出,一共计数0x1000次,也就是两次溢出时间间隔是0x1000个时钟周期。这里0x1000就是上面说的时钟数。
<ul>
<li>自动重载,可控制溢出频率</li>
<li>不自动重载,不可控制溢出频率,相当于重载值为0</li>
<li>溢出频率 = 输入频率/(多少位 - 重载值)</li>
<li>不可中断意味着全局中断关闭也不能停止计时器的中断。且该中断具有高优先级</li>
</ul>
</li>
<li>TM0PS: 8位预分频,作用与1T/12T差不多。感觉没啥用。</li>
<li>TF0: 溢出时设置位1,需要程序重置。</li>
<li>T0CLKO: 输出信号开关,将溢出作为一种信号输出,每次溢出电平反转。</li>
</ul>
<p>中断号<br />
函数通过指定中断号来响应对应的中断。在文档中列有中断号,0~73,每个中断号对应一种中断类型。官方头文件里也已经将中断号定义成宏,方便从名称识别。</p>
<pre><code>#define INT0_VECTOR 0 //0003H
#define TMR0_VECTOR 1 //000BH
#define INT1_VECTOR 2 //0013H
#define TMR1_VECTOR 3 //001BH
#define UART1_VECTOR 4 //0023H
#define ADC_VECTOR 5 //002BH
#define LVD_VECTOR 6 //0033H
#define PCA_VECTOR 7 //003BH
#define UART2_VECTOR 8 //0043H
#define SPI_VECTOR 9 //004BH
#define INT2_VECTOR 10 //0053H
#define INT3_VECTOR 11 //005BH
#define TMR2_VECTOR 12 //0063H
#define USER_VECTOR 13 //006BH
#define INT4_VECTOR 16 //0083H
#define UART3_VECTOR 17 //008BH
#define UART4_VECTOR 18 //0093H
#define TMR3_VECTOR 19 //009BH
#define TMR4_VECTOR 20 //00A3H
#define CMP_VECTOR 21 //00ABH
#define I2C_VECTOR 24 //00C3H
#define USB_VECTOR 25 //00CBH
#define PWMA_VECTOR 26 //00D3H
#define PWMB_VECTOR 27 //00DBH
#define RTC_VECTOR 36 //0123H
#define P0INT_VECTOR 37 //012BH
#define P1INT_VECTOR 38 //0133H
#define P2INT_VECTOR 39 //013BH
#define P3INT_VECTOR 40 //0143H
#define P4INT_VECTOR 41 //014BH
#define P5INT_VECTOR 42 //0153H
#define P6INT_VECTOR 43 //015BH
#define P7INT_VECTOR 44 //0163H
#define DMA_M2M_VECTOR 47 //017BH
#define DMA_ADC_VECTOR 48 //0183H
#define DMA_SPI_VECTOR 49 //018BH
#define DMA_UR1T_VECTOR 50 //0193H
#define DMA_UR1R_VECTOR 51 //019BH
#define DMA_UR2T_VECTOR 52 //01A3H
#define DMA_UR2R_VECTOR 53 //01ABH
#define DMA_UR3T_VECTOR 54 //01B3H
#define DMA_UR3R_VECTOR 55 //01BBH
#define DMA_UR4T_VECTOR 56 //01C3H
#define DMA_UR4R_VECTOR 57 //01CBH
#define DMA_LCM_VECTOR 58 //01D3H
#define LCM_VECTOR 59 //01DBH
#define DMA_I2CT_VECTOR 60 //01E3H
#define DMA_I2CR_VECTOR 61 //01EBH
#define I2S_VECTOR 62 //01F3H
#define DMA_I2ST_VECTOR 63 //01FBH
#define DMA_I2SR_VECTOR 64 //0203H
#define DMA_QSPI_VECTOR 65 //020BH
#define QSPI_VECTOR 66 //0213H
#define TMR11_VECTOR 67 //021BH
#define DMA_PWMAT_VECTOR 72 //0243H
#define DMA_PWMAR_VECTOR 73 //024BH
</code></pre>
<p>诡异的0xfd问题,在带有0xfd的汉字后面,需要加上\xfd才能正常显示。</p>