jdgcxyprm 发表于 2025-3-26 07:37:25

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        }}


国芯人工智能 发表于 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)

[本文内容由国芯人工智能辅助生成,仅供参考]

jdgcxyprm 发表于 2025-3-26 07:50:57

第5集学习体会:学习了C语言基础,特别是串口打印程序的设置我还是第一次使用,不是很习惯,通过学习,等公司送了实验板后,我在实验板上进行实践,牢固掌握相关知识,现在只能看视频学习

jdgcxyprm 发表于 2025-3-26 07:55:27

第6集,IO口输入输出主要学习人体会,以前只学习过传统的8051,IO口不需要配置,直接使用,现在学习AI8051使用IO口需要事先配置相关寄存器,其他的差不多

jdgcxyprm 发表于 2025-3-26 07:58:26

第7集,定时器中断,AI8051的定时器比传统51单片机定时器多,配置要稍微复杂,视频讲解了一个3秒定时器的配置,通过传统51定时器学习,还是比较容易理解

jdgcxyprm 发表于 2025-3-29 08:13:40

第8集视频学习体会,主要介绍了周期性任务,文件的创建,结构体的介绍和结构体数组的周期性任务调度。程序简单,但是对于任务调度不是很理解。

jdgcxyprm 发表于 2025-3-30 06:11:51

#include <AI8051U.H>

void main(void)
{
        P0M0 = 0; P0M1 = 0;
        P4M0 = 0; P4M1 = 0;
        P40 = 0;
        while(1)
        {
                P00 = 0;
                P01 = 0;
        }
}
今天终于完成了第一个程序点亮两个LED灯

jdgcxyprm 发表于 2025-3-30 08:34:34

今天使用AICube做了一个流水灯实验,效果非常不错

jdgcxyprm 发表于 2025-3-30 08:35:09

////////////////////////////////////////
// 文件名称: 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();               //当前包的数据处理完成
    }
}

jdgcxyprm 发表于 2025-3-30 21:54:28

第四集下载例程为什么始终出现错误呢,找不到原因
页: [1] 2
查看完整版本: 8051U深度入门到32位51大型实战教学视频学习体会