STM8单片机外部晶振不起振解决方法
部分型号的STM8单片机可以支持最高24MHz的外部晶振,在配置外部晶振时需要按照如下的步骤进行:
1 定义外部晶振宏定义宏定义的写法如下:
#define HSE_VALUE ((uint32_t)24000000)
外部晶振是多少的就写多少,如果是24M的外部晶振就写成24000000。
如果不用宏定义的话,就在单片机的头文件中找到宏定义部分,头文件的宏定义默认16M外部晶振,将其修改为实际晶振值就可以。
配置外部晶振时需要使能外部时钟,并且要等到晶振稳定。使用库函数配置的语句如下所示:
void CLK_Init()
{
CLK_HSECmd(ENABLE); //外部时钟开
while(SET != CLK_GetFlagStatus(CLK_FLAG_HSERDY)); //等待外部晶振起振
CLK_ClockSwitchCmd(ENABLE);//切换使能
CLK_ClockSwitchConfig(CLK_SWITCHMODE_MANUAL,CLK_SOURCE_HSE,DISABLE,CLK_CURRENTCLOCKSTATE_DISABLE);//切换到外部晶振
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); //1分频
}
3 在main()中初始化将CLK_Init()在main()中初始化。至此,外部晶振就配置完毕了,但是在执行程序时,却发现晶振起振失败,程序死在CLK_ClockSwitchConfig(...)处,为什么呢?这是因为没有添加Flash等到周期,这部分内容需要在option bytes中添加,如下图所示。
默认设置为No wait state,需要修改为1 wait state。
其实,这一部分的内容在数据手册上有体现:
When using the high-speed external clock (HSE) at higher frequencies up to 24 MHz,one wait state is necessary. In this case the device option byte should be programmed to insert this wait state. Refer to the datasheet option byte section.
设置完后,再下载程序,就发现,晶振已经正常起振了。