基于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的单片机开发环境配置
- 从keil官网下载软件安装包
- 下载器件支持包Software Packs
- 准备注册机
- 安装keil mdk
- 管理员身份打开keil,添加mdk的Lisense
- 安装keil c51(如果想两者共存的话,安装顺序不能变)
- 管理员身份打开keil,添加c51的Lisense
- 注:keil5本身不兼容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不同型号的命名
四、GPIO讲解
4.0 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
-
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