嵌入式技术是整个物联网系统的关键核心技术之一。它相当于感知层大脑的,将感知层的传感器部分统一起来,实现具体的功能,是整个物联网的底层基础部分。
嵌入式的开发,最核心部分是芯片的开发。目前嵌入式开发主要有单片机、嵌入式linux等。其中单片机以其功能强大、性价比高,在物联网这一行业中占据了大半江山。
4.1 初识STM32F407芯片
本节介绍单片机和STM32F407芯片。
4.1.1 单片机介绍
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
4.1.2 STM32F407芯片
本书选用ST(意法半导体)推出的STM32F407系列芯片。它是ST(意法半导体)推出了以基于ARM Cortex™-M4为内核的高性能微控制器,其采用了90 纳米的NVM 工艺和ART(自适应实时存储器加速器,Adaptive Real-Time MemoryAccelerator™)。
根据市场相关统计,2017年STM32系列芯片出货为10亿颗。作为全球最大的半导体公司之一,ST拥有广泛的产品线,传感器、功率器件、汽车产品和嵌入式处理器解决方案,在物联网生态中起到重要作用。而其中MCU 是最重要的业务之一,官方数据显示,2017年,ST在通用微控制器市场份额约占据19%,公司拥有超过800款的STM32产品,超过50000个客户。
图4.1 STM32F407芯片
使用STM32F407作为开发主要是基于以下几点理由:
(1)性价比高。
STM32F407VET6型号单颗采购价为13元左右,批量价格会更低一点。
(2)市场大,开发资料多。
作为全球最受欢迎的芯片,目前市场上绝大部分公司都是基于STM32系列的芯片做开发,企业招聘也基本都要求会STM32。同时网上有很多成熟方案,相关论坛。
(3)性能强大。
STM32F407提供了工作频率为168 MHz的Cortex™-M4内核(具有浮点单元)的性能。从Flash存储器执行时,STM32F407/417能够提供210 DMIPS/566 CoreMark性能,并且利用意法半导体的ART加速器实现了FLASH零等待状态。DSP指令和浮点单元扩大了产品的应用范围。
(4)外设资源。丰富
2个USB OTG(其中一个支持HS)
音频:专用音频PLL和2个全双工I²S
通信接口多达15个(包括6个速度高达11.25 Mb/s的USART、3个速度高达45 Mb/s的SPI、3个I²C、2个CAN和1个SDIO)
模拟:2个12位DAC、3个速度为2.4 MSPS或7.2 MSPS(交错模式)的12位ADC
定时器多达17个:频率高达168 MHz的16和32位定时器
可以利用支持Compact Flash、SRAM、PSRAM、NOR和NAND存储器的灵活静态存储器控制器轻松扩展存储容量
基于模拟电子技术的真随机数发生器
4.3 GPIO口操作
在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CPU控制,有的需要CPU提供输入信号。对设备的控制,使用传统的串口或者并口就显得比较复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程I/O端口”,也就是GPIO。
4.3.1 LED硬件原理图
本章节将通过操作LED亮灭的方式,来实现对STM32F407的GPIO口操作。翻看开发板LED相关的硬件原理图,如图4.17所示。
图4.17 LED原理图
根据原理图以及LED灯的特性,我们可知:当LED0、LED1、LED2引脚输出低电平的时候,三个LED灯将会发光。反之输出高电平的时候,三个LED灯将熄灭。
而LED0、LED1、LED2三个引脚又分别对应到STM32F407芯片上的GPIOE_3、GPIOE_4、GPIOG_9。故而,LED的亮灭操作可以转化成STM32F407的引脚输出操作。
4.3.2 STM32F407的GPIO口介绍
(1)分组
STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口 通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。
(2)GPIO的复用
STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。 比如说串口 就是GPIO复用为串口
(3)GPIO的输入模式
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_AIN 模拟输入
(4)GPIO的输出模式
GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)
GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)
GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)
GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)
(4)GPIO的最大输出速度
2MHZ (低速)
25MHZ (中速)
50MHZ (快速)
100MHZ (高速)
4.3.3 STM32标准外设库
STM32标准外设库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。
因此,使用固态函数库可以大大减少开发者开发使用片内外设的时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。同时,STM32官方还给出了大量的示例代码以供学习。
STM32标准外设库可以到ST官网下载,也可以直接使用本书附录部分提供的下载好的STM32标准外设库。
使用keil MDK编写代码时,我们需要将STM32标准外设库添加到工程中去。这里推荐读者直接使用附录已经添加好的工程文件。