找回密码
 立即注册
查看: 64|回复: 14

求助代码设置频率iap代码失效问题

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

1

主题

25

回帖

85

积分

注册会员

积分
85
发表于 昨天 09:09 来自手机 | 显示全部楼层 |阅读模式
你好,我遇到一个问题, 就是我打算请人帮我烧录固件, 但是irc的频率是在烧写的时候指定的,我计划使用代码来指定这个irc的频率,以免烧写的时候对方没沟通烧录是配错了频率。
我已经完成了代码编写,同时看到代码生效的,即无论烧录是频率如何指定, 代码都可以以设计的24mhz工作。绝大部分的代码都工作的非常完美,但是iap去读写eprom这个功能会失效, 且仅当烧录频率不是24m时失效,即 同样的iap代码,烧录时指定24m是正常的。


    具体测试:  
1. 在isp的时候专门把IRC设为11mhz,
2.示波器测试发现timer1的时间工作频率是正常的,即是24MHz确认代码是可以把工作频率改为24Mhz的。
3. 发现有一个副作用,就是iap无效。 即发现无法保存iap数据 或者是读取iap数据.  loadConfigFromIap和 saveConfigToIap
4. 同样的固件,重新在isp指定为24mhz, 设置时钟为24Mhz, loadConfigFromIap和 saveConfigToIap 代码读写正常。

  请问为什么会这样? 需要更长的时候等时钟稳定吗?还是其它原因?


  以下是我的代码:


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



回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-06-28 08:54:08

740

主题

1万

回帖

1万

积分

管理员

积分
17115
发表于 昨天 12:58 | 显示全部楼层
STC8G1K08A-36I-DFN, 不同系列是有差异的
要用户程序自己设置工作频率,还是建议设置为 24MHz

截图202506271257552649.jpg

https://www.stcaimcu.com/data/download/Datasheet/STC8G.pdf

截图202506271258309991.jpg


截图202506271259568425.jpg

截图202506271300287765.jpg

截图202506271301057557.jpg

截图202506271301467735.jpg

截图202506271302207591.jpg

截图202506271302438209.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:219
  • 最近打卡:2025-06-27 08:38:34
已绑定手机

72

主题

2016

回帖

4536

积分

荣誉版主

无情的代码机器

积分
4536
发表于 昨天 09:32 | 显示全部楼层
注意修改这个IAP_TPS试下:
截图202506270931568037.jpg
截图202506270938222827.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2025-06-27 09:35:00

25

主题

412

回帖

2569

积分

超级版主

积分
2569
发表于 昨天 09:35 | 显示全部楼层


截图202506270934192207.jpg
硬件选项中设置的时钟选项
要跟您的程序里设置的时钟一致。
电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-06-28 08:54:08

740

主题

1万

回帖

1万

积分

管理员

积分
17115
发表于 昨天 09:41 | 显示全部楼层
设置频率, ISP 时选择 24MHz, 速度不够,再往高处选,
另外问问题要讲具体型号,还是有差异的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:480
  • 最近打卡:2025-06-28 00:00:59
已绑定手机

80

主题

5214

回帖

9305

积分

超级版主

DebugLab

积分
9305
发表于 昨天 09:46 | 显示全部楼层
建议固件设置好后下载到Link1D,或使用发布项目程序功能,避免他人下载时操作错误
DebugLab
回复 支持 反对

使用道具 举报 送花

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

1

主题

25

回帖

85

积分

注册会员

积分
85
发表于 昨天 10:54 | 显示全部楼层
erci*** 发表于 2025-6-27 09:32
注意修改这个IAP_TPS试下:
我是有设置的,正确计算的,如下:

IAP_TPS = 24;                              


要是没有设置isp指定24Mhz时也是没有办法工作的。
回复 支持 反对

使用道具 举报 送花

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

1

主题

25

回帖

85

积分

注册会员

积分
85
发表于 昨天 10:55 | 显示全部楼层
神*** 发表于 2025-6-27 09:41
设置频率, ISP 时选择 24MHz, 速度不够,再往高处选,
另外问问题要讲具体型号,还是有差异的 ...

你好,型号是stc8g1k08A-36I-dfn8
回复 支持 反对

使用道具 举报 送花

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

1

主题

25

回帖

85

积分

注册会员

积分
85
发表于 昨天 10:56 | 显示全部楼层
32G12*** 发表于 2025-6-27 09:35
硬件选项中设置的时钟选项
要跟您的程序里设置的时钟一致。

你好,这个使用代码设置工作时钟的目的,就是希望这里可以随便填都不影响程序正常跑。 按你这样说,这个使用代码设置工作时钟没有任何意义哦
回复 支持 反对

使用道具 举报 送花

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

1

主题

25

回帖

85

积分

注册会员

积分
85
发表于 昨天 10:58 | 显示全部楼层
Debu*** 发表于 2025-6-27 09:46
建议固件设置好后下载到Link1D,或使用发布项目程序功能,避免他人下载时操作错误 ...

这个我是让烧录工厂做,发布工程是一个可行的,我沟通一下,谢谢。但是这个还是把问题绕开了。

点评

初始化要正确设置IAP_TPS  详情 回复 发表于 昨天 11:27
回复 支持 反对

使用道具 举报 送花

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

1

主题

25

回帖

85

积分

注册会员

积分
85
发表于 昨天 11:01 | 显示全部楼层
神*** 发表于 2025-6-27 09:41
设置频率, ISP 时选择 24MHz, 速度不够,再往高处选,
另外问问题要讲具体型号,还是有差异的 ...

这个代码设置不是用来覆盖isp的设置的吗?
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-28 13:16 , Processed in 1.342318 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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