yann-qu

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

基于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官网下载软件安装包
    keil官网首页
    分别进入c51和mdkarm下载页面
    分别下载安装包
  2. 下载器件支持包Software Packs
    进入arm开发工具页面
    进入software_package页面
    搜索芯片对应包并下载
  3. 准备注册机
  4. 安装keil mdk
  5. 管理员身份打开keil,添加mdk的Lisense
  6. 安装keil c51(如果想两者共存的话,安装顺序不能变)
  7. 管理员身份打开keil,添加c51的Lisense
  8. 注:keil5本身不兼容keil4,若想打开keil4的工程可以到官网下载补丁包
    兼容keil4的补丁包

下载时总是弹出非正版警告"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命名举例
    stm32命名规则

四、GPIO讲解

4.0 STM32的GPIO结构图

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

    HAL-API-naming-rules

  • 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
posted on 2021-12-11 13:46  yann-qu  阅读(159)  评论(0编辑  收藏  举报