找回密码
 立即注册
楼主: airgogo

AI8051U入门吐槽大会

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-06-28 08:54:08

740

主题

1万

回帖

1万

积分

管理员

积分
17147
发表于 2025-2-26 13:28:02 | 显示全部楼层
截图202502261336426840.jpg

截图202502261323073068.jpg
用户程序区首先用上面设置的HIRC时钟作为系统时钟运行用户程序;
===绝大部分应用就是这个默认设置



用户程序如果要选外部晶振或其他时钟源为系统时钟,可以参照下面:
截图202502261327516693.jpg



在程序运行时还可以动态修改到10种常用的各种时钟频率,是特色啊/你也可以不改
===如USB转串口,主时钟就要经常修改

截图202502261331304557.jpg
用户一会设置 10Mbps/7.5Mbps/6Mbps/5Mbps,
你咋产生,就要动态的改 系统时钟/可以是HIRC时钟

你串口3 跟A用 10Mbps通信,主时钟要改到  40MHz 才可以
你串口4 跟B用 7.5Mbps通信,主时钟要改到 30MHz 才可以


截图202502261329331743.jpg


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-03-18 21:30:53
已绑定手机

4

主题

18

回帖

120

积分

注册会员

积分
120
发表于 2025-2-26 14:07:31 | 显示全部楼层
小涵*** 发表于 2025-2-26 13:24
只能说,你不懂。试问,这么大一家行业内知名的芯片公司,产品如果没有自己的优势,公司怎么发展,怎么生存 ...

支持STC搞得越来越来好
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-03-18 21:30:53
已绑定手机

4

主题

18

回帖

120

积分

注册会员

积分
120
发表于 2025-2-26 14:12:13 | 显示全部楼层
datasheet里面对时钟选择描述就很清楚了。增加用户的简单选择使用其实改进空间还挺大的。
我们可以讨论它好,也可以讨论它不好。但是2块钱的成本面前,所有缺点都是优点。
截图202502261410083683.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-03-18 21:30:53
已绑定手机

4

主题

18

回帖

120

积分

注册会员

积分
120
发表于 2025-2-26 14:14:19 | 显示全部楼层
神*** 发表于 2025-2-26 13:12
《8051U深度入门到32位51大型实战视频》,【免费 + 包邮 送】实验箱@Ai8051U,100万套 - 字库生成,图片 ...

还有这个工具,不错哟。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-06-27 09:09:32
已绑定手机

1

主题

25

回帖

85

积分

注册会员

积分
85
发表于 2025-6-18 19:02:02 | 显示全部楼层
6,对第三方IDE的过度依赖,目前开发STC系列,大多都用的Keil,STC系列还没有自己的使用生态。导致从安装到使用过程的步骤繁琐。而且使用过程步骤过于零散。
STC完全可以自己使用一套IDE或者直接集成到VSCode; 统一上层应用接口,让用户按需配置自己的MCU,到编译执行调试
<---可以使用sdcc, 我一直在用,没有什么问题。 https://blog.csdn.net/aerror/art ... 1001.2014.3001.5501
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-06-27 09:09:32
已绑定手机

1

主题

25

回帖

85

积分

注册会员

积分
85
发表于 2025-6-20 14:56:22 | 显示全部楼层
使用sdcc, 就可以使用vscode, 或者ai的编程ide了,cursor, trae  等,我目前使用trae.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-06-27 09:09:32
已绑定手机

1

主题

25

回帖

85

积分

注册会员

积分
85
发表于 3 天前 | 显示全部楼层
神*** 发表于 2025-2-26 13:28
用户程序区首先用上面设置的HIRC时钟作为系统时钟运行用户程序;
===绝大部分应用就是这个默认设置

void main()
{
       
        P3M1=0x03;      // 将P3M1寄存器设置为0x00 (二进制 0000 0011)。这通常用于设置P3端口的模式。根据您提供的模式表 (P3M1位, P3M0位):
        P3M0=0x0C;      //                             0000 1100 P3.2  P3.3 推挽输出 (强上拉), P3.0 , P3.1 高阻输入

        P5M1=0x0F;      // 将P5M1寄存器设置为0x00 (二进制 0000 0000)。这通常用于设置P5端口的模式。根据您提供的模式表 (P5M1位, P5M0位)://(0, 0): 准双向口 (弱上拉)       
        P5M0=0xF0;      //11 0000  -- P5.5 P5.4 推挽输出 (强上拉)
       
        P3=0;              // 上电时将P3端口设置为0xF0 (二进制 1111 0000)。
        //         这通常用于设置端口的初始电平状态。
        // 具体哪些引脚被设置为高电平或低电平取决于微控制器的硬件连接。
        P5=0;

        P_SW2 =0x80;
        CLKDIV = 0x04;
        IRTRIM = T24M_ROMADDR;
        VRTRIM = VRT20M_ROMADDR;
        IRCBAND = 0x00;
        CLKDIV = 0;
        loadConfigFromIap();
        saveConfigToIap();
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-06-27 09:09:32
已绑定手机

1

主题

25

回帖

85

积分

注册会员

积分
85
发表于 3 天前 | 显示全部楼层
神*** 发表于 2025-2-26 13:28
用户程序区首先用上面设置的HIRC时钟作为系统时钟运行用户程序;
===绝大部分应用就是这个默认设置

        我尝试使用代码直接指定工作频率为24Mhz,我做了测试,在isp的时候专门把IRC设为11m,测试发现timer1的时间工作是正常的,确认代码是可以把工作频率改为24Mhz的。但是有一个副作用,就是iap无效。
即P_SW2 =0x80;这里开的到CLKDIV = 0; 发现无法保存iap数据 或者是读取iap数据. 但是直接使用isp指定为24mhz, 注释掉代码设置时钟为24Mhz工作是正常。
        请问为什么会这样? 需要更长的时候等时钟稳定吗?还是其它原因?


        以下是我的代码:


        P3M1=0x03;      // 将P3M1寄存器设置为0x00 (二进制 0000 0011)。这通常用于设置P3端口的模式。根据您提供的模式表 (P3M1位, P3M0位):
        P3M0=0x0C;      //                             0000 1100 P3.2  P3.3 推挽输出 (强上拉), P3.0 , P3.1 高阻输入

        P5M1=0x0F;      // 将P5M1寄存器设置为0x00 (二进制 0000 0000)。这通常用于设置P5端口的模式。根据您提供的模式表 (P5M1位, P5M0位)://(0, 0): 准双向口 (弱上拉)       
        P5M0=0xF0;      //11 0000  -- P5.5 P5.4 推挽输出 (强上拉)
       
        P3=0;              // 上电时将P3端口设置为0xF0 (二进制 1111 0000)。
        //         这通常用于设置端口的初始电平状态。
        // 具体哪些引脚被设置为高电平或低电平取决于微控制器的硬件连接。
        P5=0;

        //设置时钟为24Mhz
        P_SW2 =0x80;
        CLKDIV = 0x04;
        IRTRIM = T24M_ROMADDR;
        VRTRIM = VRT20M_ROMADDR;
        IRCBAND = 0x00;
        CLKDIV = 0;

        //等一下时钟稳定
        delay_ms(500);
       
        //从iap读配置
        loadConfigFromIap();
        Timer1_Init();

        //写iap
        saveConfigToIap();

其它引有到的代码如下:

void IapIdle()
{
    IAP_CONTR = 0;                              //关闭IAP功能
    IAP_CMD = 0;                                //清除命令寄存器
    IAP_TRIG = 0;                               //清除触发寄存器
    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 24;                               //设置等待参数12MHz
    IAP_CMD = 1;                                //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    NOP();
    dat = IAP_DATA;                             //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 24;                               //设置等待参数12MHz
    IAP_CMD = 2;                                //设置IAP写命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                             //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    NOP();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 24;                               //设置等待参数12MHz
    IAP_CMD = 3;                                //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    NOP();                                    //
    IapIdle();                                  //关闭IAP功能
}


// IAP地址定义
#define CONFIG_IAP_ADDR 0x200  // 配置参数的IAP起始地址

// 从IAP读取配置参数
void loadConfigFromIap(void)
{
    u8 tmp;
   
    // 读取settings_mix
    tmp = IapRead(CONFIG_IAP_ADDR);
    settings_mix = (tmp == 0xFF || tmp == 0 || tmp > PARAM_MIX_ENABLE) ? PARAM_MIX_DISABLE : tmp;

   
}

// 保存配置参数到IAP
void saveConfigToIap(void)
{
    // 先擦除IAP区域
    IapErase(CONFIG_IAP_ADDR);
   
    // 写入settings_mix
    IapProgram(CONFIG_IAP_ADDR, settings_mix);
   
   
}

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-28 22:53 , Processed in 0.163479 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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