STM32F103C8T6系统初始化代码解析
时间: 2023-06-25 14:03:33 浏览: 388
STM32F103C8T6 学习代码
STM32F103C8T6是一款基于Cortex-M3内核的微控制器,下面是一份简单的系统初始化代码解析:
```c
#include "stm32f10x.h" // 包含STM32F103C8T6芯片的头文件
int main(void)
{
// 时钟初始化
RCC_DeInit(); // 复位时钟配置为默认状态
RCC_HSEConfig(RCC_HSE_ON); // 开启外部高速晶振
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) {} // 等待外部晶振就绪
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLL配置为9倍频
RCC_PLLCmd(ENABLE); // 开启PLL
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} // 等待PLL锁定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 将PLL输出作为系统时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK时钟为SYSCLK
RCC_PCLK1Config(RCC_HCLK_Div2); // APB1时钟为HCLK的一半
RCC_PCLK2Config(RCC_HCLK_Div1); // APB2时钟为HCLK
SystemCoreClockUpdate(); // 更新系统时钟变量
// GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // PC13引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输出速率为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC
while(1)
{
GPIO_SetBits(GPIOC, GPIO_Pin_13); // PC13引脚输出高电平
for(int i = 0; i < 1000000; i++) {} // 延时
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // PC13引脚输出低电平
for(int i = 0; i < 1000000; i++) {} // 延时
}
}
```
这份代码主要做了两件事情,分别是时钟初始化和GPIO初始化。
时钟初始化部分主要包括以下步骤:
1. 使用`RCC_DeInit()`函数将时钟配置复位为默认状态。
2. 使用`RCC_HSEConfig()`函数开启外部高速晶振。
3. 使用`RCC_GetFlagStatus()`函数等待外部晶振就绪。
4. 使用`RCC_PLLConfig()`函数将PLL配置为9倍频。
5. 使用`RCC_PLLCmd()`函数开启PLL。
6. 使用`RCC_GetFlagStatus()`函数等待PLL锁定。
7. 使用`RCC_SYSCLKConfig()`函数将PLL输出作为系统时钟。
8. 使用`RCC_HCLKConfig()`、`RCC_PCLK1Config()`和`RCC_PCLK2Config()`函数分别配置HCLK、APB1和APB2时钟。
9. 使用`SystemCoreClockUpdate()`函数更新系统时钟变量。
GPIO初始化部分主要包括以下步骤:
1. 使用`RCC_APB2PeriphClockCmd()`函数使能GPIOC时钟。
2. 定义一个`GPIO_InitTypeDef`类型的结构体,配置引脚、工作模式和输出速率等参数。
3. 使用`GPIO_Init()`函数初始化GPIOC。
最后,在一个无限循环中实现了一个闪烁LED的功能,通过`GPIO_SetBits()`和`GPIO_ResetBits()`函数控制PC13引脚输出高低电平,并使用简单的延时来控制闪烁频率。
阅读全文