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&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>
视频第一集《序言》AI8051U强在哪里?
1.新增QPSI 提速显示刷新速度。
2.IIS录放音。
3.哇哦!PWM+DMA可以实现1千多颗LED灯的显示。
4.增强的运算速度,实现了快速的FFT的图形刷新。
5.实现FLASH编程器。
6.双核兼容。无缝衔接之前的51和STC32G的项目。
蒋文涛 发表于 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-20 15:25
视频第二集《硬件及工具介绍》
1.AI8051U官方试验箱的实物功能块:
视频第三集《点亮LED灯》
创键一个新Keil工程要点记录:
前提:在上集添加头文件到Keil IDE 中成功
1.MCU型号选择:
2.设置项目的CPU MODE,memory模式,Code模式:
3.设置HEX文件格式:
蒋文涛 发表于 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 10:19
视频第四集《USB不停电下载程序》
概念:
1.使用ISP中的下面的选项:
视频第五集《C语言基础》
1.C语言 USB-CDC串口 printf函数的实现:
使用时只要打开宏定义屏蔽:
这里的printf函数的定义应该时封装在stc32_stc8_usb.LIb中,不是标准C的printf函数。
2.64bit 变量使用:
蒋文涛 发表于 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 09:41
视频第六集《I/O口的输入输出》
1.I/O口有4种工作模式:准双向/弱上拉;推挽输出强上拉;高阻输入;开漏模 ...
视频第七集《定时器中断》
1.定时器数量:6个。
2.定时器工作模式:
3.ISP软件工具有定时器延时的代码生成功能。
4.有个需要注意的问题:
5.定时器的计算公式:
蒋文涛 发表于 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:}
在线催更 {:touxiao:}
页:
[1]
2