STM32 STM32F407 单片机
2.1 概述
STM32 Cube是一个全面的软件平台,包括ST产品的每个系列,(如 STM32Cube_F1 是针对STM32F1系列)。平台包括了STM32Cube 硬件抽象层( HAL)
和一套中间组件(RTOS,USB,FS,TCP等等)。
STM32Cube 是由ST公司原创倡议,旨在减少开发负担、时间和费用,为开
发者提供轻松的开发体验。STMCube 覆盖了STM32全系列。其中STM32CubeMX
是上位机配置软件,可以根据使用者的选择生成底层初始化代码。硬件抽象层
( HAL), 便是CubeMX配套的库,HAL库屏蔽了复杂的硬件寄存器操作,统一了外设的接口函数(包含 USB/以太网等复杂外设),代码结构强壮,已通过 CodeSonar 认证。 同时,HAL还集成了广泛的例程,可以运行在不同意法半导体的开发板上。
星光闪电F407开发板,采用Cube平台中的固件库开发,固件库称之为Cube库,也有称之为HAL库,开发板基本上涵盖了STM32F407的所有外设使用,带你玩转STM32F407的嵌入式开发。
2.2 Cube库(HAL库)简介
2.2.1 STM32软件编程
相信会来阅读本文的同学都大概知道 STM32 微控制器是什么东西, 本文开发板采用的是 STM32F407ZGT6 芯片。 微控制器最简单功能莫过于控制特定引脚输出高低电平,那好了,现在我们就是要控制一个引脚,比如 PA0, 输出高电平,要怎么办呢? 编写程序,然后编译程序并下载到开发板运行就可以了。 STM32 编程方法有很多中, 我们一般选择 C 语言来编程, 软件一般使用 Keil或者IAR。 ST 官方为广大使用者方便编程已经提供了与硬件底层相关的C语言文件,节省了我们很多时间,我们重点是学习如何使用。
STM32的C 语言编程可以是直接寄存器编程、标准固件库编程以及新推出
的 HAL 库编程。直接寄存器编程是直接操作寄存器方法,比如语句: GPIOB->BSRR=0x0001;
就是让PB0引脚输出高电平, 这里0x0001对应 PB0 这个引脚, 0x0002 对应 PB1 引脚, 0x0003 对应 PB0 和 PB1 两个引脚, 以此类推。至于 GPIOB 和 BSRR 是什么东西, 如果要展开讲有太多了,简单讲就是 ST 官方已经为我们定义好的东西,我们直接用就好了, 实际上我们在后面章节会详细展开讲解 GPIOB 和 BSRR这类东西。
为了使编程简单化、人性化,ST官方把上面直接操作寄存器语句进行函数格
式化封装, 形成了关于 STM32 编程的一个软件函数库,就是目前还流行的标准固件库。使用如下语句,就可以控制 PB0 引脚输出高电平:
GPIO_SetBits(GPIOB, GPIO_Pin_0);
标准库自出道超过10年以来受广大使用者推崇, 就是现在还有大部分工程
师、公司都在使用。不过,现实情况有点残酷, ST官方已经不再更新 STM32 标
准固件库, STM32F4系列标准固件库在2013年后没有正式发布更新版本,所以
现在都停留在 V3.5.0 版本。 现在 ST 官方全力推新的软件编程库: HAL 库, 现在使用HAL库实现PB0输出高电平编程如下:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
好吧,单单从上面语句完全看不出 HAL 库有什么优势, 还是那句话好东西谁
用谁知道,总体来说 HAL 库还是比较人性化的,并且配合 STM32CubeMX 软件使用可以简化编程。 关于STM32CubeMX的使用请参看STM32CubeMX使用手册。
2.2.2 什么是Cube库(HAL库)
HAL的全称是:Hardware Abstraction Layer (硬件抽象层),它的存在是为了确保 STM32 系列最大的移植性。HAL 位于操作系统内核与硬件威廉希尔官方网站
之间的接口层,其目的在于将硬件抽象化。 与STM32CubeMX配合使用,ST官方便推出了一个新的函数库,这里我们称之为Cube库,也称之为HAL库。
HAL 库是一个由 ST 官方基于硬件抽象层而设计的软件函数包,它由程序、
数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一
个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间 API,通
过使用 HAL 库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外
设。因此,使用 HAL 库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的
开发都由一个通用 API (application programming interface 应用编程界面)驱动,API 对该驱动程序的结构,函数和参数名称都进行了标准化。
2.2.3 Cube库(HAL库)的特点
两种API类型(通用和扩展),API(应用程序编程接口)是一些预先定义的函数, 目的是提供应用程序与开发人员基于某软件或硬件得以访问一组编程的能力,而又无需访问源码,或理解内部工作机制的细节。 这段话理解比较难。一个简单的解释: 简单来说,就是其他人开发出来一块程序,你想用,他会告诉你调用哪个函数,给这个函数传什么参数,然后又会返回给你一个什么样的结果,你不需要知道他函数里面到底是怎么做的,只要清楚这样调用就能实现某种功能就可以了。 或者说更简单的: 比如别人已经做好了一块几何处理程序,你想拿来算圆的面积,他会告诉你把半径传给他,他就把面积值传给你,至于他里面是怎么算的不用你管。 HAL 的通用 API 为程序的模块化设计带来便利, 比如时钟和外设的初始化。而扩展 API 则兼顾 STM32 各系列产品的特有功能和扩展性能,提高 HAL驱动的扩展性。
Cube库有三种编程模型: 轮询、中断和DMA。以 ADC 函数作为例子。
图2.2.3.1
灵活的回调机制, STM32CubeMX 生成的工程具有回调机制,这也是 ST 官方推出 HAL 库的一个特点。回调函数由外设初始化、中断事件、处理完成/出错触发回调。 如图所示,此时,我们只需关心如何处理中断和异常。
图2.2.3.2
更多回帖