神农鼎 发表于 2025-8-8 13:45:05


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


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

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

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


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

29aH 发表于 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;//归还权限
       
}
页: 1 [2]
查看完整版本: 关于32G12K128芯片无法调整晶振问题 | 已解决