新唐有些芯片可以用外部32Ktrim内部HIRC。一般HIRC全温度范围误差2%左右,在有些场合这个精度不够,这时候就可以用外部32K来trim内部HIRC,trim之后HIRC精度可以达到0.25%左右。 Trim功能一旦使能就一直在工作,不会停止。如果外部32K晶振频率飘出范围(内部设定的范围比较大一般是20K ~ 47K左右),trim就会停止,并发生中断。所以需要在中断里面重新启动trim功能。 /*LXT 时钟出错或者尝试次数达到限制将发生中断*/
void HIRC_IRQHandler(void)
{ uint32_t u32IRCStatus;
/*清除中断标志*/
u32IRCStatus = SYS->IRCTRIMINT; SYS->IRCTRIMINT = u32IRCStatus;
/*重新启动trim功能*/
SYS->IRCTRIMCTL = SYS_IRCTRIMCTL_LOOP_32CLK| SYS_IRCTRIMCTL_TRIM_12M; }
/*使能trim功能*/
void SYS_EnableAutoTrim()
{
/*取32个32K时钟周期的平均值来trim HIRC*/
SYS->IRCTRIMCTL = SYS_IRCTRIMCTL_LOOP_32CLK| SYS_IRCTRIMCTL_TRIM_12M;
/*一旦出错将发生中断*/
SYS->IRCTRIMIEN = SYS_IRCTRIMIEN_32KERR_EN | SYS_IRCTRIMIEN_FAIL_EN;
NVIC_EnableIRQ(HIRC_IRQn);
}
|