stm32 GPIO

基于hal库的stm32 GPIO教学

一、了解:什么是单片机

二、开发环境配置

2.0 stm32开发环境对比

  • keil

  • iar

  • TrueSTUDIO - Updates to Atollic TrueSTUDIO are discontinued since 2017

  • SW4STM32

  • stm32cubeIDE

  • eclipse/vscode + arm-none-eabi-gcc

  • platformio - opensource

2.1 集成51和stm32的单片机开发环境配置

  1. keil官网下载软件安装包
    stm32 GPIO
    stm32 GPIO
    stm32 GPIO
  2. 下载器件支持包Software Packs
    stm32 GPIO
    stm32 GPIO
    stm32 GPIO
  3. 准备注册机
  4. 安装keil mdk
  5. 管理员身份打开keil,添加mdk的Lisense
  6. 安装keil c51(如果想两者共存的话,安装顺序不能变)
  7. 管理员身份打开keil,添加c51的Lisense
  8. 注:keil5本身不兼容keil4,若想打开keil4的工程可以到官网下载补丁包
    stm32 GPIO

下载时总是弹出非正版警告"Error: Not a genuine ST Device! Abort connection."的解决方法
注意1:Keil.STM32F1xx_DFP.pdsc文件的目录可能有差异,我的在D:\Keil_v5\Packs\Keil\STM32F1xx_DFP\2.3.0
注意2:修改完D:\Keil_v5\Packs\Keil\STM32F1xx_DFP\2.3.0文件后需要重启keil

2.2 cubemx下载与安装

三、了解stm32

  • 什么是stm32

      STM32,是由意法半导体基于 ARM Cortex-M 研制和生产的一系列32位单片机,是众多采用ARM架构的MCU的其中一种。ST公司的MCU芯片便宜、面向散片销售市场、国内比较多。

  • stm32能做什么

      STM32 属于一个微控制器,自带了各种常用通信接口,比如 USART、I2C、 SPI 等,可接非常多的传感器,可以控制很多的设备。现实生活中,我们接触到的很多电器产品都有 STM32 的身影,比如智能手环,微型四轴飞行器,平衡车、移动 POST 机,智能电饭锅,3D 打印机等等。

  • stm32的标准库、hal库和ll库

      ST为开发者提供了非常方便的开发库。到目前为止,有标准外设库(STD库)、HAL(Hardware Abstraction Layer)库、LL(Low Layer)库 三种。

      其中标准库与HAL库最常用,LL库只是最近新添加的。

      标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的ST库,几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。

      HAL库与新增的LL库,都是ST公司提供的新标准库,包含在ST为新的标准库注册了一个新商标:STMCube™当中。LL库和HAL库两者相互独立,只不过LL库更底层。而且,部分HAL库会调用LL库(例如:USB驱动)。同样,LL库也会调用HAL库。

      可以说HAL库就是用来取代之前的标准外设库的。相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。HAL库是ST未来主推的库,从前年开始ST新出的芯片已经没有STD库了,比如F7系列。现在,ST主推HAL库,目前,HAL库已经支持STM32全线产品。

  • stm32不同型号的命名

    stm32 GPIO
    stm32 GPIO

四、GPIO讲解

4.0 STM32的GPIO结构图

stm32 GPIO

4.1 GPIO的4种输入工作模式

  结构图的上半部分为输入模式结构,分为上拉输入模式、下拉输入模式、浮空输入模式和模拟输入模式

  • 结构图的最右端是I/O引脚,左端的器件位于芯片内部。I/O引脚并联了两个用于保护的二极管。接下来是两个开关和电阻。与\(V_{DD}\)相连的是上拉电阻,与\(V_{SS}\)相连的是下拉电阻。再连接到TTL施密特触发器就把电压信号转化为0、1的数字信号并存储在输入数据寄存器(IDR)。我们可以通过设置配置寄存器(CRL、CRH)来控制这两个开关,于是就可以得到上拉输入模式和下拉输入模式。
  • 浮空输入模式在芯片内部既没有接上拉电阻也没有接下拉电阻,经由触发器输入。该模式下直接用电压表测量引脚电压为1点几伏,是一个不确定值。由于其输入阻抗较大,一般把这种模式用于标准的通信协议如IIC、USART的接收端。
  • 模拟输入模式则关闭了施密特触发器,不接上、下拉电阻,经由一线路把电压信号传递到片上的外设模块。如传送至ADC模块,由ADC采集电压信号。所以使用ADC外设的时候,必须设置为模拟输入模式。

4.2 GPIO的4种输出工作模式

  结构图的下半部分为输出模式结构,分为推挽输出模式、开漏输出模式、复用推挽输出模式、复用开漏输出模式

  • 线路经过一个由P-MOS管和N-MOS管组成的单元电路。推挽输出模式中,输出高电平时,P-MOS管导通;低电平时,N-MOS管导通。两个管子轮流导通,使其负载能力和开关速度相比普通方式有很大的提高。推挽输出低电平为0V,高电平为3.3V
  • 开漏输出模式中,输出逻辑0,则N-MOS激活,接地,输出低电平;输出逻辑1,端口处于高阻态(电阻非常大,但不是断路)(the P-MOS is never activated)。
    • 无外接上拉电阻:逻辑0时,N-MOS通,PIN直接接地(也有内阻),输出即为低电平; (与操作习惯相符,写0,输出0)。逻辑1时,高阻,输出也为低电平;(与操作习惯相悖,写1,输出0)。
    • 有外接电阻时:逻辑0时,N-MOS通,PIN在VCC和VSS之间,上拉电阻和内阻之间,输出也为低电平; (与操作习惯相符,写0,输出0)。逻辑1时,高阻,PIN得到的电压是分配在高阻上的电压,即输出为高电平;(与操作习惯相同,写1,输出1)。
    • 应用:输出比3.3更高的电平、“线与”特性
  • 对于相应的复用模式,则是根据GPIO的复用功能来选择的,如GPIO的引脚用作串口的输出,则使用复用推挽输出模式;如果用在IIC、SMBUS这些需要线与功能的复用场合,就使用复用开漏模式

4.3 相关函数

查找手册 《HAL APIs for STM32F1》

  • HAL API naming rules

    stm32 GPIO

  • HAL_GPIO_ReadPin

    • Function name GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)
    • Function description Reads the specified input port pin.
    • Parameters
      • GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
      • GPIO_Pin: specifies the port bit to read. This parameter can be GPIO_PIN_x where x can be (0..15).
    • Return values :The input port pin value.
  • HAL_GPIO_WritePin

    • Function name void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    • Function description Sets or clears the selected data port bit.
    • Parameters
      • GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
      • GPIO_Pin: specifies the port bit to be written. This parameter can be one of GPIO_PIN_x where x can be (0..15).
      • PinState: specifies the value to be written to the selected bit. This parameter can be one of the GPIO_PinState enum values:
        • GPIO_BIT_RESET: to clear the port pin
        • GPIO_BIT_SET: to set the port pin
    • Return values :None
    • Notes This function uses GPIOx_BSRR register to allow atomic read/modify accesses. In this way, there is no risk of an IRQ occurring between the read and the modify access.
  • HAL_GPIO_TogglePin

    • Function name void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
    • Function description Toggles the specified GPIO pin.
    • Parameters
      • GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
      • GPIO_Pin: Specifies the pins to be toggled.
    • Return values :None

五、点亮一个LED

  • 演示生成工程
  • 讲解cubemx生成代码的基本架构
  • 演示点亮一个LED
  • 讲解调试程序的方法

六、课后任务

  • 实现一个流水灯
  • 用按键控制LED
上一篇:海思Hi3559A GPIO操作


下一篇:九.GPIO中断试验2——通用中断服务程序构成