【实验箱已收到】【AI8051U】学习打卡与心得
【第一集】序言详细的介绍了AI8051U芯片的功能;最大优点是兼容89C52RC,12C5A60S2
8051U的功能特点:
1。屏幕显示和视频播放
2.IIS录放音
3.PWM_DMA
4.频谱分析仪
5.手写计算器(8051最突出的功能)
6.QSPI,PWM移相,硬件乘除,单精度浮点
现在国产芯片也是越来越强大了
AI8051U芯片技术解析与应用展望
作为新一代增强型8位微控制器,AI8051U在保持经典架构兼容性的基础上实现了多项技术创新。本技术分析将从架构特性、功能模块及系统级应用三个维度展开论述。
一、核心架构特性
AI8051U采用双核异构架构,在保持与Intel 8051指令集全兼容的基础上,创新性地整合了高速运算协处理器。其时钟频率最高可达48MHz,配合硬件乘除器(单周期32×32位乘法)和单精度浮点运算单元(FPU),使传统架构的运算性能提升达20倍以上。存储系统方面,提供64KB Flash+2KB EEPROM+4KB SRAM的灵活配置,支持在线编程(ISP)和在线调试(OCD)功能。
二、功能模块技术解析
1. 显示控制子系统
集成专用显示控制器,支持最大分辨率800×600的RGB接口输出。通过DMA通道实现显存自动刷新,配合硬件图层混合引擎,可同时处理4层图形叠加。视频解码模块支持H.264 Baseline Profile硬件解码,在12MHz主频下可实现30fps@QVGA视频播放。
2. 音频处理单元
内置I2S数字音频接口,支持最高192kHz/24bit音频流处理。配备专用语音编解码器,支持ADPCM、G.711等编码格式。通过双缓冲DMA架构实现零延迟音频采集与回放,信噪比(SNR)达到92dB。
3. 精密定时系统
16通道增强型PWM控制器支持:
移相控制精度:0.1°
频率分辨率:24位
死区时间可编程范围:0-65535ns
配合事件触发矩阵(ETM),可构建复杂电机控制时序。
4. 频谱分析加速器
硬件FFT协处理器支持1024点复数FFT运算仅需512时钟周期,较软件实现提速300倍以上。提供窗函数硬件加速(Hamming/Hanning/Blackman),动态范围达到96dB。
5. 人机交互创新
手写计算器功能基于专用触控接口实现,包含:
8点电容触控检测
笔迹预测算法(采样率200Hz)
公式识别引擎(支持LaTeX转换)
典型数学运算延迟
[本文内容由国芯人工智能辅助生成,仅供参考] 【第二集】硬件与工具介绍
介绍了Ai8051试验箱的硬件与硬件的功能;如何安装软件与工具;如何下载程序。
推荐用USB-Link 1D烧录程序。
【第三集】 点亮第一颗LED
1.新建工程
需要配置的地方
硬件介绍
I/O口配置
。点亮第一个LED是梦到开始,从入门到入土。
张三和李四互殴笑死我了{:4_187:}
代码与实物演示
【第四集】 USB不停电下载
本集摘要
如何全局搜素
配置寄存器
屏蔽未调用指令
代码粘贴复制,Ctrl+C与Ctrl+V我只能说无解。
代码与实物演示
【第五集】C语言基础
本集摘要
替换名替换被替换名
Printf的用法
转义说明简介
ASCII码标记一下
变量类型
运算符
这集需要了解C语言,不然听起来会很吃力。
【第六集】I/O口输入输出
本集摘要
GPIO的定义
GPIO的四种模式
按钮输入检测
按键消抖
生成延时代码
主要要学习GPIO口的模式选择,和按键消抖。
【第七集】定时中断
以问答的形式引出定时器中断
重点:学会利用ISP软件生成定时函数
定时器需要配置的地方
计算公式
函数的定义声明和调用
这集的内容还是很重要的,慢慢开始变得有点难了,不仅配置的东西越来越多,还要计算。
代码内含《电子功德箱》
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "math.h"
#include "stdio.h"
#define u8 unsigned char
#define u16 unsigned int
u8 state = 0;
u16 flag = 0;
u16 count =0;
u8 bontten_State=0;
/*void Timer0_Init(void) //3秒@24.000MHz
{
TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x3F; //设置定时初始值
TH0 = 0x01; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Timer0_Init(void) //500毫秒@24.000MHz
{
TM0PS = 0x0F; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xDC; //设置定时初始值
TH0 = 0x0B; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}*/
void Timer0_1sInit(void) //1秒@24.000MHz
{
TM0PS = 0x1E; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xFC; //设置定时初始值
TH0 = 0x03; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Timer1_2sInit(void) //2秒@24.000MHz
{
TM0PS = 0x3D; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xFC; //设置定时初始值
TH0 = 0x03; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Delay20ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void main()
{
WTST = 0;
EAXFR = 1;
CKCON = 0;
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;
P40=0;
usb_init(); //USB CDC 接口配置
//Timer0_Init();
EA = 1;
while (1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
printf_usb("1. Read Num:%d\n", OutNumber);
printf_usb("2. Read Num:%d\n", OutNumber);
printf_usb("3. Read Num:%d\n", OutNumber);
printf_usb("4. Read Num:%d\n", OutNumber);
usb_OUT_done();
}
/*任务1:
if(P32 == 0)
{
Delay20ms();
if(P32 == 0)
{
while(P32 == 0);
printf("按键按下次数\XFD:%d次\r\n",count++);
}
}
//任务2:灯按一下点亮三秒后熄灭。
if(P32 == 0)
{
Delay20ms();
if(P32 == 0)
{
P00 = 0;
Timer0_Init();
while(P32 == 0);
}
}
//任务3:救护车灯控制器;按下报警按钮红蓝交替闪烁(LED0和LED1表示红灯和蓝灯),再按一下报警按钮,红蓝灯停止。
if (P32 == 0)
{
Delay20ms();
if (P32 == 0)
{
Run_State = !Run_State;
if (Run_State == 1 )
{
Timer0_Init();
}
else
{
TR0 = 0;
P00 = 1;
P01 = 1;
}
while (P32 == 0);
}*/
/*电子功德箱:
1.按下按钮1,串口显示“双倍功德时间”,再次按下显示“单倍功德时间”;
2.按下按钮2,双倍功德时间显示“功德+2 当前功德XXX”;
3.按下按钮3,单倍功德时间显示“功德+1 当前功德XXX”;
4.功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
5.功德+2时,LED点亮2秒后熄灭表示功德成功点亮;
*/
if (P32 == 0)
{
Delay20ms();
if (P32 == 0)
{
bontten_State = !bontten_State;
if( bontten_State == 1)
{
printf("双倍功德时间");
}
else
{
printf("单倍功德时间");
}
while(P32 == 0);
}
}
if (P33 == 0)
{
Delay20ms();
if (P33 == 0)
{
if(bontten_State ==1)
{
flag= flag+2;
P00 = 0;
Timer1_2sInit();
printf("功德+2 当前功德%d",flag);
}
else
{
flag= flag+1;
P00 = 0;
Timer0_1sInit();
printf("功德+1 当前功德%d",flag);
}
while(P33 == 0);
}
}
}
}
void Timer0_1sIsr(void) interrupt 1
{
P00 = 1;
TR0 = 0;
}
void Timer1_2sIsr(void) interrupt 3
{
P00 = 1;
TR0 = 0;
}
【第八集】 定时器周期性任务调度
这节课的周期性任务调度有点难,以后再补上。{:huaixiao:}
页:
[1]