蓝桥杯嵌入式赛道—-软件篇(GPIO输出模式配置)

前言

  • 从现在正式开始讲解使用CubeMX来进行一些外设的初始化配置
  • 这一项是对标传统的标准库,这不仅仅给我们提供了很大的便利也大大降低了实际配置初始化代码时的小错误
  • 文中案例代码(基于江协的标准库移植)资料获取:GitHub : STM32-Lib

CubeMX配置GPIO输出模式

1、新建一个STM32F103C8T6工程

按照之前教的新建工程方式,创建好工程后来到这样的一个界面

  • 界面的左边部分是进行详细配置的操作界面
  • 界面右边的芯片引脚视图是对芯片引脚进行功能选择操作的。(注意:仅仅只是功能的选择,一般有些会有基础的默认配置,但我们会在左边的详细配置界面进行进一步的配置)

2、选择引脚设置为输出模式

这里以"江协课程"中的LED点灯案例为例

  • 点击PA0引脚后会出现一个引脚配置窗口,这里展示了这个引脚所有可以配置的功能,我们这里演示IO口的输出模式,这里就选择"GPIO_Output"
  • 同时给PC13引脚也做相同的配置(PC13引脚连接的是STM32最小系统板上面的一个自带的LED灯)

扩展介绍

右键芯片的引脚会出现这么一个窗口,我们关注这里的"Enter User Label"选项

  • 这个选项的意思是给个引脚打一个标注,比如他是用来控制LED的引脚,我给它一个LED的名称。这个后续在代码里面也会体现,他会给这个名称做一个宏定义

3、进行具体设置

点击左侧的"GPIO"选择,进入到红框这样的界面中,这里展示的就是一些被使用的引脚,同时也是用来配置GPIO的具体设置的地方,继续点击就会弹出配置选项

配置介绍

在这里进行引脚的配置,按照需求选择后就会直接生成对应的初始化代码

  • GPIO output leve l:配置初始化后的输出电平
    • Low:低电平
    • High:高电平
  • GPIO mode :配置输出模式
    • Output Push Pull:推挽输出模式
    • Output Open Drain:开漏输出模式
  • GPIO Pull-up/Pull-down :配置引脚上下拉(这个选项我感觉没有必要,它实际只对输入模式有效,但为了不出现奇奇怪怪的意外,我一般都给他配置为下拉模式或者悬空)
    • No pull-up and no pull-down:引脚悬空
    • Pull-up:引脚上拉
    • Pull-down:引脚下拉
  • Maximum output speed :引脚的输出速度
    • Low:低速
    • Medium:中速
    • High:高速(有特殊需求一定要选High)
  • User Label:用户标签(上面有提到过)

上手操作

  • 我们要用推挽输出来控制LED的亮灭,按如图所示选择后即可,PC13引脚也要进行一样配置

  • 配置完成后,点击生代码打开Keil5

4、代码编写

  • 进入到Keil5后首先编译一下,确保工程代码以及Keil5可用

  • 然后在工程代码的while循环下插入这段代码(注意:代码一定要写在注释块以内,不熟悉的看这篇博客,蓝桥杯嵌入式赛道----软件篇(CubeMX生成代码结构解读)-CSDN博客),即可实现控制PA0引脚上的LED灯亮灭

    c 复制代码
    while (1)
      {
          /* 设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法 */
    
          /* 方法一:使用HAL_GPIO_WritePin函数设置高/低电平,通过GPIO_PIN_RESET/SET参数指定 */
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);   // 将PA0引脚设置为低电平
          HAL_Delay(500);                                         // 延时500ms
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);     // 将PA0引脚设置为高电平
          HAL_Delay(500);                                         // 延时500ms
    
          /* 方法二:使用HAL_GPIO_WritePin函数设置高/低电平,通过0/1数值指定,需要强制转换为GPIO_PinState类型 */
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, (GPIO_PinState)0); // 将PA0引脚设置为低电平
          HAL_Delay(500);                                         // 延时500ms
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, (GPIO_PinState)1); // 将PA0引脚设置为高电平
          HAL_Delay(500);                                         // 延时500ms
    
          /* 方法三:使用HAL_GPIO_TogglePin函数翻转引脚电平状态 */
          HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);                  // 翻转PA0引脚的电平状态,可由高电平变为低电平,也可由低电平变为高电平
          HAL_Delay(500);                                         // 延时500ms
          HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);                  // 再次翻转PA0引脚的电平状态,可由高电平变为低电平,也可由低电平变为高电平
          HAL_Delay(500);                                         // 延时500ms
      }
  • 在Keil5中,跳转MX_GPIO_Init()这个函数的定义可以看到引脚的初始化配置,可以看到它的配置跟标准库的初始化GPIO的流程是一样的

代码解读

  • 这里我会讲解HAL库的GPIO库函数如何去使用,关于其他外设的库函数也可以按照我这样的方式去自己解读

找到GPIO库函数的源文件

  • 首先在Keil5中点击这个选项

  • 接着点击这个

  • 进入到"stm32f1xx_hal_gpio.h"的文件中后一直往下滑找到函数定义,这里就是我们能调用的HAL库的库函数

函数功能介绍

初始化函数

  • 如果不用CubeMX去配置然后生成初始代码,就可以用这个函数去自己自定义引脚的初始化,跟标准库的使用方法是一样的,但是不建议这么坐
c 复制代码
// 初始化GPIO
void  HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
// 默认初始化
void  HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);

功能函数

  • 这些是可以直接使用的功能函数
c 复制代码
// 读取IO口电平,与标准库相比没有专门的Output/Input电平的区分
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
// 写IO口电平
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
// 翻转IO口电平
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
// 锁定IO口配置
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
// GPIO外部中断函数
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
// GPIO外部中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
  • 关于这些函数的使用,参考Github资料中的案例即可
相关推荐
Kisorge2 小时前
【电机控制】基于STM32F103C8T6的二轮平衡车设计——LQR线性二次线控制器(算法篇)
stm32·嵌入式硬件·算法
@卞3 小时前
C语言常见概念
c语言·开发语言
hnjzsyjyj3 小时前
洛谷 P12141:[蓝桥杯 2025 省 A] 红黑树
数据结构·蓝桥杯·二叉树
铭哥的编程日记3 小时前
深入浅出蓝桥杯:算法基础概念与实战应用(二)基础算法(下)
算法·职场和发展·蓝桥杯
范纹杉想快点毕业4 小时前
《嵌入式开发硬核指南:91问一次讲透底层到架构》
java·开发语言·数据库·单片机·嵌入式硬件·mongodb
芝麻馅汤圆儿4 小时前
c文件编译
c语言·开发语言
p66666666684 小时前
STM32-bootloader引导程序跳转机制笔记
笔记·stm32·嵌入式硬件
飞睿科技5 小时前
【芯片选型指南】乐鑫ESP32-C61核心能力解析:为何它在Wi-Fi 6物联网赛道中优势独具?
科技·嵌入式硬件·物联网·智能家居
智者知已应修善业5 小时前
【c语言蓝桥杯计算卡片题】2023-2-12
c语言·c++·经验分享·笔记·算法·蓝桥杯