STM32F1 HAL库实战开发——【实验1 点亮LED实验】

2 篇文章 0 订阅
2 篇文章 1 订阅
这篇博客介绍了STM32F1系列单片机的HAL库实战开发,包括STM32F103xx的特性,HAL库的概念、发展趋势和特点,以及如何使用STM32CubeMX创建HAL库工程并配置GPIO。文中详细阐述了GPIO的工作模式、编程流程,并给出了LED的材料介绍。此外,还提到了Keil5软件的下载和STM32CubeMX的使用。
摘要由CSDN通过智能技术生成

STM32F1 HAL库实战开发

发表:人工智能技术应用协会


提示:这里是 STM32F1 HAL 库实战开发的实验案例之一


提示:以下是本篇文章正文内容,下面案例可供参考

1. STM32F103xx 系列单片机介绍

1.新的基于ARM内核的32位MCU系列
(1)标准的ARM架构
(2)内核为ARM公司为要求高性能、低成本、低功耗的嵌入式应用专门设计的Cortex-M内核
2.超前的体系结构
(1)高性能(2)低电压(3)低功耗(4)创新的内核以及外设
3.简单易用/自由/低风险
4.时钟、复位和电源管理:2.0-3.6V的电源供电和IO接口的驱动电压。POR、PDR和可编程的电压探测器(PVD)。4-16MHz的晶振。内嵌出厂前调校的8MHz RC振荡电路。内部40 kHz的RC振荡电路。用于CPU时钟的PLL。带校准用于RTC的32kHz的晶振。
5.低功耗:3种低功耗模式:休眠,停止,待机模式。为RTC和备份寄存器供电的VBAT。
6.调试模式:串行调试(SWD)和JTAG接口。
7.DMA:12通道DMA控制器。
8.支持的外设:定时器,ADC,DAC,SPI,IIC和UART。
9.2个12位的us级的AD转换器(16通道):AD测量范围:0-3.6 V。双采样和保持能力。片上集成一个温度传感器。
10.2通道12位DA转换器:STM32F103xC,STM32F103xD,STM32F103xE独有。
11.最多高达112个的快速IO端口:根据型号的不同,有26,37,51,80,和112的IO端口,所有的端口都可以映射到16个外部中断向量。除了模拟输入,所有的都可以接受5V以内的输入。
12.最多多达11个定时器:4个16位定时器,每个定时器有4个ICOCPWM或者脉冲计数器。2个16位的6通道高级控制定时器:最多6个通道可用于PWM输出。
13.2个看门狗定时器(独立看门狗和窗口看门狗)。
14.定时器:24位倒计数器。2个16位基本定时器用于驱动DAC。
15.最多多达13个通信接口:2个IIC接口(SMBusPMBus)。5个USART接口(ISO7816接口,LIN,IrDA兼容,调试控制)。3个SPI接口(18 Mbits),两个和IIS复用。CAN接口(2.0B)。USB 2.0全速接口。SDIO接口。


2. HAL 库介绍

(一) HAL 库是什么

在解释 HAL 库之前,我们先认识 STM32CubeMX(简称 CubeMX,下同)。它是ST官方推出的最新一种STM32设置和初始化C代码的生成器,界面见图1:
图1

STM32CubeMX 可以直观的选择 STM32 微控制器、配置微控制器、自动处理引脚冲突、动态设置确定时钟树、动态确定参数设置的外围和中间件模式和初始化。CubeMX 生成的代码可以在 KEIL、IAR、GCC 等编程软件上面使用。简单理解,就是 CubeMX 软件是一个工具软件,我们只要在上面简单的点点点就可以生成STM32 功能代码工程,这个代码工程已经包括了必要的外设初始化程序,这样节省我们的工作量,我们的工作重点放在项目任务的实现。CubeMX 的使用介绍将会在下一章节详细描述。HAL 的全称是:Hardware Abstraction Layer (硬件抽象层),它的存在是为了确保 STM32 系列最大的移植性。HAL 位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。与 STM32CubeMX 配合使用,ST 官方便推出了一个新的函数库,因为和 HAL 息息相关,在这里,我们便称为 HAL 库。
HAL 库是一个由 ST 官方基于硬件抽象层而设计的软件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间 API,通过使用 HAL 库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用 HAL 库可以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用 API (application programming interface 应用编程界面)驱动,API 对该驱动程序的结构,函数和参数名称都进行了标准化。

(二) HAL 库发展趋势

在 ST 官方的声明中,HAL 库是大势所趋,在 ST 公司最新开发的部分芯片中,只有 HAL 库而没有标准库,从这点便可以说明,以后的战略目标是逐渐的转向HAL 库 。相对于标准库来说,在使用 CubeMX 生成代码后,工程项目和初始化代码已经完成。简便了很多,而且最重要的是 ST 官方的大力推广,未来功能会更加的完善,CubeMX 功能示意参考图2。
图2 通过STM32CubeMX生成代码

(三)HAL 库特点

两种 API 类型(通用和扩展),API(应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组编程的能力,而又无需访问源码,或理解内部工作机制的细节。这段话理解比较难。一个简单的解释:简单来说,就是其他人开发出来一块程序,你想用,他会告诉你调用哪个函数,给这个函数传什么参数,然后又会返回给你一个什么样的结果,你不需要知道他函数里面到底是怎么做的,只要清楚这样调用就能实现某种功能就可以了。

(四)STM32CuBeMX 软件的安装与使用

Double Pi平台光盘资料的开发工具有STM32CuBeMX软件的安装与使用文档。


3. Keil5 软件下载方式

Double Pi平台光盘资料的开发工具有Keil5软件、Jlink驱动与USB驱动的安装包与文档。
安装完驱动就可以使用Jlink下载器下载编译好的HAL库工程了。


4. STM32CuBeMX 创建HAL库工程

(一) GPIO介绍

GPIO(General Purpose Input Output)通用输入输出,是 STM32 的一种外设,与大部分芯片引脚直接挂钩,STM32F103ZET6 芯片总共有 7 个 GPIO 外设,定义为 GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF 以及 GPIOG,每个 GPIO 外设有 16 个引脚,定义为 PA0…PA15、PB0…PB15 等等,总共有 112 个 GPIO 引脚。GPIO 最简单的功能是输出高低电平,GPIO 还可以被设置为输入功能,用于读取按键等输入信号。之前也介绍到,很多高级外设也有功能引脚,并且是与GPIO 共用的,具体引脚功能可以通过软件编程设置对应的寄存器内容实现的,STM32F10x 芯片 GPIO 的基本结构见图3:
图3 GPIO的基本结构
图中最右边的“I/O 引脚”就是芯片实物的引脚,焊接时用到。保护二极管用于防止因为引脚外部输入电压过高或过低烧坏芯片,虽然有保护作用,但这种保护也是有限的,大电流大电压还是很容易烧毁芯片的,这要求实际应用中我们要注意保护芯片,必要时设计引脚保护电路。
图中上半部分属于引脚输入功能,通过一个电阻和一个开关(可以通过寄存
器控制开关状态)可以把输入线拉高或者拉低,这个电阻阻值大概为 4.7K~10K 欧。做为普通的输入引脚,I/O 引脚的电平通过触发器后保存在输入数据寄存器内。
图中下半部分是引脚输出功能,通过一个 PMOS 管和一个 NMOS 管组合而
成一个反相器驱动输出。对于普通的引脚电平控制,根据需要设置置位或者复位
寄存器的值,这两个寄存器的值会改变输出数据寄存器值,通过输出控制电路驱
动反相器从而改变引脚的状态。
为实现不同工作条件要求,GPIO 有 8 种工作模式,通过配置 GPIOx_CRL 或GPIOx_CRH 寄存器可以非常方便控制,具体见图4:

图4 GPIO模式
(1)输入浮空
当 GPIOx_CRL 或 GPIOx_CRH 寄存器的 CNF[1:0]位设置为 01,并且MODE[1:0]位设置为 00 时,对应引脚被设置为浮空输入模式,该模式也是 STM32 复位之后默认模式。
(2)输入上拉模式
输入上拉模式就是在浮空输入模式基础上使能输入电路中的上拉开关,该开关由输出数据寄存器(GPIOx_ODR)引脚对应位设置为 1 来使能。
(3)输入下拉模式
输入下拉模式也是在浮空输入模式基础上使能了输入电路中的下拉开关,该开关由输出数据寄存器(GPIOx_ODR)引脚对应位设置为 0 来使能。
(4)模拟输入模式
当 STM32 需要进行 AD(模数)转换时,需要把引脚设置为模拟输入模式,该模式需要配合 ADC 外设使用,否则没有意义。
(5)开漏通用输出模式
通用输出模式就是做为普通用途的输出模式,比如简单地控制引脚输出高低电平。GPIO 的输出是由一个 PMOS 管和一个 NMOS 管组合形成的反相器驱动。
(6)推挽通用输出模式
推挽输出与开漏输出原理理解都是差不多的,不同的重点在于输出控制电路驱动反相器的不同,就是推挽输出把 PMOS 管和 NMOS 管都用上了,开漏输出只用了 NMOS 管,PMOS 管完全不用。
(7)推挽复用功能输出、模式
一个 I/O 引脚可以做为普通的 IO 接口,还可以做为其他外设的特殊功能引脚,有些引脚可能有4、5种不同功能,这种现象就叫做复用。
(8)开漏复用功能输出
是开漏通用输出模式与推挽复用功能输出模式的组合。

(二) STM32CubeMX 生成工程

STM32CubeMX 可以为我们提供很大的便利,配合 HAL 库使用可以提高工作效率,所以本文档在讲解每个例程之前都会介绍 CubeMX 软件的详细配置过程。
虽然 CubeMX 软件确实给我们提供很大的便利,当很大新手都不知道它大概能提供到什么程度。简单一句概括:提供外设初始化配置,不提供应用程序。显然我们实际用于工程不可能这么简单,肯定有自己的项目目标,比如让 LED 灯呈流水灯形式跑。。CubeMX 软件就是提供 PB0-PB7 八个引脚的初始化配置,我们刚好配置它们输出高电平,所以灯就亮了。至于要让 LED 灯跑流水灯就属于用户应用程序了,就需要我们自己实现了。
STM32CuBeMX配置STM32F103C8T6GPIO图5:

图5 STM32CuBeMX配置引脚
生成Keil5的HAL库项目文件在Double Pi平台光盘资料的开发工具中的STM32CuBeMX软件的安装与使用文档中有。
配置完GPIO设置,STM32CubeMX软件生成的gpio.c、gpio.h、usart.c、usart.h 等等文件。

(三) GPIO 外设结构体

HAL库为每个外设(GPIO除外)创建了两个结构体,一个是外设初始化结构体,一个是外设句柄结构体,其中 GPIO 没有句柄结构体。这两个结构体都是定义在外设对应的驱动头文件中,比如 stm32f1xx_hal_usart.h 文件。初始化结构一般是做为句柄结构体的一个成员通过指针被引用,而句柄结构体则在外设 HAL 函数库实现被使用,比如在 stm32f1xx_hal_usart.c 文件。这两个结构体内容几乎包括了外设的所有可选属性,理解这两个结构体内容对我们编程非常有帮助。
GPIO 外设只有一个初始化结构体,没有句柄结构体,所以 GPIO 初始化结构体直接在 stm32f1xx_hal_gpio.c 文件中与相关初始化函数配合使用完成 GPIO 外设初始化配置。HAL库GPIO结构体如图6:
在这里插入图片描述
Pin:引脚编号选择,一个 GPIO 外设有 16 个引脚可选,这里根据电路原理图选择目标引脚,参数可选:GPIO_PIN_0、…、GPIO_PIN_15 和 GPIO_PIN_ALL。很多时候我们可以使用或运算选择多个:GPIO_PIN_0|GPIO_PIN_4。
Mode:引脚工作模式选择,前面内容介绍了引脚有八种基本工作模式,选择结合到具体的外设可以有 13 种模式可选,GPIO引脚工作模式选择如图7:
在这里插入图片描述
Pull:上拉或者下拉选择,用于输入模式,可选:GPIO_NOPULL:不上下来;GPIO_PULLUP:使能上拉;GPIO_PULLDOWN:使能下拉。
Speed:引脚最大输出速度,可选:GPIO_SPEED_FREQ_LOW:低速(2MHz);中速(10MHz);高速(50MHz)。

(四) GPIO 编程流程分析

(1) 使能 GPIO 端口时钟;

	__HAL_RCC_GPIOB_CLK_ENABLE();

(2)初始化 GPIO 引脚,即为 GPIO 初始化结构体成员赋值,并调用HAL_GPIO_Init函数完成初始化配置;

GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
                        |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
   GPIO_InitStruct.Pull = GPIO_NOPULL;
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

(3)根据项目要求控制引脚输出高低电平。

HAL库对引脚操作的函数有:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)*@简介 读取指定的输入端口引脚。
*@参数GPIOx:其中x可以是(A-G,取决于使用的设备)来选择GPIO外围设备
*@参数GPIO_Pin:指定要读取的端口位。
*此参数可以是GPIO_PIN_x,其中x可以是(0..15)。
*@返回值 输入端口引脚值。
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
*@简介 设置或清除所选数据端口位。
*@注意:此函数使用GPIOx_BSRR寄存器允许原子读取/修改,这样,在读取和修改访问之间就不会出现IRQ风险。
*读取和修改访问。
*@参数GPIOx:其中x可以是(A-G,取决于使用的设备)来选择GPIO外围设备
*@参数GPIO_Pin:指定要写入的端口位。
*此参数可以是gpio_pin_x中的一个,其中x可以是(0..15)。
*@参数pinstate:指定要写入所选位的值。
*此参数可以是gpio\u pinstate枚举值之一:
*@arg GPIO_PIN_RESET:清除端口引脚
*@arg GPIO_PIN_SET:设置端口引脚
*@返回值 无
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)*@简介 反转指定的GPIO引脚状态
*@参数GPIOx:其中x可以是(A-G,取决于使用的设备)来选择GPIO外围设备
*@参数GPIO_Pin:指定要切换的管脚。
*@返回值 无

5. LED 材料介绍

LED(Light Emitting Diode),发光二极管,它是一种固态的半导体器件,可以直接把电转化为光。LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。半导体晶片由三部分组成,一部分是P型半导体,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子,中间通常是1至5个周期的量子阱。当电流通过导线作用于这个晶片的时候,电子和空穴就会被推向量子阱,在量子阱内电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED发光的原理。而光的波长也就是光的颜色,是由形成P-N结的材料决定的。


提示:本文章是在老师教材基础上作为小组学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有角的独角仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值