蒋文涛 发表于 2024-12-20 12:03:51

AI8051U学习之旅-看视频笔记

<p><strong>前言</strong></p>
<p>我已经用过STC8H和STC32G的MCU,对STC的MCU情有独钟,原因不言而喻:详细的技术资料,方便的软硬件开发工具,丰富的交流社区,总之就是对于工程师来说有良好的生态。</p>
<p>时至年末,找到时间开始学习新推出的MCU:STC AI8051U 。准备跟着如下链接的视频课学习:</p>
<p>https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=11902</p>
<p>在看视频前,我是一定要先阅读芯片手册的,必须对芯片的资源有个大概的概念,还喜欢和同类的前期产品做对比,在此记录下我比较关心的一些特性和新芯片的新的地方,还有记录下疑问,待进一步看视频的时候看是否能解答疑问:</p>
<p><strong>一.关注的特性和新的内容:</strong></p>
<ol>
<li>
<p>对于AI8051U的编译器的描述有两种:Keil C51/8位 , Keil C251/32位.对于STC32G 编译器的描述只有一种:Keil C251/32位。<strong>这意味着什么呢?</strong></p>
</li>
<li>
<p>AI8051U:</p>
</li>
<li>
<p><img src="data/attachment/forum/202412/20/112329b9nd5z9aswar6rd0.png" alt="1734665002387.png" title="1734665002387.png" /></p>
</li>
<li>
<p><img src="data/attachment/forum/202412/20/113117z73tx733hnhz677n.png" alt="1734665463533.png" title="1734665463533.png" /></p>
</li>
<li>
<p><img src="data/attachment/forum/202412/20/113209yneqh9s5105oze99.png" alt="1734665524689.png" title="1734665524689.png" /></p>
</li>
<li>
<p><img src="data/attachment/forum/202412/20/113324jmnwb3xrs7nbs6a6.png" alt="1734665597694.png" title="1734665597694.png" /></p>
</li>
<li>
<p><img src="data/attachment/forum/202412/20/113404iu510xeqze90pl5w.png" alt="1734665636921.png" title="1734665636921.png" /></p>
</li>
<li>
<p><img src="data/attachment/forum/202412/20/114019ria33bxmljjlk0k3.png" alt="1734666008758.png" title="1734666008758.png" />新增加的。<strong>这意味着什么呢?</strong></p>
</li>
<li>
<p>新增加的内容<strong>这意味着什么呢?双CPU的单片机?</strong></p>
</li>
<li>
<p><img src="data/attachment/forum/202412/20/114348hs6u6qbbzussqsfq.png" alt="1734666220443.png" title="1734666220443.png" />新增加的内容<strong>这意味着什么呢?</strong></p>
</li>
<li>
<p><img src="data/attachment/forum/202412/20/115655nxflx000xi2s228q.png" alt="1734667010760.png" title="1734667010760.png" /></p>
</li>
<li>
<p>新内容:</p>
</li>
<li>
<p><img src="data/attachment/forum/202412/20/115908l1ek66c9d17mcd7l.png" alt="1734667132013.png" title="1734667132013.png" /></p>
<p>手册初步浏览一遍,期待接下的看视频学习:<img alt="quantou" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/quantou.gif" title="quantou" /></p>
</li>
</ol>

蒋文涛 发表于 2024-12-20 14:55:10

视频第一集《序言》AI8051U强在哪里?

1.新增QPSI 提速显示刷新速度。
2.IIS录放音。
3.哇哦!PWM+DMA可以实现1千多颗LED灯的显示。

4.增强的运算速度,实现了快速的FFT的图形刷新。
5.实现FLASH编程器。
6.双核兼容。无缝衔接之前的51和STC32G的项目。

蒋文涛 发表于 2024-12-20 15:25:11

蒋文涛 发表于 2024-12-20 14:55
视频第一集《序言》AI8051U强在哪里?

1.新增QPSI 提速显示刷新速度。

视频第二集《硬件及工具介绍》
1.AI8051U官方试验箱的实物功能块:

-左下角USB TYPA 代码下载口。
-有STC-USB Link1D工具可以从左下角所指STC-USB Link1D的4PIN插座代码下载。
-左下角两个USB TYPC 口,上面的TYPC是USB转串口,下面的TYPC等同于TPYA。

2.软件工具:
- Keil C251安装。 源代码编辑,编译IDE。
- AIapp-ISP-v6.95C STC官网上下载后解压,直接运行。
- Keil C251. IDE 环境的芯片头文件添加,通过AIapp-ISP工具软件的相关界面实现:

-下载中断插件,解决Keil,中断号大于31的问题,STC官网上下载。

-试验箱资料:STC官网下载

3.有关代码下载的几个注意概念:
-

疑问1:这个芯片为什么会出现8bit模式和32bit模式两种,背后的考量是什么?对于用芯片,如何选择这两种模式?已经看到在程序下载需要做选项,源代码编辑的时候又是如何选项呢?
希望有知道的社友帮解下疑问。{:baoquan:}






蒋文涛 发表于 2024-12-21 09:22:46

蒋文涛 发表于 2024-12-20 15:25
视频第二集《硬件及工具介绍》
1.AI8051U官方试验箱的实物功能块:


视频第三集《点亮LED灯》
创键一个新Keil工程要点记录:
前提:在上集添加头文件到Keil IDE 中成功



1.MCU型号选择:


2.设置项目的CPU MODE,memory模式,Code模式:



3.设置HEX文件格式:


蒋文涛 发表于 2024-12-21 10:19:42

蒋文涛 发表于 2024-12-21 09:22
视频第三集《点亮LED灯》
创键一个新Keil工程要点记录:
前提:在上集添加头文件到Keil IDE 中成功

视频第四集《USB不停电下载程序》
概念:
1.使用ISP中的下面的选项:

2. 在源代码中,编写特定的代码,第一次下载还是需要手动断电上电,之后就可以持续自动下载。
A:需要下载库文件:


B:示例代码:

#include "ai8051u.h"                        //调用头文件
#include "stc32_stc8_usb.h"                //调用头文件


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
    P_SW2 |= 0x80;                //B7位写1,使能访问XFR
      
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
      
      usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
    EA = 1;                                                                                        //IE |= 0X80;
      
      while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
      
      while(1)
      {
               
      if (bUsbOutReady)
      {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
      }
               
                P40 = 0;      //P40端口输出0V
                P00 = 0;      //P00端口输出0V
                P02 = 0;      //P02端口输出0V
                //P01 = 0;      //P01端口输出0V
                //
      }
}


3.下载命令ISP软件工具中,默认的字串是:“@STCISP#”,可以自定义,但必须和源代码中一致,比如,在ISP软件工具中自定义为:“1234”,
源代码就要改为:char *USER_STCISPCMD = "1234";(见上面示例代码的此句的位置)


蒋文涛 发表于 2024-12-21 15:12:54

蒋文涛 发表于 2024-12-21 10:19
视频第四集《USB不停电下载程序》
概念:
1.使用ISP中的下面的选项:

视频第五集《C语言基础》
1.C语言 USB-CDC串口 printf函数的实现:
使用时只要打开宏定义屏蔽:

这里的printf函数的定义应该时封装在stc32_stc8_usb.LIb中,不是标准C的printf函数。

2.64bit 变量使用:






蒋文涛 发表于 2024-12-22 09:41:39

蒋文涛 发表于 2024-12-21 15:12
视频第五集《C语言基础》
1.C语言 USB-CDC串口 printf函数的实现:
使用时只要打开宏定义屏蔽:

视频第六集《I/O口的输入输出》
1.I/O口有4种工作模式:准双向/弱上拉;推挽输出强上拉;高阻输入;开漏模式。
2.MCU VDD的电压不能超过5.5V.
3.I/O口对GND极限电平不能超过VDD+0.3V。
4.I/O口有可由代码选择配置内部上拉电阻,内部下拉电阻。但在MCU上电瞬间,程序运行到I/O初始化有延时,所以根据具体设计,最好保留外部的上拉电阻或下拉电阻。
5.高低电平门限参数:




6.按键检测需要做消抖动。消抖动做法原理就是检测按下后,再延时一会。如何延时?用指令延时不可取,最好是定时器延时+中断。

蒋文涛 发表于 2024-12-22 10:27:22

蒋文涛 发表于 2024-12-22 09:41
视频第六集《I/O口的输入输出》
1.I/O口有4种工作模式:准双向/弱上拉;推挽输出强上拉;高阻输入;开漏模 ...
视频第七集《定时器中断》
1.定时器数量:6个。
2.定时器工作模式:

3.ISP软件工具有定时器延时的代码生成功能。
4.有个需要注意的问题:

5.定时器的计算公式:























蒋文涛 发表于 2024-12-23 10:17:57

蒋文涛 发表于 2024-12-22 10:27
视频第七集《定时器中断》
1.定时器数量:6个。
2.定时器工作模式:

视频第八集《时间计时器周期性调动任务》
1.数组概念:相同类型的变量集合,可以采用数组数组变量来写代码。
   关键词:相同类型的变量,集合,
   使用:可以通过:"数组名称[下标索引号]”下标寻址。
2.结构体概念:
   关键词:不同类型的变量,集合
   使用:可以通过 “结构体变量名称.成员名称“寻址。
3.结构体数组的周期性任务调用示例代码:

typedef struct
{
        u8 Run;               //任务状态:Run/Stop
        u16 TIMCount;         //定时计数器
        u16 TRITime;          //重载计数器
        void (*TaskHook) (void); //任务函数
} TASK_COMPONENTS;   
void Task_Marks_Handler_Callback(void);
void Task_Pro_Handler_Callback(void);

static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
       
{0, 300,   300,   LED0_Blink},      /* task 1 Period: 300ms */
{0, 600,   600,   LED1_Blink},      /* task 1 Period: 600ms */
{0, 900,   900,   LED2_Blink},      /* task 1 Period: 600ms */
{0, 10,    10,    KEY_Task},      /* task 1 Period: 600ms */       
};

u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps);

//========================================================================
// 函数: 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 */
            }
      }
    }
}

//========================================================================
// 函数: 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 */
      }
    }
}


在定时器中断服务函数中调用:”Task_Marks_Handler_Callback()”   //系统计时
在主无限循环中调用:“Task_Pro_Handler_Callback()”                       //执行功能函数
学习本集视频的最大收获是:学到了一种编程分层思想:将功能执行这个层次,用时间计时器周期性调动的做法搭成一个固定框架,在执行功能函数中操控结构体变量就实现了功能,好处:
1.功能增加,减少,只要增加或减少结构体变量的定义就能实现,程序架构没有变。

2.不同的功能执行代码相互独立,而且不同的功能之间不会相互阻塞。
{:4_250:}{:4_213:}

8H8K64U 发表于 2025-2-27 10:32:10

在线催更 {:touxiao:}
页: [1] 2
查看完整版本: AI8051U学习之旅-看视频笔记