找回密码
 立即注册
查看: 949|回复: 12

AI8051U学习之旅-看视频笔记

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-29 11:47:19
已绑定手机

13

主题

31

回帖

287

积分

中级会员

积分
287
发表于 2024-12-20 12:03:51 | 显示全部楼层 |阅读模式

前言

我已经用过STC8H和STC32G的MCU,对STC的MCU情有独钟,原因不言而喻:详细的技术资料,方便的软硬件开发工具,丰富的交流社区,总之就是对于工程师来说有良好的生态。

时至年末,找到时间开始学习新推出的MCU:STC AI8051U 。准备跟着如下链接的视频课学习:

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11902

在看视频前,我是一定要先阅读芯片手册的,必须对芯片的资源有个大概的概念,还喜欢和同类的前期产品做对比,在此记录下我比较关心的一些特性和新芯片的新的地方,还有记录下疑问,待进一步看视频的时候看是否能解答疑问:

一.关注的特性和新的内容:

  1. 对于AI8051U的编译器的描述有两种:Keil C51/8位 , Keil C251/32位. 对于STC32G 编译器的描述只有一种:Keil C251/32位。这意味着什么呢?

  2. AI8051U:

  3. 1734665002387.png

  4. 1734665463533.png

  5. 1734665524689.png

  6. 1734665597694.png

  7. 1734665636921.png

  8. 1734666008758.png新增加的。这意味着什么呢?

  9. 新增加的内容这意味着什么呢?双CPU的单片机?

  10. 1734666220443.png新增加的内容这意味着什么呢?

  11. 1734667010760.png

  12. 新内容:

  13. 1734667132013.png

    手册初步浏览一遍,期待接下的看视频学习:quantou

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-29 11:47:19
已绑定手机

13

主题

31

回帖

287

积分

中级会员

积分
287
发表于 2024-12-20 14:55:10 | 显示全部楼层
视频第一集《序言》AI8051U强在哪里?

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-29 11:47:19
已绑定手机

13

主题

31

回帖

287

积分

中级会员

积分
287
发表于 2024-12-20 15:25:11 | 显示全部楼层
蒋*** 发表于 2024-12-20 14:55
视频第一集《序言》AI8051U强在哪里?

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

视频第二集《硬件及工具介绍》
1.AI8051U官方试验箱的实物功能块:
截图202412201530549939.jpg
-左下角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工具软件的相关界面实现:
截图202412201608581502.jpg
-下载中断插件,解决Keil,中断号大于31的问题,STC官网上下载。
截图202412201617389922.jpg
-试验箱资料:STC官网下载
截图202412201623388904.jpg
3.有关代码下载的几个注意概念:
- 截图202412201634599256.jpg

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






回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-29 11:47:19
已绑定手机

13

主题

31

回帖

287

积分

中级会员

积分
287
发表于 2024-12-21 09:22:46 | 显示全部楼层
蒋*** 发表于 2024-12-20 15:25
视频第二集《硬件及工具介绍》
1.AI8051U官方试验箱的实物功能块:

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

截图202412210942569224.jpg

1.MCU型号选择:

截图202412210949365036.jpg
2.设置项目的CPU MODE,memory模式,Code模式:

截图202412211009067737.jpg

3.设置HEX文件格式:

截图202412211011401224.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-29 11:47:19
已绑定手机

13

主题

31

回帖

287

积分

中级会员

积分
287
发表于 2024-12-21 10:19:42 | 显示全部楼层
蒋*** 发表于 2024-12-21 09:22
视频第三集《点亮LED灯》
创键一个新Keil工程要点记录:
前提:在上集添加头文件到Keil IDE 中成功

视频第四集《USB不停电下载程序》
概念:
1.使用ISP中的下面的选项:
截图202412211028294208.jpg
2. 在源代码中,编写特定的代码,第一次下载还是需要手动断电上电,之后就可以持续自动下载。
A:需要下载库文件:

截图202412211034033047.jpg
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";(见上面示例代码的此句的位置)


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-29 11:47:19
已绑定手机

13

主题

31

回帖

287

积分

中级会员

积分
287
发表于 2024-12-21 15:12:54 | 显示全部楼层
蒋*** 发表于 2024-12-21 10:19
视频第四集《USB不停电下载程序》
概念:
1.使用ISP中的下面的选项:

视频第五集《C语言基础》
1.C语言 USB-CDC串口 printf函数的实现:
使用时只要打开宏定义屏蔽:
截图202412211540472318.jpg
这里的printf函数的定义应该时封装在stc32_stc8_usb.LIb中,不是标准C的printf函数。

2.64bit 变量使用:

截图202412211548241306.jpg




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-29 11:47:19
已绑定手机

13

主题

31

回帖

287

积分

中级会员

积分
287
发表于 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.高低电平门限参数:

截图202412221011418110.jpg

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-29 11:47:19
已绑定手机

13

主题

31

回帖

287

积分

中级会员

积分
287
发表于 2024-12-22 10:27:22 | 显示全部楼层
蒋*** 发表于 2024-12-22 09:41
视频第六集《I/O口的输入输出》
1.I/O口有4种工作模式:准双向/弱上拉;推挽输出强上拉;高阻输入;开漏模 ...

视频第七集《定时器中断》
1.定时器数量:6个。
2.定时器工作模式:
截图202412221045046981.jpg
3.ISP软件工具有定时器延时的代码生成功能。
4.有个需要注意的问题:
截图202412221112476706.jpg
5.定时器的计算公式:
截图202412221114037039.jpg

截图202412221110538844.jpg

截图202412221115211572.jpg

截图202412221115583250.jpg

截图202412221116401019.jpg














回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-29 11:47:19
已绑定手机

13

主题

31

回帖

287

积分

中级会员

积分
287
发表于 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[0]);

//========================================================================
// 函数: 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.不同的功能执行代码相互独立,而且不同的功能之间不会相互阻塞。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-27 14:40:11
已绑定手机

16

主题

468

回帖

2165

积分

版主

积分
2165
QQ
发表于 2025-2-27 10:32:10 | 显示全部楼层
在线催更
www.STCAI.com
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 12:54 , Processed in 0.139232 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表