stm32f103用库函数写的锁相环作为时钟源程序
时间: 2024-03-06 20:50:34 浏览: 29
下面是使用 STM32F103 的固件库函数(StdPeriph)编写的锁相环作为时钟源的程序示例:
```c
#include "stm32f10x.h"
#define PLL_SOURCE_HSE // 将 PLL 输入时钟源设置为 HSE
#define PLL_MUL 9 // 设置 PLL 的倍频因子为 9,得到 72MHz 的系统时钟
#define PLL_DIV 2 // 设置 PLL 输出时钟分频因子为 2,得到 36MHz 的 PLL 输出时钟
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
int main(void)
{
RCC_Configuration(); // 配置 RCC 时钟
GPIO_Configuration(); // 配置 GPIO 端口
USART_Configuration(); // 配置 USART 串口
while (1)
{
// 等待数据接收完成
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
// 读取接收到的数据
uint16_t data = USART_ReceiveData(USART1);
// 发送数据
USART_SendData(USART1, data);
}
}
void RCC_Configuration(void)
{
// 使能外部高速时钟 HSE
RCC_HSEConfig(RCC_HSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
// 配置 PLL
#ifdef PLL_SOURCE_HSE
// 将 PLL 输入时钟源设置为 HSE
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, PLL_MUL, PLL_DIV);
#else
// 将 PLL 输入时钟源设置为 HSI / 2
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, PLL_MUL, PLL_DIV);
#endif
// 使能 PLL
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
// 将 PLL 输出时钟作为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource() != 0x08);
// 配置 AHB、APB1、APB2 时钟分频因子
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
// 使能 GPIOA 和 USART1 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 配置 PA9 和 PA10 为 USART1 的 TX 和 RX 引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
// 配置 USART1 的参数
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
// 使能 USART1
USART_Cmd(USART1, ENABLE);
}
```
以上代码中,通过调用固件库提供的 RCC 库函数和相关宏定义,实现了 STM32F103 的时钟初始化。具体来说,首先使能了外部高速时钟 HSE,并配置了 PLL 的输入时钟源、倍频因子和输出时钟分频因子,从而得到了 72MHz 的系统时钟。然后配置了 GPIO 端口和 USART 串口,并在主循环中实现了串口数据的收发功能。需要注意的是,代码中使用了宏定义 `PLL_SOURCE_HSE` 来控制 PLL 输入时钟源的选择,可以根据需要进行修改。