29aH 发表于 2025-7-30 11:03:03

关于32G12K128芯片无法调整晶振问题

老师们好,请教一个技术问题,有款产品用的32G12K128这款芯片,
测试过程中发现个别芯片的晶振无法调整到正确的频率,个别频率段会出现问题,
每个芯片出现异常的频率不一样,其中35M出现异常的个数最多,
以下是参考手册写的一个调整晶振的代码,麻烦帮忙看看;
使用AIapp-ISP工具进行调整晶振烧录的话可以调整到预期的频率,只是用户代码调整会出问题。

#define T22M_ADDR      CHIPID11      //22.1184MHz
#define      T24M_ADDR      CHIPID12      //24MHz
#define T27M_ADDR      CHIPID13      //27MHz
#define T30M_ADDR      CHIPID14      //30MHz
#define T33M_ADDR      CHIPID15      //33.1776MHz
#define T35M_ADDR      CHIPID16      //35MHz
#define T36M_ADDR      CHIPID17      //36.864MHz
#define T40M_ADDR      CHIPID18      //40MHz
#define T44M_ADDR      CHIPID19      //44.2368MHz
#define T48M_ADDR      CHIPID20      //48MHz
#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(void)
{
      bit eafxr;
      eafxr = EAXFR;//缓存权限
      EAXFR =1;   //使能访问XFR寄存器

      switch (FOSC)
{
          case 22118400UL://选择22.1184MHz
                        CLKDIV= 0x04;
                        IRTRIM= T22M_ADDR;
                        VRTRIM= VRT27M_ADDR;
                        IRCBAND = 0x02;
                        CLKDIV= 0x00;
                  break;
                case 24000000UL://选择24MHz
                        CLKDIV= 0x04;
                        IRTRIM= T24M_ADDR;
                        VRTRIM= VRT27M_ADDR;
                        IRCBAND = 0x02;
                        CLKDIV= 0x00;
                  break;
                case 27000000UL://选择27MHz
                        CLKDIV= 0x04;
                        IRTRIM= T27M_ADDR;
                        VRTRIM= VRT27M_ADDR;
                        IRCBAND = 0x02;
                        CLKDIV= 0x00;
                  break;
                case 30000000UL://选择30MHz
                        CLKDIV= 0x04;
                        IRTRIM= T30M_ADDR;
                        VRTRIM= VRT27M_ADDR;
                        IRCBAND = 0x02;
                        CLKDIV= 0x00;
                  break;
                case 33177600UL://选择33.1776MHz
                        Default:
                        CLKDIV= 0x04;
                        IRTRIM= T33M_ADDR;
                        VRTRIM= VRT27M_ADDR;
                        IRCBAND = 0x02;
                        CLKDIV= 0x00;
                  break;
                case 35000000UL://选择35MHz
                        CLKDIV= 0x04;
                        IRTRIM= T35M_ADDR;
                        VRTRIM= VRT44M_ADDR;
                        IRCBAND = 0x03;
                        CLKDIV= 0x00;
                  break;
                case 44236800UL://选择44.2368MHz
                        CLKDIV= 0x04;
                        IRTRIM= T35M_ADDR;
                        VRTRIM= VRT44M_ADDR;
                        IRCBAND = 0x03;
                        CLKDIV= 0x00;
                  break;
                case 48000000UL://选择48MHz
                        CLKDIV= 0x04;
                        IRTRIM= T48M_ADDR;
                        VRTRIM= VRT44M_ADDR;
                        IRCBAND = 0x03;
                        CLKDIV= 0x00;
                  break;

               
          default:
                        goto Default;
                  break;
}
      EAXFR=eafxr;//归还权限
      
      NOP(40);
      NOP(40);
      NOP(40);
      NOP(40);
      
}



乘风飞扬 发表于 2025-8-8 14:39:10

29aH 发表于 2025-8-8 13:41
刚发现一个现象,将ISP软件调整好的IRTRIM与VRTRIM寄存器值打印上来(此时运行正常),再第二次使用代码将 ...
由于芯片存在制造误差,所以不同芯片频段的中间频率有所不同,
从而VRTRIM也就不同,调节频率设置的IRTRIM也不一样。


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

乘风飞扬 发表于 2025-7-30 11:26:02

屠龙刀核心功能实验板例程包例子有实现这样的功能,可烧录例子到芯片里试试:27-核心硬件功能初始化例程
例程包下载地址:https://www.stcai.com/hxgnsyb


35M是32G12K128的极限频率,为了避免芯片差异导致个别运行不正常,建议用低1,2个级别以内的频率运行。

29aH 发表于 2025-8-1 10:31:32

乘风飞扬 发表于 2025-7-30 11:26
屠龙刀核心功能实验板例程包例子有实现这样的功能,可烧录例子到芯片里试试:27-核心硬件功能初始化例程
例 ...

您好,采用该例程进行测试,发现在33M频率时出现异常

乘风飞扬 发表于 2025-8-1 15:50:15

29aH 发表于 2025-8-1 10:31
您好,采用该例程进行测试,发现在33M频率时出现异常
例子将主频2分频后通过P1.6输出,可用示波器测一下误差有多少。
33M频率在两个频段之间,可能个别芯片调频时误差会大一些。


我这里测试是正常的:


29aH 发表于 2025-8-8 10:16:59

https://www.stcaimcu.com/forum.php?mod=image&aid=110996&size=300x300&key=e307d79fb506b75d&nocache=yes&type=fixnonehttps://www.stcaimcu.com/forum.php?mod=image&aid=110994&size=300x300&key=48be62ca6b193b14&nocache=yes&type=fixnone
这是一片33.1776M异常的芯片,
我将ISP软件自动调整后的参数和出厂参数打印出来,
发现出厂参数与软件调整的相差很大。
建议官方进行抽查批次,是否在生产过程中存在个别参数错误

29aH 发表于 2025-8-8 10:16:59

https://www.stcaimcu.com/forum.php?mod=image&aid=111002&size=300x300&key=6bdf9bc8b10e08eb&nocache=yes&type=fixnonehttps://www.stcaimcu.com/forum.php?mod=image&aid=110994&size=300x300&key=48be62ca6b193b14&nocache=yes&type=fixnone
这是一片33.1776M异常的芯片,我将ISP软件自动调整后的参数和出厂参数打印出来,发现出厂参数与软件调整的相差很大。建议官方进行抽查批次,是否在生产过程中存在个别参数错误

zxcv1973 发表于 2025-8-8 12:04:23

以前就有这疑问,厂家内置的IRC频率参数能保证到误差有多少、可靠性有多少,还是说一切随缘,不过好像也没人关注这个

神农鼎 发表于 2025-8-8 13:21:09




神农鼎 发表于 2025-8-8 13:32:20



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

29aH 发表于 2025-8-8 13:41:04

刚发现一个现象,将ISP软件调整好的IRTRIM与VRTRIM寄存器值打印上来(此时运行正常),再第二次使用代码将该值写入IRTRIM与VRTRIM寄存器的方式进行频率调整,就会出现频率异常现象,且该方法只有在33.1776M这个参数下会出现问题,测试27M、35M等频率均正常。所以有个疑问,明明写入的值与ISP调整的值是相同的,为何不能正常调整频率?
页: [1] 2
查看完整版本: 关于32G12K128芯片无法调整晶振问题