前言
之前介绍了如何使用内部晶振,但是使用的频率是24M,速度是慢了一点,所以这次说下如何使用64M内部晶振
环境:
芯片:STM32F103C8T6
Keil:V5.24.2.0
一、
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
#define SYSCLK_FREQ_24MHz 24000000
#else
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz 24000000 */
/* #define SYSCLK_FREQ_36MHz 36000000 */
/* #define SYSCLK_FREQ_48MHz 48000000 */
/* #define SYSCLK_FREQ_56MHz 56000000 */
/* #define SYSCLK_FREQ_72MHz 72000000 */
#endif
搜索以上代码并注释。
二、
#ifdef SYSCLK_FREQ_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_24MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_36MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_48MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_56MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_72MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */
#else /*!< HSI Selected as System Clock source */
//uint32_t SystemCoreClock = HSI_VALUE; /*!< System Clock Frequency (Core Clock) */
uint32_t SystemCoreClock = 64000000; //更改这里
#endif
将最后一句注释并将参数改为64M。
最后:
将原void SystemInit(void){}函数注释掉
并且粘贴一下函数:
void SystemInit(void)
{
RCC_DeInit();
RCC_HSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESET);
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟(HCLK) = 系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1); //设置AHB2时钟 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //设置AHB1时钟 = HCLK
FLASH_SetLatency(FLASH_Latency_2); //设置FLASH存储器延时时钟周期数
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16); //设置PLL时钟源及倍频系数,频率为8/2*16=64MHz
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);
}
在代码中验证:
RCC_ClocksTypeDef rcc_clocks; //定义结构体变量
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
RCC_GetClocksFreq(&rcc_clocks);//获取不同时钟频率
仿真查看rcc_clocks参数:
经转换:0x03D09000对应64M。