找回密码
 立即注册
查看: 228|回复: 10

8051U深度入门到32位51大型实战教学视频学习体会

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-19 09:25:08
已绑定手机

5

主题

19

回帖

149

积分

注册会员

积分
149
发表于 2025-3-26 07:37:25 | 显示全部楼层 |阅读模式
昨天学习了 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        }}


截图202503260737004129.jpg
截图202503260737106248.jpg
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-26 07:38:00 | 显示全部楼层
感谢分享您的学习体会。从您提供的代码片段来看,您正在学习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)

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-19 09:25:08
已绑定手机

5

主题

19

回帖

149

积分

注册会员

积分
149
发表于 2025-3-26 07:50:57 | 显示全部楼层
[b]第5集学习体会:学习了C语言基础,特别是串口打印程序的设置我还是第一次使用,不是很习惯,通过学习,等公司送了实验板后,我在实验板上进行实践,牢固掌握相关知识,现在只能看视频学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-19 09:25:08
已绑定手机

5

主题

19

回帖

149

积分

注册会员

积分
149
发表于 2025-3-26 07:55:27 | 显示全部楼层
第6集,IO口输入输出主要学习人体会,以前只学习过传统的8051,IO口不需要配置,直接使用,现在学习AI8051使用IO口需要事先配置相关寄存器,其他的差不多
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-19 09:25:08
已绑定手机

5

主题

19

回帖

149

积分

注册会员

积分
149
发表于 2025-3-26 07:58:26 | 显示全部楼层
第7集,定时器中断,AI8051的定时器比传统51单片机定时器多,配置要稍微复杂,视频讲解了一个3秒定时器的配置,通过传统51定时器学习,还是比较容易理解
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-19 09:25:08
已绑定手机

5

主题

19

回帖

149

积分

注册会员

积分
149
发表于 2025-3-29 08:13:40 | 显示全部楼层
第8集视频学习体会,主要介绍了周期性任务,文件的创建,结构体的介绍和结构体数组的周期性任务调度。程序简单,但是对于任务调度不是很理解。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-19 09:25:08
已绑定手机

5

主题

19

回帖

149

积分

注册会员

积分
149
发表于 2025-3-30 06:11:51 | 显示全部楼层
  1. #include <AI8051U.H>
  2. void main(void)
  3. {
  4.         P0M0 = 0; P0M1 = 0;
  5.         P4M0 = 0; P4M1 = 0;
  6.         P40 = 0;
  7.         while(1)
  8.         {
  9.                 P00 = 0;
  10.                 P01 = 0;
  11.         }
  12. }
复制代码
今天终于完成了第一个程序点亮两个LED灯
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-19 09:25:08
已绑定手机

5

主题

19

回帖

149

积分

注册会员

积分
149
发表于 2025-3-30 08:34:34 | 显示全部楼层
今天使用AICube做了一个流水灯实验,效果非常不错
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-19 09:25:08
已绑定手机

5

主题

19

回帖

149

积分

注册会员

积分
149
发表于 2025-3-30 08:35:09 | 显示全部楼层
  1. ////////////////////////////////////////
  2. // 文件名称: main.c
  3. // 文件描述:
  4. // 文件版本: V1.0
  5. // 修改记录:
  6. //   1. (2025-03-30) 创建文件
  7. ////////////////////////////////////////
  8. #include "config.h"                     //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
  9. ////////////////////////////////////////
  10. // 项目主函数
  11. // 入口参数: 无
  12. // 函数返回: 无
  13. ////////////////////////////////////////
  14. void main(void)
  15. {
  16.     SYS_Init();
  17.         P40 = 0;
  18.     while (1)
  19.     {
  20.                 u8 i;
  21.                 u8 ucLed = 0xfe;
  22.         USBLIB_OUT_Done();              //查询方式处理USB接收的数据
  23.                 for(i = 0; i < 8; i++)
  24.                 {
  25.                         P0 = ucLed;
  26.                         ucLed = _crol_(ucLed,1);
  27.                         delay_ms(500);
  28.                 }
  29.                 ucLed = 0x7f;
  30.                 for(i = 0; i < 8; i++)
  31.                 {
  32.                         P0 = ucLed;
  33.                         ucLed = _cror_(ucLed,1);
  34.                         delay_ms(500);
  35.                 }
  36.                
  37.     }
  38. }
  39. ////////////////////////////////////////
  40. // 系统初始化函数
  41. // 入口参数: 无
  42. // 函数返回: 无
  43. ////////////////////////////////////////
  44. void SYS_Init(void)
  45. {
  46.     EnableAccessXFR();                  //使能访问扩展XFR
  47.     AccessCodeFastest();                //设置最快速度访问程序代码
  48.     AccessIXramFastest();               //设置最快速度访问内部XDATA
  49.     IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基
  50.     P0M0 = 0x00; P0M1 = 0x00;           //初始化P0口为准双向口模式
  51.     P1M0 = 0x00; P1M1 = 0x00;           //初始化P1口为准双向口模式
  52.     P2M0 = 0x00; P2M1 = 0x00;           //初始化P2口为准双向口模式
  53.     P3M0 = 0x00; P3M1 = 0x00;           //初始化P3口为准双向口模式
  54.     P4M0 = 0x00; P4M1 = 0x00;           //初始化P4口为准双向口模式
  55.     P5M0 = 0x00; P5M1 = 0x00;           //初始化P5口为准双向口模式
  56.     P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
  57.     P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式
  58.     CLK_Init();                         //时钟模块初始化
  59.     PORT0_Init();                       //P0初始化
  60.     PORT4_Init();                       //P4初始化
  61.     USBLIB_Init();                      //USB库初始化
  62.     EnableGlobalInt();                  //使能全局中断
  63. }
  64. ////////////////////////////////////////
  65. // 毫秒延时函数
  66. // 入口参数: ms (设置延时的毫秒值)
  67. // 函数返回: 无
  68. ////////////////////////////////////////
  69. void delay_ms(uint16_t ms)
  70. {
  71.     uint16_t i;
  72.     do
  73.     {
  74.         i = MAIN_Fosc / 6000;
  75.         while (--i);
  76.     } while (--ms);
  77. }
  78. ////////////////////////////////////////
  79. // 时钟初始化函数
  80. // 入口参数: 无
  81. // 函数返回: 无
  82. ////////////////////////////////////////
  83. void CLK_Init(void)
  84. {
  85.     CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频
  86.     HIRC_40M();                         //选择内部预置的频率
  87.     CLK_MCLK_HIRC();                    //选择内部高精度HIRC作为主时钟
  88.     CLK_MCLK2_BYPASS();                 //旁路MCLK2,直接使用MCLK选择
  89.     CLK_SYSCLK_Divider(1);              //设置系统时钟分频系数
  90.     CLK_HSIOCK_MCLK();                  //选择MCLK主时钟作为高速外设时钟源
  91.     CLK_HSIOCK_Divider(1);              //设置高速外设时钟预分频系数
  92.     CLK_SPICLK_Divider(1);              //设置SPI时钟预分频系数
  93.     CLK_I2SCLK_Divider(1);              //设置I2S时钟预分频系数
  94.     CLK_PWMACLK_Divider(1);             //设置PWMA时钟预分频系数
  95.     CLK_PWMBCLK_Divider(1);             //设置PWMB时钟预分频系数
  96.     CLK_TFPUCLK_Divider(1);             //设置TFPU时钟预分频系数
  97. }
  98. ////////////////////////////////////////
  99. // P0口初始化函数
  100. // 入口参数: 无
  101. // 函数返回: 无
  102. ////////////////////////////////////////
  103. void PORT0_Init(void)
  104. {
  105.     SetP0nQuasiMode(BIT_ALL);           //设置P0为准双向口模式
  106.     DisableP0nPullUp(BIT_ALL);          //关闭P0内部上拉电阻
  107.     DisableP0nPullDown(BIT_ALL);        //关闭P0内部下拉电阻
  108.     DisableP0nSchmitt(BIT_ALL);         //使能P0施密特触发
  109.     SetP0nSlewRateNormal(BIT_ALL);      //设置P0一般翻转速度
  110.     SetP0nDrivingNormal(BIT_ALL);       //设置P0一般驱动能力
  111.     SetP0nDigitalInput(BIT_ALL);        //使能P0数字信号输入功能
  112. }
  113. ////////////////////////////////////////
  114. // P4口初始化函数
  115. // 入口参数: 无
  116. // 函数返回: 无
  117. ////////////////////////////////////////
  118. void PORT4_Init(void)
  119. {
  120.     SetP4nQuasiMode(BIT_ALL);           //设置P4为准双向口模式
  121.     DisableP4nPullUp(BIT_ALL);          //关闭P4内部上拉电阻
  122.     DisableP4nPullDown(BIT_ALL);        //关闭P4内部下拉电阻
  123.     DisableP4nSchmitt(BIT_ALL);         //使能P4施密特触发
  124.     SetP4nSlewRateNormal(BIT_ALL);      //设置P4一般翻转速度
  125.     SetP4nDrivingNormal(BIT_ALL);       //设置P4一般驱动能力
  126.     SetP4nDigitalInput(BIT_ALL);        //使能P4数字信号输入功能
  127. }
  128. ////////////////////////////////////////
  129. // USB库初始化函数
  130. // 入口参数: 无
  131. // 函数返回: 无
  132. ////////////////////////////////////////
  133. void USBLIB_Init(void)
  134. {
  135.     usb_init();                         //初始化USB模块
  136.     USB_SetIntPriority(0);              //设置中断为最低优先级
  137.     set_usb_ispcmd("@STCISP#");         //设置USB不停电下载命令
  138. }
  139. ////////////////////////////////////////
  140. // 等待USB配置完成函数
  141. // 入口参数: 无
  142. // 函数返回: 无
  143. ////////////////////////////////////////
  144. void USBLIB_WaitConfiged(void)
  145. {
  146.     while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
  147. }
  148. ////////////////////////////////////////
  149. // USB设备接收数据处理程序
  150. // 入口参数: 无
  151. // 函数返回: 无
  152. // bUsbOutReady:USB设备接收数据标志位
  153. // OutNumber:USB设备接收到的数据长度
  154. // UsbOutBuffer:保存USB设备接收到的数据
  155. ////////////////////////////////////////
  156. void USBLIB_OUT_Done(void)
  157. {
  158.     if (bUsbOutReady)                   //查询是否有接收到数据
  159.     {
  160.         USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
  161.         usb_OUT_done();                 //当前包的数据处理完成
  162.     }
  163. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-19 09:25:08
已绑定手机

5

主题

19

回帖

149

积分

注册会员

积分
149
发表于 2025-3-30 21:54:28 | 显示全部楼层
第四集下载例程为什么始终出现错误呢,找不到原因
截图202503302154205774.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 20:49 , Processed in 0.309197 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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