本帖最后由 永远不停 于 2021-2-7 11:42 编辑
在做时钟配置时,内部时钟的配置是可以正常工作的,且通过CLKOUT脚观察时钟频率是正确的。 板子上接了外部8M晶振,做外部时钟配置时,MCU的工作频率并不符合配置的频率,而是还按照内部的时钟配置在运行。向各位请较一下外部时钟的配置,帮忙看看程序配置有什么问题。
1.内部时钟配置
配置字
#pragma config FEXTOSC = OFF // External Oscillator mode selection bits->Oscillator not enabled
#pragma config RSTOSC = HFINT1 // Power-up default value for COSC bits->HFINTOSC (1MHz)
#pragma config CLKOUTEN = ON // Clock Out Enable bit->CLKOUT function is enable;
OSC配置
/*内部时钟配置
* OSCCON1为新时钟配置,NOSC选择新的时钟源,NDIV选择新的分频系数
* OSCCON2为当前时钟配置
* OSCFRQ为新内部时钟的频率
* 使用内部时钟时,可通过CLKOUT脚输出focs/4的频率波形,便于观察,同时需要将配置字里的FEXTOSC关掉,以防该引脚被外部晶振占用
*/
void CLCK_Internal_Config(void)
{
OSCCON1 = 0X60; //新时钟配置,HFINTOSC-1MHZ,分频-1
OSCCON2 = 0X60; //当前时钟配置,HFINTOSC-1MHZ,分频-1
OSCCON3 = 0X00;
OSCEN = 0X00;
OSCFRQ = 0x06; //HFFRQ-32MHZ
OSCTUNE =0X00;
}
这种配置下,内部时钟频率是正确的,通过调整OSCFRQ寄存器的值,可以修改频率。
2.外部时钟配置
配置字
#pragma config FEXTOSC = HS // External Oscillator mode selection bits->Oscillator not enabled
#pragma config RSTOSC = HFINT1 // Power-up default value for COSC bits->HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF // Clock Out Enable bit->CLKOUT function is disabled; i/o or oscillator function on OSC2
OSC配置
void CLCK_External_Config(void)
{
OSCCON1 = 0x70; //选择外部EXTOSC,不分频
OSCCON2 = 0X60;
OSCCON3 = 0x00;
OSCEN = 0x00;
OSCFRQ = 0x05;
// HFTUN 0;
OSCTUNE = 0x00;
}
这种配置下, 配置字中已使能HS,写入OSCCON1的配置感觉并没有生效,因为工作频率并不是外部晶振的8M。在调整OSCFRQ寄存器的值时,仍可以修改工作频率,而OSCFRQ中的值是内部振荡器的频率配置值。实际测试时外部晶振并没有起振。
将OSCCON2中的配置也改为0X70,即选择外部时钟,仍然是在按内部时钟频率工作。
为什么外部时钟的配置不能生效,是配置有问题吗?请各位指教一下,感谢!
|