8051U深度入门到32位51大型实战教学视频学习体会
昨天学习了 8051U深度入门到32位51大型实战教学视频第123集,今天学习了第4讲,#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(); } P20 = 0; //P00端口输出0V P22 = 0; //P02端口输出0V }}
感谢分享您的学习体会。从您提供的代码片段来看,您正在学习8051U微控制器的USB功能配置,特别是USB CDC(Communication Device Class)接口的初始化与中断处理。以下是对代码的简要分析与学习建议:
代码分析:
1. 头文件引入:
#include "ai8051u.h":引入了8051U微控制器的寄存器定义和宏。
#include "stc32stc8usb.h":引入了STC32和STC8系列芯片的USB相关配置函数和定义。
2. 全局变量定义:
USERDEVICEDESC、USERPRODUCTDESC、USERSTCISPCMD:这些变量可能用于描述USB设备的设备描述符、产品描述符以及STC ISP命令。当前赋值为NULL,可能需要根据实际需求进行初始化。
3. 主函数 (main):
端口模式配置:
PSW2 |= 0x80;:将PSW2寄存器的B7位置1,使能访问XFR(扩展功能寄存器)。
PxM1和PxM0寄存器配置:将P0至P7端口配置为推挽输出模式。
USB初始化:
usbinit();:初始化USB CDC接口,这是代码的核心部分。
IE2 |= 0x80;:使能USB中断。
EA = 1;:使能全局中断。
等待USB配置完成:
while (DeviceState != DEVSTATECONFIGURED);:等待USB设备完成配置。
主循环:
if (bUsbOutReady):检查USB输出缓冲区是否有数据准备就绪,后续可能需要对接收到的数据进行处理。
学习建议:
1. 理解USB CDC协议:
USB CDC是一种常见的USB设备类,用于模拟串口通信。建议深入学习CDC协议的工作机制,包括设备描述符、接口描述符、端点配置等。
2. 调试与测试:
在代码中加入调试信息(如通过串口打印日志),以便验证USB初始化和数据传输是否正常。
使用USB分析工具(如Wireshark)捕获USB通信数据,帮助理解数据传输过程。
3. 扩展功能:
在USB初始化完成后,可以尝试实现数据的发送与接收功能,例如通过USB发送字符串或接收PC端发送的指令。
探索其他USB设备类(如HID、MSC),扩展8051U的应用场景。
4. 优化代码:
将端口配置部分封装成函数,提高代码的可读性和复用性。
使用宏定义或枚举类型替换魔数(如0x80),增强代码的可维护性。
总结:
您目前的学习进度良好,已经掌握了8051U的USB初始化与中断配置。接下来可以深入理解USB协议的具体实现,并通过实际项目巩固所学知识。建议结合硬件开发板进行实践,逐步完善代码功能,提升开发能力。期待您后续的学习成果分享!
(字数:800)
[本文内容由国芯人工智能辅助生成,仅供参考] 第5集学习体会:学习了C语言基础,特别是串口打印程序的设置我还是第一次使用,不是很习惯,通过学习,等公司送了实验板后,我在实验板上进行实践,牢固掌握相关知识,现在只能看视频学习
第6集,IO口输入输出主要学习人体会,以前只学习过传统的8051,IO口不需要配置,直接使用,现在学习AI8051使用IO口需要事先配置相关寄存器,其他的差不多 第7集,定时器中断,AI8051的定时器比传统51单片机定时器多,配置要稍微复杂,视频讲解了一个3秒定时器的配置,通过传统51定时器学习,还是比较容易理解 第8集视频学习体会,主要介绍了周期性任务,文件的创建,结构体的介绍和结构体数组的周期性任务调度。程序简单,但是对于任务调度不是很理解。 #include <AI8051U.H>
void main(void)
{
P0M0 = 0; P0M1 = 0;
P4M0 = 0; P4M1 = 0;
P40 = 0;
while(1)
{
P00 = 0;
P01 = 0;
}
}
今天终于完成了第一个程序点亮两个LED灯
今天使用AICube做了一个流水灯实验,效果非常不错 ////////////////////////////////////////
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
// 1. (2025-03-30) 创建文件
////////////////////////////////////////
#include "config.h" //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
SYS_Init();
P40 = 0;
while (1)
{
u8 i;
u8 ucLed = 0xfe;
USBLIB_OUT_Done(); //查询方式处理USB接收的数据
for(i = 0; i < 8; i++)
{
P0 = ucLed;
ucLed = _crol_(ucLed,1);
delay_ms(500);
}
ucLed = 0x7f;
for(i = 0; i < 8; i++)
{
P0 = ucLed;
ucLed = _cror_(ucLed,1);
delay_ms(500);
}
}
}
////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR(); //使能访问扩展XFR
AccessCodeFastest(); //设置最快速度访问程序代码
AccessIXramFastest(); //设置最快速度访问内部XDATA
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基
P0M0 = 0x00; P0M1 = 0x00; //初始化P0口为准双向口模式
P1M0 = 0x00; P1M1 = 0x00; //初始化P1口为准双向口模式
P2M0 = 0x00; P2M1 = 0x00; //初始化P2口为准双向口模式
P3M0 = 0x00; P3M1 = 0x00; //初始化P3口为准双向口模式
P4M0 = 0x00; P4M1 = 0x00; //初始化P4口为准双向口模式
P5M0 = 0x00; P5M1 = 0x00; //初始化P5口为准双向口模式
P6M0 = 0x00; P6M1 = 0x00; //初始化P6口为准双向口模式
P7M0 = 0x00; P7M1 = 0x00; //初始化P7口为准双向口模式
CLK_Init(); //时钟模块初始化
PORT0_Init(); //P0初始化
PORT4_Init(); //P4初始化
USBLIB_Init(); //USB库初始化
EnableGlobalInt(); //使能全局中断
}
////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
uint16_t i;
do
{
i = MAIN_Fosc / 6000;
while (--i);
} while (--ms);
}
////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
CLK_SYSCLK_Divider(10); //切换主时钟前先将系统时钟降频
HIRC_40M(); //选择内部预置的频率
CLK_MCLK_HIRC(); //选择内部高精度HIRC作为主时钟
CLK_MCLK2_BYPASS(); //旁路MCLK2,直接使用MCLK选择
CLK_SYSCLK_Divider(1); //设置系统时钟分频系数
CLK_HSIOCK_MCLK(); //选择MCLK主时钟作为高速外设时钟源
CLK_HSIOCK_Divider(1); //设置高速外设时钟预分频系数
CLK_SPICLK_Divider(1); //设置SPI时钟预分频系数
CLK_I2SCLK_Divider(1); //设置I2S时钟预分频系数
CLK_PWMACLK_Divider(1); //设置PWMA时钟预分频系数
CLK_PWMBCLK_Divider(1); //设置PWMB时钟预分频系数
CLK_TFPUCLK_Divider(1); //设置TFPU时钟预分频系数
}
////////////////////////////////////////
// P0口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT0_Init(void)
{
SetP0nQuasiMode(BIT_ALL); //设置P0为准双向口模式
DisableP0nPullUp(BIT_ALL); //关闭P0内部上拉电阻
DisableP0nPullDown(BIT_ALL); //关闭P0内部下拉电阻
DisableP0nSchmitt(BIT_ALL); //使能P0施密特触发
SetP0nSlewRateNormal(BIT_ALL); //设置P0一般翻转速度
SetP0nDrivingNormal(BIT_ALL); //设置P0一般驱动能力
SetP0nDigitalInput(BIT_ALL); //使能P0数字信号输入功能
}
////////////////////////////////////////
// P4口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT4_Init(void)
{
SetP4nQuasiMode(BIT_ALL); //设置P4为准双向口模式
DisableP4nPullUp(BIT_ALL); //关闭P4内部上拉电阻
DisableP4nPullDown(BIT_ALL); //关闭P4内部下拉电阻
DisableP4nSchmitt(BIT_ALL); //使能P4施密特触发
SetP4nSlewRateNormal(BIT_ALL); //设置P4一般翻转速度
SetP4nDrivingNormal(BIT_ALL); //设置P4一般驱动能力
SetP4nDigitalInput(BIT_ALL); //使能P4数字信号输入功能
}
////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
usb_init(); //初始化USB模块
USB_SetIntPriority(0); //设置中断为最低优先级
set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令
}
////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
}
////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
if (bUsbOutReady) //查询是否有接收到数据
{
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
usb_OUT_done(); //当前包的数据处理完成
}
}
第四集下载例程为什么始终出现错误呢,找不到原因
页:
[1]
2