这要全部看完:
可能在不同的频段,不同个体要设置好
https://www.stcaimcu.com/data/download/Datasheet/STC32G.pdf
29aH 发表于 2025-8-8 13:41
刚发现一个现象,将ISP软件调整好的IRTRIM与VRTRIM寄存器值打印上来(此时运行正常),再第二次使用代码将 ...
由于芯片存在制造误差,所以不同芯片频段的中间频率有所不同,
从而VRTRIM也就不同,调节频率设置的IRTRIM也不一样。
就算同一颗芯片不同环境温度时烧录时调节设置的IRTRIM也会出现一些偏差。
最终调节出来的时钟频率是否准确可以通过MCLKO将主时钟分频输出到指定脚位进行测量,
而不是读取IRTRIM与VRTRIM进行比较。
终于找到问题了,原因是不同芯片的出厂校准频率参数所在的频段并不是固定的,例如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]