davidyan 发表于 2025-5-22 16:23:18

《8051U深度入门到32位51大型实战教学视频》||建议提前赠送实验箱

AI8051U学习打卡
之前玩过ESP,作为一个新手感觉太复杂了,连装个环境都很费劲。刚好在嘉立创看到一个开源项目用的AI8051U,就顺便来了解一下,先领了一个擎天柱的板子上手。今天收到货了,迫不及待的焊好排针

~~~我承认我焊错方向了,竖排长排针应该焊在下面,方便直接插面包板,短的横排针焊上面,方便杜邦线直接接出来。
点亮后是一个led流水灯的效果。

好了,今天开始跟着官方视频学习打卡。
第一集:序言,大致介绍AI8051U芯片的能力。看着挺虎逼的,虽然是51芯片,I2C,I2S,SPI,QSPI,PWM等各种功能一个都不少,图片显示看着也很流畅,计算上能玩FFT,居然还能播放一点短视频,这个让我有点惊喜。现在还不会写程序,先不分享代码了。

国芯人工智能 发表于 2025-5-22 16:28:00

作为一名国芯人工智能,我将根据您的需求创作一段关于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芯片的决心。

希望这段内容能符合您的需求,如果您需要更详细的讲解或具体的案例分析,欢迎随时咨询!

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

davidyan 发表于 2025-5-22 17:45:35

第二集总结
上半集,介绍实验箱硬件。正面包好一堆输入输出接口,包括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主机可以发送下一包数据
    }
}


程序效果截图

davidyan 发表于 2025-5-22 18:01:23

吐槽一下,AI8051U的说明书居然有1800多页。好在大致扫了一下,有很多重复的内容。真的会吓退人的。希望国芯能整理一下,把内容整的更清晰简洁一些。

davidyan 发表于 2025-5-22 18:45:44

<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 &quot;config.h&quot;                     //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
void main(void)
{
    SYS_Init();

    while (1)
    {
      P2 = 0xfe;// 11111110
      while(~P2){
            delay_ms(100);
            P2 = (P2 &lt;&lt; 1) | 1;// 将低位置1
            printf_usb(&quot;~P2=%x&quot;, ~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>

davidyan 发表于 2025-5-22 20:11:52

第四级:不停的下载
这个功能确实好用,但设置起来容易忽略一些细节。

1. 代码准备:使能usb中断,使能全局中断,设置usb下载指令。使用AiCube生成项目,这一步可以让AiCube自动生成。
2. ISP软件设置:切换到 "收到用户命令后复位到ISP监控程序区"。首先这个选项卡比较隐秘,默认未展示出来,我找了半天{:shui:}。这里我是用usb直接连的芯片,在软件发送重置命令给芯片后,因为芯片P32引脚并没有被按下,芯片不会进入HID模式,所以这里的选项卡要用CDC模式。

davidyan 发表于 2025-5-22 20:13:25

第五集:略过,从C/C++到java,python,groove,scala……我都学过啦

davidyan 发表于 2025-5-22 20:34:48

<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>

davidyan 发表于 2025-5-22 20:50:36

第七集:定时器
AI8051U存在的定时器/时钟源,是给时钟提供tick信号的

时钟是通过时钟源分频或者PLL生成,一个时钟可以作为另一个时钟的时钟源。所以时钟同时也是时钟源

davidyan 发表于 2025-5-22 21:58:02

<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) &amp; 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>
页: [1] 2 3
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》||建议提前赠送实验箱