找回密码
 立即注册
楼主: 29aH

关于32G12K128芯片无法调整晶振问题 | 已解决

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-10-15 11:03:15

787

主题

1万

回帖

1万

积分

管理员

积分
19770
发表于 2025-8-8 13:32:20 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-09-23 15:30:49

8

主题

16

回帖

256

积分

中级会员

积分
256
发表于 2025-8-8 13:41:04 | 显示全部楼层
刚发现一个现象,将ISP软件调整好的IRTRIM与VRTRIM寄存器值打印上来(此时运行正常),再第二次使用代码将该值写入IRTRIM与VRTRIM寄存器的方式进行频率调整,就会出现频率异常现象,且该方法只有在33.1776M这个参数下会出现问题,测试27M、35M等频率均正常。所以有个疑问,明明写入的值与ISP调整的值是相同的,为何不能正常调整频率?
知识改变命运,技能成就梦想!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-10-15 11:03:15

787

主题

1万

回帖

1万

积分

管理员

积分
19770
发表于 2025-8-8 13:45:05 | 显示全部楼层

这要全部看完:
可能在不同的频段,不同个体要设置好
截图202508081343528859.jpg

https://www.stcaimcu.com/data/download/Datasheet/STC32G.pdf
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:532
  • 最近打卡:2025-10-15 08:56:42
已绑定手机

47

主题

2274

回帖

7995

积分

论坛元老

积分
7995
发表于 2025-8-8 14:39:10 | 显示全部楼层
29*** 发表于 2025-8-8 13:41
刚发现一个现象,将ISP软件调整好的IRTRIM与VRTRIM寄存器值打印上来(此时运行正常),再第二次使用代码将 ...

由于芯片存在制造误差,所以不同芯片频段的中间频率有所不同,
从而VRTRIM也就不同,调节频率设置的IRTRIM也不一样。


就算同一颗芯片不同环境温度时烧录时调节设置的IRTRIM也会出现一些偏差。
最终调节出来的时钟频率是否准确可以通过MCLKO将主时钟分频输出到指定脚位进行测量,

而不是读取IRTRIM与VRTRIM进行比较。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2025-09-23 15:30:49

8

主题

16

回帖

256

积分

中级会员

积分
256
发表于 2025-9-5 15:54:59 | 显示全部楼层
终于找到问题了,原因是不同芯片的出厂校准频率参数所在的频段并不是固定的,例如33.1776MHz这个频率有可能用的是27MHz频段,也肯能是44MHz频段,
这就导致把出厂参数赋值给IRTRIM后,因没有选择正确的频段,而出现频率异常。
以下是我的解决方法,目前未出现异常问题,供大家参考
/*==========================================================
[函数功能]用户IRC震荡频率初始化=>系统时钟
       
[返回值]  
                        无
[参  数]   
                        Irc:要设定的频率

示例:#define FOSC   33177600UL  //系统时钟
                        ModifyIRC(FOSC);
               
2025/8/11
============================================================*/
//                                                                                                                频率                                                        理论值  =128-((中心频率-目标频率)/目标频率/0.0024)
#define T22M_ADDR        CHIPID11        //22.1184MHz                                53
#define        T24M_ADDR        CHIPID12        //24MHz             82
#define T27M_ADDR        CHIPID13        //27MHz             128
#define T30M_ADDR        CHIPID14        //30MHz             174
#define T33M_ADDR        CHIPID15        //33.1776MHz        223
#define T35M_ADDR        CHIPID16        //35MHz             43

#define VRT6M_ADDR        CHIPID21//VRTRIM_6M
#define VRT10M_ADDR        CHIPID22//YRTRIM_10M
#define VRT27M_ADDR        CHIPID23//VRTRIM_27M
#define        VRT44M_ADDR        CHIPID24//VRTRIM_44M

void ModifyIRC(ulong fosc)
{
        bit eafxr;
        eafxr = EAXFR;//缓存权限
        EAXFR =1;     //使能访问XFR寄存器
       
        CLKDIV  = 0x04;//降频

        switch (fosc)
  {
          case 22118400UL://选择22.1184MHz
                        IRTRIM  = T22M_ADDR;
                        if(abs(T22M_ADDR-53) > 80)//在10MHz的边缘
                        {
                                VRTRIM  = VRT10M_ADDR;
                                IRCBAND &=~0x03;
                                IRCBAND |=         0x01;//10M频段
                        }
                        else
                        {
                                VRTRIM  = VRT27M_ADDR;
                                IRCBAND &=~0x03;
                                IRCBAND |=         0x02;//27M频段
                        }
                  break;
                case 24000000UL://选择24MHz
                        IRTRIM  = T24M_ADDR;
                        if(abs(T24M_ADDR-82) > 80)//在10MHz的边缘
                        {
                                VRTRIM  = VRT10M_ADDR;
                                IRCBAND &=~0x03;
                                IRCBAND |=         0x01;//10M频段
                        }
                        else
                        {
                                VRTRIM  = VRT27M_ADDR;
                                IRCBAND &=~0x03;
                                IRCBAND |=         0x02;//27M频段
                        }
                  break;
                case 27000000UL://选择27MHz
                        IRTRIM  = T27M_ADDR;
                        VRTRIM  = VRT27M_ADDR;
                        IRCBAND  &=~ 0x03;
                        IRCBAND |=         0x02;//27M频段
                  break;
                case 30000000UL://选择30MHz
                        IRTRIM  = T30M_ADDR;
                        if(abs(T30M_ADDR-174) > 80)//在44MHz的边缘
                        {
                                VRTRIM  = VRT44M_ADDR;
                                IRCBAND &=~0x03;
                                IRCBAND |=         0x03;//44M频段
                        }
                        else
                        {
                                VRTRIM  = VRT27M_ADDR;
                                IRCBAND &=~0x03;
                                IRCBAND |=         0x02;//27M频段
                        }
                  break;
                case 33177600UL://选择33.1776MHz
                        Default:
                        IRTRIM  = T33M_ADDR;
                        if(abs(T33M_ADDR-223) > 80)//在44MHz的边缘
                        {
                                VRTRIM  = VRT44M_ADDR;
                                IRCBAND &=~0x03;
                                IRCBAND |=         0x03;//44M频段
                        }
                        else
                        {
                                VRTRIM  = VRT27M_ADDR;
                                IRCBAND &=~0x03;
                                IRCBAND |=         0x02;//27M频段
                        }
                  break;
                case 35000000UL://选择35MHz
                        IRTRIM  = T35M_ADDR;
                        if(abs(T35M_ADDR-43) > 80)//在27MHz的边缘
                        {
                                VRTRIM  = VRT27M_ADDR;
                                IRCBAND &=~0x03;
                                IRCBAND |=         0x02;//27M频段
                        }
                        else
                        {
                                VRTRIM  = VRT44M_ADDR;
                                IRCBAND &=~0x03;
                                IRCBAND |=         0x03;//44M频段
                        }
                  break;
  
          default:
                        goto Default;
                  break;
  }
       
        while (!(HIRCCR & 1));//等待时钟稳定
        CLKDIV  = 0x00;                                //恢复主频
       
        EAXFR=eafxr;//归还权限
       
}
知识改变命运,技能成就梦想!
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 06:14 , Processed in 0.124798 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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