STM32嵌入式学习 01:GPIO 输出与 LED 闪烁

1. 本课目标

  • 理解 main() 中 STM32 程序的基本执行顺序。
  • 理解"打开外设时钟 -> 配置 GPIO -> 应用配置 -> 主循环"的固定结构。
  • 使用 PA0 输出高、低电平控制 LED。
  • 区分推挽输出、开漏输出。
  • 理解 GPIO_Pin_0 等宏的位掩码含义。
  • 区分整体写入 GPIO_Write() 和局部修改 GPIO_SetBits() / GPIO_ResetBits()

2. 知识主线

#mermaid-svg-8ueGHoCoyh4dH2UO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8ueGHoCoyh4dH2UO .error-icon{fill:#552222;}#mermaid-svg-8ueGHoCoyh4dH2UO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8ueGHoCoyh4dH2UO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8ueGHoCoyh4dH2UO .marker.cross{stroke:#333333;}#mermaid-svg-8ueGHoCoyh4dH2UO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8ueGHoCoyh4dH2UO p{margin:0;}#mermaid-svg-8ueGHoCoyh4dH2UO .edge{stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .section--1 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section--1 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section--1 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section--1 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section--1 text{fill:#ffffff;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth--1{stroke-width:17;}#mermaid-svg-8ueGHoCoyh4dH2UO .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-0 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-0 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-0 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-0 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-0 text{fill:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-0{font-size:40px;color:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-0{stroke-width:14;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-1 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-1 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-1 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-1 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-1 text{fill:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-1{font-size:40px;color:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-1{stroke-width:11;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-2 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-2 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-2 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-2 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-2 text{fill:#ffffff;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-2{stroke-width:8;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-3 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-3 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-3 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-3 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-3 text{fill:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-3{font-size:40px;color:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-3{stroke-width:5;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-4 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-4 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-4 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-4 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-4 text{fill:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-4{font-size:40px;color:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-4{stroke-width:2;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-5 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-5 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-5 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-5 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-5 text{fill:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-5{font-size:40px;color:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-5{stroke-width:-1;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-6 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-6 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-6 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-6 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-6 text{fill:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-6{font-size:40px;color:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-6{stroke-width:-4;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-7 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-7 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-7 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-7 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-7 text{fill:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-7{font-size:40px;color:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-7{stroke-width:-7;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-8 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-8 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-8 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-8 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-8 text{fill:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-8{font-size:40px;color:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-8{stroke-width:-10;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-9 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-9 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-9 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-9 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-9 text{fill:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-9{font-size:40px;color:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-9{stroke-width:-13;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-10 rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-10 path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-10 circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-10 polygon,#mermaid-svg-8ueGHoCoyh4dH2UO .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-10 text{fill:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .node-icon-10{font-size:40px;color:black;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .edge-depth-10{stroke-width:-16;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled circle,#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:lightgray;}#mermaid-svg-8ueGHoCoyh4dH2UO .disabled text{fill:#efefef;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-root rect,#mermaid-svg-8ueGHoCoyh4dH2UO .section-root path,#mermaid-svg-8ueGHoCoyh4dH2UO .section-root circle,#mermaid-svg-8ueGHoCoyh4dH2UO .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-8ueGHoCoyh4dH2UO .section-root text{fill:#ffffff;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-root span{color:#ffffff;}#mermaid-svg-8ueGHoCoyh4dH2UO .section-2 span{color:#ffffff;}#mermaid-svg-8ueGHoCoyh4dH2UO .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-8ueGHoCoyh4dH2UO .edge{fill:none;}#mermaid-svg-8ueGHoCoyh4dH2UO .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-8ueGHoCoyh4dH2UO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} STM32 GPIO 输出
时钟
RCC_APB2PeriphClockCmd
GPIOA 属于 APB2
外设默认需要开启时钟
配置
GPIO_InitTypeDef
GPIO_Mode_Out_PP
GPIO_Pin_0
GPIO_Speed_50MHz
GPIO_Init
输出
GPIO_SetBits
GPIO_ResetBits
GPIO_WriteBit
GPIO_Write
程序结构
main
1
状态 -> 延时 -> 状态
位操作
GPIO_Pin_0 = 0x0001
GPIO_Pin_1 = 0x0002
| 选择多个引脚
工程边界
STM32F103C8
Keil ARMCC 5.06
标准外设库
硬件现象需单独验证

3. 最小 LED 程序

c 复制代码
#include "stm32f10x.h"
#include "Delay.h"

int main(void)
{
    // GPIOA 在使用前必须打开 APB2 外设时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 用结构体集中保存 GPIO 配置
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;         // PA0
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    // 将配置写入 GPIOA 的相关寄存器
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    while (1)
    {
        GPIO_ResetBits(GPIOA, GPIO_Pin_0); // PA0 输出低电平
        Delay_ms(500);

        GPIO_SetBits(GPIOA, GPIO_Pin_0);   // PA0 输出高电平
        Delay_ms(500);
    }
}

4. 程序执行流程

#mermaid-svg-BdYNgUkgiWFQvjYm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BdYNgUkgiWFQvjYm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BdYNgUkgiWFQvjYm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BdYNgUkgiWFQvjYm .error-icon{fill:#552222;}#mermaid-svg-BdYNgUkgiWFQvjYm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BdYNgUkgiWFQvjYm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BdYNgUkgiWFQvjYm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BdYNgUkgiWFQvjYm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BdYNgUkgiWFQvjYm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BdYNgUkgiWFQvjYm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BdYNgUkgiWFQvjYm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BdYNgUkgiWFQvjYm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BdYNgUkgiWFQvjYm .marker.cross{stroke:#333333;}#mermaid-svg-BdYNgUkgiWFQvjYm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BdYNgUkgiWFQvjYm p{margin:0;}#mermaid-svg-BdYNgUkgiWFQvjYm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BdYNgUkgiWFQvjYm .cluster-label text{fill:#333;}#mermaid-svg-BdYNgUkgiWFQvjYm .cluster-label span{color:#333;}#mermaid-svg-BdYNgUkgiWFQvjYm .cluster-label span p{background-color:transparent;}#mermaid-svg-BdYNgUkgiWFQvjYm .label text,#mermaid-svg-BdYNgUkgiWFQvjYm span{fill:#333;color:#333;}#mermaid-svg-BdYNgUkgiWFQvjYm .node rect,#mermaid-svg-BdYNgUkgiWFQvjYm .node circle,#mermaid-svg-BdYNgUkgiWFQvjYm .node ellipse,#mermaid-svg-BdYNgUkgiWFQvjYm .node polygon,#mermaid-svg-BdYNgUkgiWFQvjYm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BdYNgUkgiWFQvjYm .rough-node .label text,#mermaid-svg-BdYNgUkgiWFQvjYm .node .label text,#mermaid-svg-BdYNgUkgiWFQvjYm .image-shape .label,#mermaid-svg-BdYNgUkgiWFQvjYm .icon-shape .label{text-anchor:middle;}#mermaid-svg-BdYNgUkgiWFQvjYm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BdYNgUkgiWFQvjYm .rough-node .label,#mermaid-svg-BdYNgUkgiWFQvjYm .node .label,#mermaid-svg-BdYNgUkgiWFQvjYm .image-shape .label,#mermaid-svg-BdYNgUkgiWFQvjYm .icon-shape .label{text-align:center;}#mermaid-svg-BdYNgUkgiWFQvjYm .node.clickable{cursor:pointer;}#mermaid-svg-BdYNgUkgiWFQvjYm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BdYNgUkgiWFQvjYm .arrowheadPath{fill:#333333;}#mermaid-svg-BdYNgUkgiWFQvjYm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BdYNgUkgiWFQvjYm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BdYNgUkgiWFQvjYm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BdYNgUkgiWFQvjYm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BdYNgUkgiWFQvjYm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BdYNgUkgiWFQvjYm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BdYNgUkgiWFQvjYm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BdYNgUkgiWFQvjYm .cluster text{fill:#333;}#mermaid-svg-BdYNgUkgiWFQvjYm .cluster span{color:#333;}#mermaid-svg-BdYNgUkgiWFQvjYm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BdYNgUkgiWFQvjYm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BdYNgUkgiWFQvjYm rect.text{fill:none;stroke-width:0;}#mermaid-svg-BdYNgUkgiWFQvjYm .icon-shape,#mermaid-svg-BdYNgUkgiWFQvjYm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BdYNgUkgiWFQvjYm .icon-shape p,#mermaid-svg-BdYNgUkgiWFQvjYm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BdYNgUkgiWFQvjYm .icon-shape .label rect,#mermaid-svg-BdYNgUkgiWFQvjYm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BdYNgUkgiWFQvjYm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BdYNgUkgiWFQvjYm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BdYNgUkgiWFQvjYm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 复位后进入 main
打开 GPIOA 时钟
填写 GPIO_InitTypeDef
GPIO_Init 应用配置
PA0 输出低电平
Delay_ms 500
PA0 输出高电平
Delay_ms 500

一次完整循环的理论等待时间约为:

text 复制代码
500 ms + 500 ms = 1000 ms

实际 LED 的亮灭相位取决于开发板 LED 的电路接法。低电平可能点亮 LED,也可能熄灭 LED,不能只根据 API 名称推断实际亮灭。

5. 四个关键步骤

5.1 打开时钟

c 复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

这是对 RCC 时钟控制器的调用。GPIOA 挂在 APB2 总线上,使用前需要开启对应时钟。漏掉这句时,GPIO 配置通常不会按预期工作。

5.2 配置结构体

c 复制代码
GPIO_InitTypeDef GPIO_InitStructure;

它是一张配置表。结构体字段描述 GPIO 的模式、引脚和速度,GPIO_Init() 再根据这些字段配置底层寄存器。

5.3 推挽输出

c 复制代码
GPIO_Mode_Out_PP

推挽输出可以主动输出高电平,也可以主动输出低电平,适合 LED 和普通数字控制信号。

开漏输出 GPIO_Mode_Out_OD 只能主动拉低;释放时需要外部上拉电阻形成高电平,常见于 I2C 和共享信号线。不能因为"都是输出模式"就把两者当作等价配置。

5.4 主循环

c 复制代码
while (1)

单片机程序通常不会像桌面程序一样执行完后退出,而是在无限循环中持续执行控制逻辑。

6. 位掩码

源码中的宏本质上是不同的二进制位:

c 复制代码
#define GPIO_Pin_0 ((uint16_t)0x0001)
#define GPIO_Pin_1 ((uint16_t)0x0002)
#define GPIO_Pin_2 ((uint16_t)0x0004)

因此可以用按位或选择多个引脚:

c 复制代码
GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2

这表示同时选择 PA0、PA1、PA2。引脚选择使用 |,不要把"位集合"误写成普通加法。

7. 整体写入与局部修改

标准库实现中:

c 复制代码
GPIO_Write(GPIOA, value);       // GPIOA->ODR = value,整体覆盖
GPIO_SetBits(GPIOA, pins);      // GPIOA->BSRR = pins,指定位置 1
GPIO_ResetBits(GPIOA, pins);    // GPIOA->BRR = pins,指定位置 0

选择原则

API 影响范围 适用场景
GPIO_SetBits 指定引脚置 1 单独打开 LED
GPIO_ResetBits 指定引脚置 0 单独关闭 LED
GPIO_WriteBit 一个指定引脚 根据条件设置单个引脚
GPIO_Write 整个 GPIO 端口 独占端口的流水灯或整体刷新

如果 GPIOA 的其他引脚连接了别的功能,直接 GPIO_Write() 可能误改它们;此时优先用 SetBitsResetBits 或先明确维护掩码。

8. 延时函数与前提

Delay.c 使用 Cortex-M3 的 SysTick:

c 复制代码
SysTick->LOAD = 72 * xus;
SysTick->VAL = 0x00;
SysTick->CTRL = 0x00000005;
while (!(SysTick->CTRL & 0x00010000)) {}

其中 72 * xus 假设系统时钟为 72 MHz。若系统主频改变而延时计算没有同步修改,Delay_ms(500) 不一定仍然是 500 ms。这是本工程的时钟假设,不是所有 STM32 工程的通用常数。

该延时是阻塞式的:等待期间 CPU 主要在等待计数结束,暂时不能高效处理其他任务。复杂项目通常改用定时器中断、SysTick 节拍或 RTOS 调度。

9. 今日练习

练习 A:修改速度

把两处 Delay_ms(500) 改成 Delay_ms(100),预测完整循环约为 200 ms。

练习 B:双引脚交替

c 复制代码
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOA, &GPIO_InitStructure);

while (1)
{
    GPIO_SetBits(GPIOA, GPIO_Pin_0);
    GPIO_ResetBits(GPIOA, GPIO_Pin_1);
    Delay_ms(500);

    GPIO_ResetBits(GPIOA, GPIO_Pin_0);
    GPIO_SetBits(GPIOA, GPIO_Pin_1);
    Delay_ms(500);
}

练习 C:判断影响范围

回答:如果 PA1 当前为高电平,执行下面代码后 PA1 是否一定变低?

c 复制代码
GPIO_Write(GPIOA, GPIO_Pin_0);

答案:是。因为 GPIO_Write() 整体写入 ODR,未设置的位会变为 0。

10. 事实、假设与验证边界

  • 已知事实:工程目标设备为 STM32F103C8,使用 Keil ARMCC 5.06 和 STM32 标准外设库;源码配置了 GPIOA 的 PA0 推挽输出。
  • 合理推断:若 LED 电路连接到 PA0 且供电、下载和接线正确,PA0 电平会周期性变化。
  • 尚未确认:本次没有收到编译输出、下载结果或实际 LED 现象,因此不能把硬件闪烁记为已验证事实。
  • 重要约束:LED 高低电平有效逻辑取决于开发板原理图;延时准确性依赖系统时钟为 72 MHz 的假设。

11. 下一课预告

下一章进入 GPIO 输入:按键读取。

知识链将变为:

text 复制代码
读取输入 -> 判断按键状态 -> 修改 LED 输出

这会引入输入模式、上拉/下拉、电平有效逻辑和按键消抖。

相关推荐
koi77u1 小时前
嵌入式学习---进程与线程(1)
linux·服务器·学习
雨田言炎2 小时前
STM32专题之内部SRAM
stm32·单片机·嵌入式硬件
ye150127774552 小时前
220V转5V单片机供电电源芯片WT5102
单片机·嵌入式硬件·其他·硬件工程
HUI-4743 小时前
EG12523|集成 600V 半桥驱动,带内置正激恒流功能的正反激 PWM 控制器
单片机·嵌入式硬件
Logintern093 小时前
【每天学习一点点】超参数是什么?
学习·sklearn
Z5998178413 小时前
c#软件开发学习笔记--WPF(控件、样式)
笔记·学习·c#
謓泽3 小时前
『51单片机』AD/DA
单片机·嵌入式硬件·51单片机·模拟·ad·da·謓泽
Zguigo3 小时前
【DL】神经网络学习目标|prediction|Loss|Gradient
人工智能·神经网络·学习
paopaokaka_luck3 小时前
基于springboot3+vue3+uniapp的剧本杀预约小程序(AI角色对话、协同过滤算法、地图Api、Echarts图形化分析)
java·前端·spring boot·学习·echarts