STM32F103C8T6开发板入门学习——点亮LED灯2

学习目标:STM32F103C8T6开发板入门学习------点亮LED灯


学习内容:库函数点亮LED灯

1. 配置流程

使用库函数操作GPIO端口驱动LED的通用步骤如下:

  1. 开启GPIO对应端口的时钟;
  2. 配置GPIO的输出参数(模式、速度等);
  3. 配置GPIO的输出状态(高/低电平)。

本章节以"用户LED(连接至单片机PC13引脚)"为例,详解库函数操作实现点灯的过程,其他GPIO引脚操作逻辑类似。

注:STM32官方提供了完整的标准外设库函数,使用时需根据功能在对应头文件(如stm32f10x_rcc.hstm32f10x_gpio.h)中查找所需函数。

2. 开启GPIO的端口时钟
2.1 时钟开启的必要性

STM32所有外设资源的时钟默认处于关闭状态,为降低功耗,配置外设前需先开启对应时钟。

2.2 库函数选择与使用
  • 函数查找 :时钟相关库函数声明在stm32f10x_rcc.h中,开启APB2总线外设时钟需使用RCC_APB2PeriphClockCmd函数,原型如下:

    c 复制代码
    void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
    • 参数1(RCC_APB2Periph):指定需开启时钟的APB2外设(如RCC_APB2Periph_GPIOC表示GPIOC);
    • 参数2(NewState):时钟使能状态(ENABLE为开启,DISABLE为关闭)。

下面还有很多其他的开启函数:

  • 代码实现 :用户LED连接GPIOC,需开启GPIOC时钟:

    c 复制代码
    // 开启GPIOC端口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
3. 配置GPIO的输出参数
3.1 核心函数与结构体

GPIO初始化需使用GPIO_Init函数,原型如下:

c 复制代码
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

这个函数GPIO_Init是用于初始化STM32系列微控制器的GPIO(通用输入输出)端口的。它根据提供的参数配置GPIO端口的工作模式、速度、输出类型等。

参数解释:

  • 参数1(GPIOx):指定要初始化的GPIO端口(如GPIOC);
  • 参数2(GPIO_InitStruct):指向GPIO_InitTypeDef结构体的指针,该结构体包含GPIO的配置信息,核心成员如下:
    • GPIO_Pin:指定要配置的引脚(如GPIO_Pin_13表示PC13);
    • GPIO_Mode:设置引脚工作模式(如GPIO_Mode_Out_PP表示推挽输出);
    • GPIO_Speed:设置输出速度(如GPIO_Speed_50MHz表示50MHz)。
3.2 代码实现(配置PC13为推挽输出)

要配置PC13为推挽输出,速度为50MHZ,只需要传入对应的参数即可。转换为代码为:

c 复制代码
GPIO_InitTypeDef GPIO_InitStructure; // 定义初始化结构体

// 1. 开启GPIOC时钟(需先于GPIO初始化)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

// 2. 配置结构体成员
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;       // 选择PC13引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 工作模式:推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度:50MHz

// 3. 初始化GPIOC端口
GPIO_Init(GPIOC, &GPIO_InitStructure);
4. 配置LED输出高电平(点亮LED)

GPIO初始化完成后,可通过以下库函数控制PC13输出高电平(点亮LED),具体方式如下:

4.1 GPIO_SetBits(设置引脚为高电平)
  • 功能:将指定GPIO引脚强制置为高电平;
c 复制代码
void GPlo_SetBits(GPlo_TypeDef* GPlOx, uint16_t GPlO_Pin)

GPIOx: 指定GPIO端口,例如GPIOA、GPIOB等。 GPIO_Pin:

指定要设置的引脚,可以是GPIO_Pin_x(x可以是0到15),也可以是这些值的组合,表示同时设置多个引脚。

代码示例:

c 复制代码
// PC13输出高电平(点亮LED)
GPIO_SetBits(GPIOC, GPIO_Pin_13);
4.2 GPIO_ResetBits

此函数用于将选定的GPIO引脚重置为低电平

c 复制代码
void GPlO_ResetBits(GPlo_TypeDef* GPlOx,uint16_t GPl0_Pin)
  • GPIOx: 指定GPIO端口,例如GPIOA、GPIOB等。
  • GPIO_Pin: 指定要设置的引脚,可以是GPIO_Pin_x(x可以是0到15),也可以是这些值的组合,表示同时设置多个引脚

代码示例:

c 复制代码
// 配置PC13引脚输出低电平转化代码为
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
4.3 GPIO_WriteBit(写入指定电平)
  • 功能:向指定GPIO引脚写入高电平(Bit_SET)或低电平(Bit_RESET);
c 复制代码
void GPlo_WriteBit(GPl0 TypeDef* GPlOx, uint16_t GPlO_Pin, BitAction BitVal)
  • GPIOx: 指定GPIO端口,例如GPIOA、GPIOB等。
  • GPIO_Pin: 指定要设置的引脚,可以是GPIO_Pin_x(x可以是0到15),也可以是这些值的组合,表示同时设置多个引脚 BitVal: 指定引脚的新状态。可以是 Bit_RESET(0,低电平)或 Bit_SET(1,高电平)。

代码示例:

c 复制代码
// PC13输出高电平(点亮LED)
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);

// (补充)PC13输出低电平(熄灭LED)
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
4.4 GPIO_Write

此函数用于同时写入整个GPIO端口的值。

c 复制代码
void GPlo_Write(GPlo_TypeDef* GPlOx, uint16_t PortVal)
  • GPIOx: 指定GPIO端口。
  • PortVal: 16位值,每一位对应端口上的一个引脚。例如,值0x0001将设置端口的第0位,而其余位保持不变。
  • GPIO_Write:可同时写入整个GPIO端口的值,但不建议使用(易因操作全局端口导致错误,且排查困难)。
5. 实验现象

实际效果:将代码烧写至开发板后,连接PC13的用户LED将被点亮。


学习时间:8月27日

1. 配置流程

内容梳理

使用库函数操作GPIO端口驱动LED的通用步骤为:

  1. 开启GPIO对应端口的时钟;
  2. 配置GPIO的输出参数(模式、速度等);
  3. 配置GPIO的输出状态(高/低电平)。

理解

这三个步骤是操作STM32 GPIO外设的核心流程,具有通用性。就像我们使用电器前,首先要打开总开关(对应开启时钟),然后设置电器的工作模式(对应配置GPIO参数),最后操作电器工作(对应设置输出状态)。这种分层配置的思路,体现了STM32外设操作的规范化,让开发者有章可循,减少了操作的随意性。

2. 开启GPIO的端口时钟

2.1 时钟开启的必要性

内容梳理

STM32所有外设资源的时钟默认处于关闭状态,为降低功耗,配置外设前需先开启对应时钟。

理解

这是STM32低功耗设计的一个重要体现。就像我们不使用某个房间的电器时,会关掉房间的总闸一样,STM32通过默认关闭外设时钟,避免了不必要的能量消耗。这也提醒我们,在开发过程中,不需要的外设一定要关闭其时钟,以优化系统功耗。

2.2 库函数选择与使用

内容梳理
  • 时钟相关库函数声明在stm32f10x_rcc.h中,开启APB2总线外设时钟使用RCC_APB2PeriphClockCmd函数,原型为:
c 复制代码
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
  • 参数1(RCC_APB2Periph):指定需开启时钟的APB2外设(如RCC_APB2Periph_GPIOC表示GPIOC);
  • 参数2(NewState):时钟使能状态(ENABLE为开启,DISABLE为关闭)。
  • 代码实现:开启GPIOC时钟
c 复制代码
// 开启GPIOC端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
理解

RCC_APB2PeriphClockCmd函数是开启APB2总线上外设时钟的关键。不同的外设挂在不同的总线上(如APB1、APB2等),所以要根据外设选择对应的时钟开启函数。例如GPIOC在APB2总线上,就用该函数。记住各种外设对应的总线和时钟开启方式,是进行STM32开发的基础。代码实现简洁明了,通过指定外设和使能状态,就能完成时钟开启,体现了库函数封装的便利性。

3. 配置GPIO的输出参数

3.1 核心函数与结构体

内容梳理
  • GPIO初始化使用GPIO_Init函数,原型为:
c 复制代码
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
  • 参数1(GPIOx):指定要初始化的GPIO端口(如GPIOC);
  • 参数2(GPIO_InitStruct):指向GPIO_InitTypeDef结构体的指针,包含的核心成员有:
    • GPIO_Pin:指定要配置的引脚(如GPIO_Pin_13表示PC13);
    • GPIO_Mode:设置引脚工作模式(如GPIO_Mode_Out_PP表示推挽输出);
    • GPIO_Speed:设置输出速度(如GPIO_Speed_50MHz表示50MHz)。
理解

GPIO_Init函数通过结构体参数来配置GPIO,这种方式非常灵活。结构体就像一个配置清单,我们只需要填写好清单上的各项内容(引脚、模式、速度等),再交给函数处理即可。推挽输出模式适合需要强驱动能力的场景,比如驱动LED;而输出速度的选择要根据实际需求,速度越高功耗越大,应在性能和功耗之间找到平衡。

3.2 代码实现(配置PC13为推挽输出)

内容梳理
c 复制代码
GPIO_InitTypeDef GPIO_InitStructure; // 定义初始化结构体

// 1. 开启GPIOC时钟(需先于GPIO初始化)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

// 2. 配置结构体成员
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;       // 选择PC13引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 工作模式:推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度:50MHz

// 3. 初始化GPIOC端口
GPIO_Init(GPIOC, &GPIO_InitStructure);
理解

这段代码完整展示了GPIO初始化的过程,逻辑清晰。首先定义结构体,然后开启时钟(必须在初始化之前,否则初始化无效),接着配置结构体的各个成员,最后调用初始化函数。这种分步操作的方式,让开发者能够清晰地知道每一步的作用,便于理解和调试。对于PC13引脚配置为推挽输出,是因为LED需要通过引脚输出电流来驱动,推挽输出能提供足够的驱动能力。

4. 配置LED输出高电平(点亮LED)

4.1 GPIO_SetBits(设置引脚为高电平)

内容梳理
  • 功能:将指定GPIO引脚强制置为高电平;
  • 函数原型(原文存在拼写错误,正确应为):
c 复制代码
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • 代码示例:
c 复制代码
// PC13输出高电平(点亮LED)
GPIO_SetBits(GPIOC, GPIO_Pin_13);
理解

GPIO_SetBits函数专门用于设置引脚为高电平,函数名直观易懂。在点亮LED的场景中,如果LED的阳极接引脚,阴极通过电阻接地,那么设置引脚为高电平就能点亮LED。使用时要注意引脚的正确选择,避免操作错误的引脚。

4.2 GPIO_ResetBits

内容梳理
  • 功能:将选定的GPIO引脚重置为低电平;
  • 函数原型(原文存在拼写错误,正确应为):
c 复制代码
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • 代码示例:
c 复制代码
// 配置PC13引脚输出低电平
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
理解

GPIO_ResetBitsGPIO_SetBits功能相反,用于设置引脚为低电平。在LED控制中,当需要熄灭LED时,可使用该函数。这两个函数是操作引脚电平的基础函数,使用简单直接,是控制外设状态的常用手段。

4.3 GPIO_WriteBit(写入指定电平)

内容梳理
  • 功能:向指定GPIO引脚写入高电平(Bit_SET)或低电平(Bit_RESET);
  • 函数原型(原文存在拼写错误,正确应为):
c 复制代码
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
  • 代码示例:
c 复制代码
// PC13输出高电平(点亮LED)
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);

// (补充)PC13输出低电平(熄灭LED)
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
理解

GPIO_WriteBit函数比GPIO_SetBitsGPIO_ResetBits更加灵活,它可以通过BitVal参数直接指定引脚的电平状态,无需调用两个不同的函数。在需要根据变量动态设置引脚电平时,这个函数非常方便,能简化代码逻辑。

4.4 GPIO_Write

内容梳理
  • 功能:同时写入整个GPIO端口的值;
  • 函数原型(原文存在拼写错误,正确应为):
c 复制代码
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
  • 不建议使用,易因操作全局端口导致错误,且排查困难。
理解

GPIO_Write函数操作的是整个端口的所有引脚,虽然功能强大,但风险也较高。一旦使用不当,可能会影响到同一端口上其他正在使用的引脚,导致难以排查的错误。因此,在一般开发中,应优先使用操作单个引脚的函数,除非有特殊需求且能确保安全操作。

5. 实验现象

内容梳理

将代码烧写至开发板后,连接PC13的用户LED将被点亮。

理解

实验现象是检验代码正确性的直观方式。当LED成功点亮时,说明之前的时钟开启、GPIO配置和电平设置等步骤都是正确的。这也激励我们,按照规范的步骤进行开发,就能实现预期的功能。同时,实验过程中可能会遇到LED不亮的情况,这时候需要逐步排查每一个步骤,培养调试能力。


总结

本次学习的库函数点亮LED灯,是STM32开发的入门基础。核心流程为开启时钟、配置GPIO参数、设置输出状态。通过学习可知,STM32的外设操作具有严格的规范性和逻辑性,库函数的封装使得操作更加简便。在实际开发中,要注意函数的正确使用(包括参数和拼写),遵循操作流程,同时根据实际需求选择合适的函数和配置参数。点亮LED虽然简单,但其中蕴含的外设操作思想适用于STM32其他外设的学习,是后续更复杂开发的基石。

相关推荐
David WangYang2 小时前
技巧:调试 SCPI 和 VISA 自动化(包括 NI I/O 跟踪)
stm32·单片机·自动化
Learn Beyond Limits3 小时前
The learning process of Decision Tree Model|决策树模型学习过程
人工智能·深度学习·神经网络·学习·决策树·机器学习·ai
JXNL@4 小时前
什么是PFC控制器
单片机·嵌入式硬件
凯尔萨厮4 小时前
Java学习笔记三(封装)
java·笔记·学习
Wallace Zhang4 小时前
STM32F103_Bootloader程序开发15 - 从Keil到vscode + EIDE + GCC的迁移实践
stm32·gcc·eide
YoungUpUp5 小时前
【文件快速搜索神器Everything】实用工具强推——文件快速搜索神器Everything详细图文下载安装教程 办公学习必备软件
学习·everything·文件搜索·实用办公软件·everything 工具·文件快速搜索·搜索神器
RaLi和夕5 小时前
单片机学习笔记.C51存储器类型含义及用法
笔记·单片机·学习
ShiMetaPi5 小时前
操作【GM3568JHF】FPGA+ARM异构开发板 使用指南:蓝牙
arm开发·嵌入式硬件·fpga开发·rk3568
武文斌775 小时前
ARM工作模式、汇编学习
汇编·嵌入式硬件·学习·arm