写在前面:标题“使用内部rc振荡器做时钟源”其实不太准确,实际应该是“使用内部rc振荡器经PLL倍频后做时钟源”,为了简单本文统一用“使用内部rc振荡器做时钟源”。
在做开发时,一些场合对时钟要求不是非常精确的时候可以省掉外部晶体和两个电容,好处是可以简化布线,节省成本并进一步降低功耗;缺点也很明显,HSI不够精准,官方给出的误差是在1%(25摄氏度)。根据手册,USB时钟不能用HSI经PLL后得到,但是实际应用时这样做是可以的(只是能用,但是非常不推荐)。
在用正点原子例程时,一直找不到相关例程,网上的一些教程也只是谈到了原理,代码部分都需要改动库函数,不方便移植。后来发现野火的例程里有,而且可以直接调用,就直接用了,详细文件是“16-RCC—使用HSE或者HSI配置系统时钟”的“bsp_clkconfig.c”和“bsp_clkconfig.h”。
文件中有如下函数
void HSI_SetSysClock(uint32_t pllmul)
{
__IO uint32_t HSIStartUpStatus = 0;
// 把RCC外设初始化成复位状态,这句是必须的
RCC_DeInit();
//使能HSI
RCC_HSICmd(ENABLE);
// 等待 HSI 就绪
HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;
// 只有 HSI就绪之后则继续往下执行
if (HSIStartUpStatus == RCC_CR_HSIRDY)
{
//---------------------------------------------------------------------