```c
Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.
Sets System clock frequency to 72MHz and configure HCLK, PCLK2
* and PCLK1 prescalers.
static void SetSysClockTo72(void)
上面这个函数的哪里得到了stm32f103c8t6的外部时钟的PLL倍频(72MHz)
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在STM32F103C8T6芯片中,系统时钟由外部晶体振荡器提供,并通过PLL倍频器进行倍频后得到。那么如何在代码中设置PLL倍频并将系统时钟频率设置为72MHz呢?
可以通过以下步骤实现:
#include "stm32f10x_rcc.h"已黑化的小白 ```
2. 设置外部晶体振荡器为系统时钟源,并启用PLL倍频器。
```c
// Enable HSE (external crystal oscillator)
RCC_HSEConfig(RCC_HSE_ON);
// Wait till HSE is ready
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
// Configure PLL settings
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
// Enable PLL
RCC_PLLCmd(ENABLE);
// Wait till PLL is ready
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
// Set system clock dividers
RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK / 1
RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK / 1
RCC_PCLK1Config(RCC_HCLK_Div2); // PCLK1 = HCLK / 2
// Select PLL as system clock source
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
在上面的代码中,我们先启用外部晶体振荡器(HSE)并等待其就绪。然后配置PLL的设置,此处我们将外部时钟频率(HSE)除以1,再将其乘以9,以获得72MHz的系统时钟频率。接着启用PLL并等待其就绪,最后设置HCLK、PCLK2和PCLK1的分频器,以及将PLL选为系统时钟源。
希望能帮到你。
如果我的回答解决了您的问题,请采纳!
红外遥控采用NEC协议
定时中断
预分频器采用72,72M/72=1M,每秒1千次,一次1us,即第1us计数器加1 。
溢出值设为10000,即10ms,发生一次TIM_IT_Update中断。
捕获中断
初始为上升沿中断。
贴一下其他有关的代码,使用的标准库的代码?比如你的外部晶振多少,展示一下。根据你的描述来看:
为你找到了标准库代码的原型:
defined SYSCLK_FREQ_72MHz
/**
* @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2
* and PCLK1 prescalers.
* @param None.
* @arg None.
* @note : This function should be used only after reset.
* @retval value: None.
*/
static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/*!< SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/*!< Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/*!< Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/*!< Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_PRFTBE;
/*!< Flash 2 wait state */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
/*!< HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/*!< PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/*!< PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
#if 0
/*!< PLLCLK = 8MHz * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9);
#else
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL9);
#endif
/*!< Enable PLL */
RCC->CR |= RCC_CR_PLLON;
/*!< Wait till PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/*!< Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/*!< Wait till PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
}
else
{ /*!< If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
/* 使能HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* 使能HSE就绪中断 */
RCC_ITConfig(RCC_IT_HSERDY, ENABLE);
}
}
这个函数中,设置了系统时钟频率为72MHz,这是通过PLL倍频设置实现的。具体来说,这个函数使用了RCC_PLLConfig函数来配置PLL时钟源、分频系数和倍频系数,使得PLL时钟输出为72MHz。然后根据系统时钟源的选择(HSE或HSI),再调用RCC_SYSCLKConfig函数设置系统时钟源和分频系数,从而得到最终的系统时钟频率。
下面是一个示例代码,展示如何使用RCC_PLLConfig和RCC_SYSCLKConfig函数来设置系统时钟频率为72MHz:
#include "stm32f10x.h"
static void SetSysClockTo72(void)
{
RCC_DeInit(); // 复位RCC外设到默认状态
RCC_HSEConfig(RCC_HSE_ON); // 使能外部高速晶振
// 等待外部高速晶振稳定
if (RCC_WaitForHSEStartUp() == SUCCESS)
{
// 配置PLL时钟源、分频系数和倍频系数
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
// 使能PLL
RCC_PLLCmd(ENABLE);
// 等待PLL稳定
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
// 配置系统时钟源和分频系数
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK_Div1);
// 配置AHB时钟、APB2时钟和APB1时钟的分频系数
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
// 更新系统时钟频率变量
SystemCoreClockUpdate();
}
}