使用STM32内部HSI (内部RC振荡)作为系统时钟
在实际应用中,有时候为了节约成本,我们会能省则省,特别是当项目对成本比较敏感的时候。
本文介绍的就是如何使用内部RC时钟(HSI)作为时钟源,并且倍频到48M作为系统时钟。 这样就能不依赖外部时钟。
实际案例是通过宏定义来切换,既可以使用外部8M晶振来倍频到72M;也可以使用内部的HSI倍频到48M。
一、源码配置
1、直接进入正文,我们在文件里定义了两个“宏”,用来切换时钟配置是选内部HSI还是外部高速HSE。
代码如下:
#define SYSCLOCK_CRYSTAL_OUTSIED (0) /* 使用外部晶振 */
#define SYSCLOCK_RCCLOCK_INSIED (1) /* 使用内部RC振荡 */
/* 时钟源选择 */
#define SYSCLOCK_CHOISE (SYSCLOCK_RCCLOCK_INSIED)
2、封装使用内部RC作为时钟源,并倍频到48M的函数HSI_SetSysClock();
3、主函数里根据“SYSCLOCK_CHOISE”决定是调用内部RC还是外部晶振作为系统时钟源。
这边我们用到了串口,是为了方便输出信息进行查看。
这里也封装了个函数SYS_CLOCK_OUT用来查看系统频率信息是否真确。
代码如下:
/**
* @brief 输出系统时钟信息
*/
void SYS_CLOCK_OUT(void)
{
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
printf("SYSCLK_Frequency = %d\r\n",RCC_Clocks.SYSCLK_Frequency);
printf("HCLK_Frequency = %d\r\n",RCC_Clocks.HCLK_Frequency);
printf("PCLK1_Frequency = %d\r\n",RCC_Clocks.PCLK1_Frequency);
printf("PCLK2_Frequency = %d\r\n\r\n",RCC_Clocks.PCLK2_Frequency);
}
int main(void)
{
u8 sysflag;
#if SYSCLOCK_CHOISE == SYSCLOCK_CRYSTAL_OUTSIED
SystemInit();
sysflag = 1;
#elif SYSCLOCK_CHOISE == SYSCLOCK_RCCLOCK_INSIED
HSI_SetSysClock(RCC_PLLMul_12);
sysflag = 2;
#else
#error "Sysclock Config Error!"
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
if(sysflag == 1)
{
printf("Sysclock Use Outsied Crystal\r\n");
}
else
{
printf("Sysclock Use Inside Rc oscillation\r\n");
}
SYS_CLOCK_OUT();
while(1)
{
}
}
二、实验现象
使用环境是正点原子的战舰版,串口调试工具是XCOM。
当我们开启使用外部晶振时,编译代码。此时系统时钟应该是72M。载入程序查看调试信息。确实是72M。


同样,我们开启使用内部晶振时,编译代码。此时系统时钟应该是48M。载入程序查看调试信息。确实是48M。


下方是程序源码地址,有需要的伙伴自行下载:
链接: link.
https://download.youkuaiyun.com/download/d1w2jsw/13586742
其他注意事项
HSI用于作为PLL时钟的输入时,系统时钟的最大频率不得超过64MHz。所以我们倍频到48M。
本文详细介绍了如何在STM32单片机中使用内部HSI RC振荡器作为系统时钟源,倍频至48MHz。通过宏定义切换时钟配置,实现不依赖外部晶振的成本优化方案。实验证明,无论是外部8MHz晶振还是内部HSI,都能正确设置系统时钟并验证其频率。
709

被折叠的 条评论
为什么被折叠?



