@[TOC]( STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOA/GPIOB/GPIOC端口控制LED灯,轮流闪烁,间隔时长1秒。)

实验一
一、系统设计概述
使用STM32F103C8T6最小系统板,通过GPIOA、GPIOB、GPIOC三个端口的各一个引脚控制RGB三色LED灯,实现轮流闪烁效果,间隔时间为1秒。
二、硬件连接设计
2.1 LED连接方式
红色LED → GPIOA引脚(如PA0)

绿色LED → GPIOB引脚(如PB0)

蓝色LED → GPIOC引脚(如PC0)

2.2 电路配置
LED采用共阴极接法,阳极通过限流电阻(220Ω-1kΩ)接到STM32 GPIO引脚

阴极接地

GPIO输出高电平时LED点亮,低电平时熄灭

三、程序设计思路
3.1 程序流程图
text
初始化系统时钟
↓
配置GPIOA、GPIOB、GPIOC为推挽输出模式
↓
主循环:
点亮红灯,熄灭其他灯 → 延时1秒
点亮绿灯,熄灭其他灯 → 延时1秒
点亮蓝灯,熄灭其他灯 → 延时1秒
3.2 关键技术点
时钟使能:使能GPIOA、GPIOB、GPIOC的时钟

GPIO配置:设置引脚为推挽输出模式,最大速度50MHz

延时实现:使用SysTick定时器或简单循环延时

四、GPIO寄存器详细配置
4.1 寄存器基地址
GPIOA基地址: 0x4001 0800

GPIOB基地址: 0x4001 0C00

GPIOC基地址: 0x4001 1000

4.2 关键寄存器地址及功能
4.2.1 时钟使能寄存器 (RCC_APB2ENR)
地址: 0x4002 1018

配置:

位2(IOPAEN): 1 → 使能GPIOA时钟

位3(IOPBEN): 1 → 使能GPIOB时钟

位4(IOPCEN): 1 → 使能GPIOC时钟

写入值: 0x0000 001C (二进制: 0000 0000 0000 0000 0000 0000 0001 1100)

4.2.2 GPIO配置寄存器低 (GPIOx_CRL) - 控制引脚0-7
GPIOA_CRL地址: 0x4001 0800

GPIOB_CRL地址: 0x4001 0C00

GPIOC_CRL地址: 0x4001 1000

配置模式(以PA0、PB0、PC0为例):

每4位控制一个引脚(0-7)

对于引脚0(PA0/PB0/PC0): 位[3:0]

位1:0: 11 → 输出模式,最大速度50MHz

位3:2: 00 → 通用推挽输出模式

配置值: 0x0000 0003 (每个引脚配置为0011)

4.2.3 GPIO输出数据寄存器 (GPIOx_ODR)
GPIOA_ODR地址: 0x4001 080C

GPIOB_ODR地址: 0x4001 0C0C

GPIOC_ODR地址: 0x4001 100C

功能: 直接控制引脚输出电平

位0: 1→PA0输出高电平,0→PA0输出低电平

通过设置/清除相应位控制LED亮灭

4.2.4 GPIO位设置/清除寄存器 (GPIOx_BSRR)
GPIOA_BSRR地址: 0x4001 0810

GPIOB_BSRR地址: 0x4001 0C10

GPIOC_BSRR地址: 0x4001 1010

功能: 原子操作方式设置/清除输出位

低16位: 设置对应位为1(置位)

高16位: 清除对应位(复位)

五、代码实现框架
c
#include “stm32f10x.h”

// 简单延时函数
void delay_ms(uint32_t ms) {
for(uint32_t i = 0; i < ms * 1000; i++) {
for(uint32_t j = 0; j < 1000; j++) {
__NOP(); // 空操作
}
}
}

int main(void) {
// 1. 使能GPIO时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;

// 2. 配置PA0、PB0、PC0为推挽输出
GPIOA->CRL &= ~GPIO_CRL_CNF0; // 清除配置位
GPIOA->CRL |= GPIO_CRL_MODE0; // 50MHz输出

GPIOB->CRL &= ~GPIO_CRL_CNF0;
GPIOB->CRL |= GPIO_CRL_MODE0;

GPIOC->CRL &= ~GPIO_CRL_CNF0;
GPIOC->CRL |= GPIO_CRL_MODE0;

// 3. 主循环
while(1) {
// 红灯亮,其他灭
GPIOA->BSRR = GPIO_BSRR_BS0; // PA0置高
GPIOB->BSRR = GPIO_BSRR_BR0; // PB0置低
GPIOC->BSRR = GPIO_BSRR_BR0; // PC0置低
delay_ms(1000);

// 绿灯亮,其他灭
GPIOA->BSRR = GPIO_BSRR_BR0;
GPIOB->BSRR = GPIO_BSRR_BS0;
GPIOC->BSRR = GPIO_BSRR_BR0;
delay_ms(1000);

// 蓝灯亮,其他灭
GPIOA->BSRR = GPIO_BSRR_BR0;
GPIOB->BSRR = GPIO_BSRR_BR0;
GPIOC->BSRR = GPIO_BSRR_BS0;
delay_ms(1000);

}
二. 写出工程项目创建文件夹、添加STM32标准外设库文件(.c,*.h)的详细过程
1、打开keil,点击Project,选择New uVision Project

2、创建工程我是stm32f103c8t6中等容量
Device选择stm32f103c8

3、弹出工程小助手暂时不用

4准备好stm32启动文件,粘贴到工程目录下的Start文件目录下

5、stm32外设寄存器描述文件和51单片机头文件REGX52.H作用类似,描述寄存器及其地址,两个System文件主要用来配置时钟,也粘贴到Start文件目录

6、添加内核寄存器描述文件,同样复制到Start目录下

7、keil目录中创建文件夹并添加文件

8、添加文件目录路径

9、设置文件编码

10、设置Debugger我用的STLink所以设置的STLink

11、设置下载后立即复位,并把下方的容量改为128K

12、新建库函数文件夹Library并添加库函数文件

13、在keil中新建目录

14、conf文件用来配置库函数文件包含关系,两个it结尾的文件用来存放中断函数(interrupt),添加到keil,User目录

15、包含标准外设库

16、再次添加头文件路径

2)我设计的流水灯一个闪一次为100ms,一个流水周期应为300ms。
3)仿真图

————————————————

参考网址:https://blog.csdn.net/Xkccsdn147/article/details/133796943
————————————————
版权声明:本文为CSDN博主「2501_93446470」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2501_93446470/article/details/152135146

更多推荐