Ai8051U学习心得
在这两天的学习中,我从硬件及工具的介绍学习到了定时器周期性调度任务,以下是我学习的整个过程第一集:以下是我初步了解Ai8051U的硬件及工具Ai8051U 单片机技术解析Ai8051U 是一款高性能 32 位单片机,同时向下兼容 16 位 和 8 位 微控制器架构,使其具备极强的灵活性。其在数值运算方面表现出色,提供 32 位加减指令、16 位乘除指令,并配备32 位乘除运算单元(MDU32) 和单精度浮点运算功能,使其适用于数据密集型和计算密集型应用。
寄存器资源丰富10 个 32 位累加器,适用于高性能数据处理;16 个 16 位累加器,满足中等规模运算需求;16 个 8 位累加器,完美兼容传统 8 位单片机指令集,便于移植旧有代码。
高效内存管理内置 34KB SRAM,提供充裕的存储空间。堆栈理论深度可达 64K,实际可用深度取决于 `edata` 大小,确保复杂程序的高效运行。
丰富的外设接口1. 通信接口 4 组 UART 串口,适应多设备通信需求; 内部时钟精准调控,满足串行通信的稳定性要求; QSPI 接口,可实现与外部 FLASH存储器的高速通信,适合大容量数据交换;2. 显示与多媒体支持 i8080/M6800 - TFT 接口,可直接驱动显示屏,适用于 GUI 设计和嵌入式显示应用; 硬件 IIS 音频接口,支持高精度音频录制与播放。3. USB 仿真 & 数据传输 集成 硬件 USB 控制器,无需外接转换芯片,即可实现 **直接 USB 连接电脑仿真、下载**,极大提升开发效率。4. PWM 高级功能 硬件移相能力,支持精确电机控制和电源调制; PWM DMA 可实现 外设到外设(P2P)数据传输,减少 CPU 占用,提高系统响应速度。总结Ai8051U 凭借 32 位运算、丰富存储架构、强大外设支持,不仅适用于传统嵌入式控制,还能应对高级计算、多媒体交互、高速数据传输等复杂应用场景,为开发者提供了强大的硬件基础。
第二集:紧接着我学习了点亮LED灯的方式
通过学习实验箱的硬件和软件介绍,我对这套嵌入式开发平台有了更深入的认识。其丰富的硬件资源和完善的开发工具组合,为单片机学习和项目实践提供了强大的支持。下面我将详细列举并分析部分核心硬件模块的功能及其应用场景:
[*]USB Link 1D接口这是一款高效的烧录调试工具,不仅支持程序的快速下载,还能实现在线调试功能,配合Keil或IAR等开发环境使用,极大提升了开发效率。
[*]USB转双串口模块该模块可用于各类串口通信实验,其性能稳定可靠,能够完全替代市面上常见的CH340芯片方案,为通信实验提供便利。
[*]示波器BNC输入旁的红色调节器这个精密的电位器用于实时调整输入信号的波形参数,在进行信号采集和分析实验时特别实用。
[*]立体线路输出接口具备标准的音频输出端子,可直接连接音响设备,适用于音频处理和播放相关的实验项目。
[*]立体声耳机输出接口除了线路输出外,还配备了3.5mm耳机接口,方便开发者进行音频效果的实时监听。
[*]OLED显示屏这块高对比度的显示屏功耗低、响应快,非常适合显示各类传感器数据或系统状态信息。
[*]TFT彩色液晶屏支持全彩显示,不仅可以呈现丰富的图形界面,还能播放动态画面,为交互式项目提供了视觉展示方案。
[*]掉电检测电压调节电路这个功能模块允许用户设置电压检测阈值,当系统电压低于设定值时触发中断,使系统能在断电前及时保存关键数据,确保数据安全。
[*]矩阵键盘采用4x2的扫描矩阵设计,仅需8个IO口即可实现8个按键的输入检测,在节省IO资源的同时保持了良好的操作性。
[*]ADC键盘通过创新的模拟电路设计,仅需一个ADC引脚就能识别16个不同的按键输入,这大大简化了多按键系统的硬件设计。
[*]QSPI/SPI FLASH存储器提供高速的外部存储解决方案,既能保存大量数据,也支持与显示屏配合使用,实现数据的可视化展示。
[*]LCD对比度调节电路通过电位器可灵活调节显示屏的对比度,确保在各种光照条件下都能获得最佳的视觉效果。
这套实验箱的硬件配置不仅覆盖了嵌入式开发的各项基础功能,还通过创新性的设计解决了实际开发中常见的资源限制问题,为初学者提供了理想的实践平台,同时也能满足进阶开发的各种需求。
第三集:USB不停电下载通过本课程的学习,我在实际操作中取得了明显进步。首先按照学习手册的指导,我成功完成了基本的格式调整工作,这为后续学习奠定了良好基础。让我收获颇丰的是对Keil软件的认识。通过本集内容,我深入了解了这款开发工具的一些特色功能和操作技巧。特别是在进行LED灯实验时,我掌握了许多实用的编程注意事项:
[*]掌握了硬件初始化方法
[*]学习了I/O端口的工作模式设置
[*]理解了无限循环的基本结构
#include "ai8051u.h"
void main(void){ // 设置P0、P4端口为推挽输出模式 P0M1 = 0x00; P0M0 = 0x00; P4M1 = 0x00; P4M0 = 0x00; // 初始化端口状态 P40 = 0; // 主程序循环 while(1) { P00 = 0;// 点亮LED }}
通过这个实验,我深刻理解了:端口模式的配置对实际硬件控制的重要性嵌入式程序的基本结构51单片机的基本I/O操作方式本次学习为后续更复杂的嵌入式开发打下了坚实的基础。
第四集:c语言的基础
通过本集的视频学习,我对USB不停电下载功能有了深入的理解和实践经验。这个演示让我明白了一个重要的操作改进:原先需要通过物理按键手动进入USB writer下载模式的操作,现在可以实现自动化的下载流程,大大提高了开发的便捷性。
在具体的学习过程中,我采取了几个关键步骤:1. 访问STC官方网站(www.STCAI.com)成功下载了所需的USB库文件,这为后续的开发工作奠定了基础;2. 掌握了开发环境中的全局搜索功能,这让我能够高效地在amin文件中定位到目标函数;3. 学习了在库文件中查找所需函数的方法,包括如何分析函数结构并将其有效地应用到main文件中;4. 通过视频讲解,还了解了一些常用命令参数的具体使用场景和技巧。
这些知识点和技能不仅让我对USB下载过程有了更清晰的认识,也提升了我的开发效率。特别是理解如何在不同文件中跳转和复用函数的功能,为我后续的嵌入式开发工作提供了更多技术可能性。这次学习让我更加熟悉了STC的开发环境,也为未来的项目实践积累了宝贵的操作经验。
第五集:I/O输入输出
通过对本集内容的学习,我对C语言的底层原理有了更深入的理解。特别是在printf函数的实现原理方面,掌握了宏定义的关键知识点:
1. 宏定义替换机制通过"#define printf printf_hid"的语法,理解了宏定义的替换规则。这种替换本质上是一种预处理阶段的文本替换,左边的标识符会被右边的文本完全取代。
2. printf函数的格式控制详细学习了fmt参数的结构和功能:普通字符:直接输出的文本内容 转换说明:%开头的特殊标记重点掌握了以下几个关键格式说明符:科学计数法表示(%e/%E)智能选择输出格式(%g/%G)指针地址输出(%p) 特殊转义字符(\b退格、\ddd八进制数字、\a警告、\f换页等)
3. 进制转换知识系统地复习了三种常用进制的表示方法及其转换关系:-二进制:基于0和1的四位表示法(如0000、0001等)八进制:0-7的数字系统(1-7及10-14等)十六进制:0x前缀的16进制数(0x1、0x2等)
这些基础知识的巩固不仅加深了我对C语言底层机制的理解,也为后续的程序调试和优化工作奠定了扎实的基础。特别是对printf函数的深入理解,将大大提高我的调试输出效率和效果。Ai8051U I/O 需先配方向寄存器,输入防干扰,输出控电平,查手册避复用错用,输入接拉阻,输出控高低,测引脚电平排故障。在此过程中也会有一些常见问题,比如:输出无响应:查 I/O 复用配置,改方向寄存器;输入不准:加上下拉电阻,排除干扰I/O 电平异常:测接线是否松,查代码寄存器地址,确认电源电压稳定等。
第六集:定时器中断经过本视频的学习,我对GPIO(通用输入输出端口)的概念和工作原理有了系统的认知。GPIO本质上是一组可编程控制的引脚,通过输出高/低电平来实现对外设的控制,同时也能够读取外部输入信号的电平状态。
在视频中,重点讲解了GPIO的四种工作模式:1. 准双向口模式2. 推挽输出模式3. 高阻输入模式 4. 开漏模式
通过理论讲解和代码演示,我深入理解了两种重要的电流概念:拉电流和灌电流,同时也掌握了按键检测的基本原理和实现方法。视频通过三个循序渐进的实验任务,生动展示了如何通过编程实现不同的按键控制逻辑,让我对GPIO的控制有了更直观的认识:
【任务1】按键直接控制LED功能:长按灯亮,松开灯灭实现原理:直接检测按键电平状态,实时控制LED特点:响应即时但无法实现状态保持
【任务2】反相按键控制功能:默认灯亮,按下按键灯灭实现方式:通过逻辑反相实现逆向控制应用场景:需要逆向逻辑的特殊场合
【任务3】按键状态切换控制功能:按一下亮灯,再按一下灭灯关键:使用了状态变量和while循环消抖优势:实现稳定的状态切换功能
通过这三个对比案例的实践,我不仅掌握了while循环的灵活应用,也理解了按键抖动现象及其消除方法,这帮助我解决了之前遇到的按键不灵敏等实际问题,对嵌入式系统的输入输出控制有了更深入的认识。Ai8051U 定时器的优点:定时准,中断响应快,适配多时序场景支持灵活配置,时钟适配性强,助力高效时序控制。同时定时器与嵌入式有着十分重要的联系,比如:PWM的信号输出终端触发等
第七集:定时器周期性调度任务通过对定时中断相关视频的学习,我对定时器的核心功能和应用有了更系统的认识:一、定时器的核心价值1. 时间管理方面:可作为精准的计时系统,实现软件计时功能2. 程序调度方面:能设定固定时间间隔触发特定程序操作3. 性能优化方面:有效替代耗时阻塞的Delay函数,大幅提升程序运行效率特别需要注意的是,本系统采用的是24位结构的定时器(由8位预分频器和13位自动重装载寄存器构成)。二、关键计算要点(附公式)1. 定时频率的计算方法:系统时钟频率 / [(预分频系数+1) × (65536-TH0/TL0初始值) × 机器周期]2. 定时时间的逆向推算:[(预分频系数+1) × (65536-TH0/TL0初始值) × 机器周期] / 系统时钟频率 3. 初始值计算公式:TH0/TL0 = 65536 - [系统时钟频率×目标定时时间] / [机器周期×(预分频系数+1)]三、技术细节补充在字符处理方面需特别注意0xFD字符的兼容性问题: 8051/80251架构存在0xFD编码的特殊限制建议使用\XFD替代方案规避汉字乱码四、函数相关知识点1. 定义规范: 必须明确返回值类型需声明具体函数名称 包含完整的入口参数列表 需要实现具体功能逻辑2. 声明要点: 建议在头文件中定义调用前必须声明-声明语句以分号结尾3. 调用准则: 直接使用函数名加括号参数间用逗号分隔 确保参数个数和类型匹配语句以分号结束
通过系统性的学习,我对定时器的底层机制有了更深入的理解,掌握了关键的计算方法和注意事项,这将显著提升我在嵌入式开发中处理定时相关任务的能力。计时器周期性调度:定初值,使中断,循任务,稳时序控,稳且准;学周期性调度:配计时器,设周期,处中断,掌任务时序巧控。其涉及领域也是十分广阔,例如:设备定时巡检、流水线节拍控制、传感器周期性采样、数据定时上传等以上就是我近七期的学习心得,对于此芯片的学习我会继续学习下去
实验1
#include "config.h"
void main(void)
{
SYS_Init();
while (1)
{
printf_usb("Hello World !\r\n");
}
}
void SYS_Init(void)
{
EnableAccessXFR();
IAP_SetTimeBase();
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
delay_ms(1);
USBLIB_Init();
delay_ms(1);
EnableGlobalInt();
}
void delay_us(uint16_t us)
{
do
{
NOP(14);
} while (--us);
}
void delay_ms(uint16_t ms)
{
uint16_t i;
do
{
i = MAIN_Fosc / 10000;
while (--i);
} while (--ms);
}
void USBLIB_Init(void)
{
usb_init();
USB_SetIntPriority(0);
set_usb_ispcmd("@STCISP#");
}
void USBLIB_WaitConfiged(void)
{
while (DeviceState != DEVSTATE_CONFIGURED)
WDT_Clear();
}
void USBLIB_OUT_Done(void)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer, OutNumber);
usb_OUT_done();
}
}
实验2
#include "config.h"
void main(void)
{
SYS_Init();
while (1)
{
USBLIB_OUT_Done();
}
}
void SYS_Init(void)
{
EnableAccessXFR();
IAP_SetTimeBase();
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
delay_ms(1);
USBLIB_Init();
delay_ms(1);
EnableGlobalInt();
}
void delay_us(uint16_t us)
{
do
{
NOP(14);
} while (--us);
}
void delay_ms(uint16_t ms)
{
uint16_t i;
do
{
i = MAIN_Fosc / 10000;
while (--i);
} while (--ms);
}
void USBLIB_Init(void)
{
usb_init();
USB_SetIntPriority(0);
set_usb_ispcmd("@STCISP#");
}
void USBLIB_WaitConfiged(void)
{
while (DeviceState != DEVSTATE_CONFIGURED)
WDT_Clear();
}
void USBLIB_OUT_Done(void)
{
if (bUsbOutReady)
{
if (UsbOutBuffer == 6)
printf_usb("Hello World !\r\n");
else if (UsbOutBuffer == 7)
printf_usb("China !\r\n");
usb_OUT_done();
}
}
实验3
#include "config.h"
void main(void)
{
SYS_Init();
while (1)
{
}
}
void SYS_Init(void)
{
EnableAccessXFR();
IAP_SetTimeBase();
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
delay_ms(1);
USBLIB_Init();
delay_ms(1);
EnableGlobalInt();
}
void delay_us(uint16_t us)
{
do
{
NOP(14);
} while (--us);
}
void delay_ms(uint16_t ms)
{
uint16_t i;
do
{
i = MAIN_Fosc / 10000;
while (--i);
} while (--ms);
}
void USBLIB_Init(void)
{
usb_init();
USB_SetIntPriority(3);
set_usb_OUT_callback(USBLIB_OUT_Callback);
set_usb_ispcmd("@STCISP#");
}
void USBLIB_WaitConfiged(void)
{
while (DeviceState != DEVSTATE_CONFIGURED)
WDT_Clear();
}
void USBLIB_OUT_Callback(void)
{
if (UsbOutBuffer == 6)
printf_usb("Hello World !\r\n");
else if (UsbOutBuffer == 7)
printf_usb("China !\r\n");
}
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
https://v.stcai.com/sv/1c5eec2-197fcd9b766/1c5eec2-197fcd9b766.mp4
https://v.stcai.com/sv/1fce8086-197cf2b9dd4/1fce8086-197cf2b9dd4.mp4
页:
[1]