普中STM32-F103-精灵开发板实现LED灯4秒间隔闪烁实战
目录
• 一、开发环境准备
• 二、硬件连接与原理分析
• 三、Keil MDK工程搭建与配置
• 四、核心代码编写与解析
◦ 4.1 时钟配置代码解析
◦ 4.2 GPIO初始化代码解析
◦ 4.3 主函数代码解析
• 五、完整代码展示
• 六、调试与运行
• 七、总结与拓展
一、开发环境准备
1. 硬件:普中STM32-F103-精灵开发板、ST-Link调试器(或J-Link)
2. 软件:
◦ Keil MDK 5(安装ARM编译器)
◦ STM32F1系列标准外设库(需下载并添加到工程)
3. 工具链:ST-Link Utility(用于下载程序到开发板)
二、硬件连接与原理分析
普中STM32-F103-精灵开发板已将LED灯连接至指定GPIO引脚(通常为PA8),通过控制该引脚的高低电平即可实现LED的亮灭。硬件连接原理如下:
• LED正极:通过限流电阻连接到PA8引脚
• LED负极:连接到开发板的GND
• 控制逻辑:PA8输出高电平(1)时LED亮,输出低电平(0)时LED灭
三、Keil MDK工程搭建与配置
1. 新建工程:在Keil MDK中创建新工程,选择芯片型号STM32F103C8。
2. 添加标准外设库:
◦ 将STM32F10x_StdPeriph_Driver文件夹中的inc(头文件)和src(源文件)添加到工程。
◦ 在工程配置中设置头文件路径(魔术棒->C/C++->Include Paths)。
3. 配置调试器:
◦ 选择ST-Link Debugger(若使用ST-Link)。
◦ 在Settings中配置下载算法和时钟频率。
四、核心代码编写与解析
4.1 时钟配置代码解析
void SystemClock_Config(void)
{
RCC_DeInit(); // 复位RCC时钟配置
RCC_HSEConfig(RCC_HSE_ON); // 开启外部高速时钟
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); // 等待HSE稳定
// 设置PLL时钟源为HSE,倍频系数为9,得到72MHz系统时钟
RCC_PLLConfig(RCC_PLLSource_HSE, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE); // 使能PLL
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // 等待PLL稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 设置PLL为系统时钟
while(RCC_GetSYSCLKSource() != 0x08); // 等待PLL成为系统时钟
}
• 作用:配置系统时钟为72MHz,为后续外设提供稳定时钟。
• 关键函数:
◦ RCC_HSEConfig:开启外部高速时钟。
◦ RCC_PLLConfig:设置PLL倍频系数。
◦ RCC_SYSCLKConfig:选择PLL作为系统时钟。
4.2 GPIO初始化代码解析
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // 选择PA8引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
GPIO_SetBits(GPIOA, GPIO_Pin_8); // 初始化为高电平(LED熄灭)
}
• 作用:初始化PA8引脚为推挽输出模式,用于控制LED。
• 关键函数:
◦ RCC_APB2PeriphClockCmd:使能GPIOA时钟。
◦ GPIO_Init:根据配置初始化GPIO引脚。
4.3 主函数代码解析
int main(void)
{
SystemClock_Config(); // 配置系统时钟
GPIO_Configuration(); // 初始化GPIO
while (1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_8); // PA8输出低电平,LED亮
Delay(4000000); // 延时4秒(粗略延时,需根据系统时钟调整)
GPIO_SetBits(GPIOA, GPIO_Pin_8); // PA8输出高电平,LED灭
Delay(4000000); // 延时4秒
}
}
• 作用:循环控制LED亮灭,间隔4秒。
• 关键函数:
◦ GPIO_ResetBits:设置引脚为低电平。
◦ GPIO_SetBits:设置引脚为高电平。
◦ Delay:自定义延时函数(实现见下文完整代码)。
五、完整代码展示
#include "stm32f10x.h"
// 自定义延时函数(粗略延时,需根据系统时钟调整)
void Delay(__IO uint32_t nCount)
{
for(; nCount!= 0; nCount--);
}
// 系统时钟配置函数
void SystemClock_Config(void)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
RCC_PLLConfig(RCC_PLLSource_HSE, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);
}
// GPIO初始化函数
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_8);
}
int main(void)
{
SystemClock_Config();
GPIO_Configuration();
while (1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
Delay(4000000);
GPIO_SetBits(GPIOA, GPIO_Pin_8);
Delay(4000000);
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif
六、调试与运行
1. 编译工程:在Keil MDK中点击Build或Rebuild All生成.hex文件。
2. 下载程序:使用ST-Link Utility将.hex文件烧录到开发板。
3. 观察现象:开发板上电后,对应LED将以4秒间隔持续闪烁。
七、总结与拓展
通过本实战,掌握了STM32开发板的时钟配置、GPIO控制及延时实现方法。后续可尝试:
• 使用定时器实现更精确的延时。
• 扩展多个LED实现流水灯效果。
• 结合中断机制优化闪烁逻辑。
希望本文能帮助嵌入式初学者快速入门STM32开发!