1.首先查阅芯片的数据手册看是否支持外部晶体起振,GD32E103C8T6我看了是支持的。
2.其次要确保目标板是有外部晶体连接的,没有外置晶体这样操作并没有作用。
3.另外在PCB布线时,晶振电路的走线尽量短且靠近IC,杜绝在晶振两脚走线。
在system_gd32e10x.c文件里将IRC(尾部IRC是内部晶体的意思)注释,放开对应72M HXTAL(尾部HXTAL是外部晶体的意思)的注释,这里我的内部程序已经经过了分频、倍频,所以不能乱选,根据自己需求选择。
/* select a system clock by uncommenting the following line */
/* use IRC8M */
//#define __SYSTEM_CLOCK_IRC8M (uint32_t)(__IRC8M)
//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000)
#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000)
//#define __SYSTEM_CLOCK_120M_PLL_IRC8M (uint32_t)(120000000)
/* use HXTAL(CK_HXTAL = 8M) */
//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000)
//#define __SYSTEM_CLOCK_120M_PLL_HXTAL (uint32_t)(120000000)
/* select a system clock by uncommenting the following line */
/* use IRC8M */
//#define __SYSTEM_CLOCK_IRC8M (uint32_t)(__IRC8M)
//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000)
//#define __SYSTEM_CLOCK_120M_PLL_IRC8M (uint32_t)(120000000)
/* use HXTAL(CK_HXTAL = 8M) */
//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000)
#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000)
//#define __SYSTEM_CLOCK_120M_PLL_HXTAL (uint32_t)(120000000)
到这里你以为结束了?如果是GD32F130C8T6芯片,在HXTAL_VALUE上鼠标右键 go to def ‘HXTAL_VALUE’,可以找到很关键的几句话
/* system frequency define */
#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */
#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */
#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */
以下,这几句话决定了外部8M晶振是否起作用。
/* define value of high speed crystal oscillator (HXTAL) in Hz */
#if !defined (HXTAL_VALUE)
#define HXTAL_VALUE ((uint32_t)8000000)
#endif /* high speed crystal oscillator value */
我们再看GD32E103C8T6,大概率会报这个;意思是没有定义HXTAL_VALUE;
我们用HXTAL_VALUE全局查找,会在gd32e10x.h这个文件里发现重要的几句话是灰色的,也就是没有起作用;
接下来,我们做阅读理解:
#if !defined HXTAL_VALUE
如果没有定义HXTAL_VALUE;
#ifdef GD32E103V_EVAL
如果定义了GD32E103V_EVAL ;
#define HXTAL_VALUE ((uint32_t)8000000) /*!< value of the external oscillator in Hz */
#define HXTAL_VALUE_8M HXTAL_VALUE
这两个宏定义就起作用了;
接下来我们看全局预编译,点击魔术棒 -> 选择C\C++
选择以后,可以看到菜单中的Define,如图所示,文本框中输入的预编译的内容中有HXTAL_VALUE,没有GD32E103V_EVAL ,所以 所以啊 友友们发现了吗。
我们就是要改这里,将HXTAL_VALUE删去,加入GD32E103V_EVAL
重要的几句话就起作用了,编译一下,大功告成!嘿嘿!给同样玩儿GD32系列的友友一个参考。
这里附一个帖子,就是里面帖子的回复那样。
https://bbs.21ic.com/icview-2686562-1-1.html