第4章 单片机开发
嵌入式技术是整个物联网系统的关键核心技术之一。它相当于感知层大脑的,将感知层的传感器部分统一起来,实现具体的功能,是整个物联网的底层基础部分。
嵌入式的开发,最核心部分是芯片的开发。目前嵌入式开发主要有单片机、嵌入式linux等。其中单片机以其功能强大、性价比高,在物联网这一行业中占据了大半江山。
4.1 初识STM32F407芯片
本节介绍单片机和STM32F407芯片。
4.1.1 单片机介绍
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
本书选用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.2 搭建开发环境
开发环境主要分为硬件平台 和 软件开发环境两部分。
4.2.1 硬件平台
开发STM32F407,我们需要准备如下硬件平台:
- windows 电脑一台,配置推荐i5或者i5 以上。
- STM32F407ZTG6开发板一个。本书所有的代码将在STM32F407开发板上运行。
- J-LINK一个。主要用于下载程序使用。
- 路由器一个、网线两根。后面网络通信实验需要用到。
- 电源线,串口各一个,提供供电、串口调试。
图4.2 硬件平台
4.2.2 软件开发环境
(1) 电脑操作系统:windows
(2) keil MDK软件。用于代码编写,编译,下载,仿真调试等。
(3) jlink驱动。用于安装jlink驱动时使用,以便jlink能正常工作。
(4) 电脑串口调试软件。
(5) TCPUDP测试工具。用于网络通信调试使用。
以上开发软件的下载可以见附录资料部分,会提供本书所有使用到的软件。方便读者安装到自己的电脑上。
4.2.3 Keil MDK 软件的安装
Keil MDK,也称MDK-ARM、Realview MDK、I-MDK、uVision4 等。Keil MDK是由三家国内代理商提供技术支持和相关服务。
MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。它提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。
(1)下载
keil MDK 的下载可以到官网:http://www2.keil.com/mdk5/ 。目前 keil MDK 是要收费的,读者也可以去网上找下其他版本。
(2)安装
下载后,我们会得到一个mdk514.exe 的可执行文件,其中514 是版本号。双击运行,然后出现如下画面,点击Next>>
图4.3 安装引导界面
进入用户协议部分,把I agree to all the.... 勾选上,选择 Next>>
图4.4 用户协议界面
这里选择好软件的安装路径,点击Next>>
图4.5 安装路径选择界面
这里输入用户信息,包含用户姓名,邮箱等。
图4.6 用户信息界面
输入信息后,点击Next之后会进入安装界面,等待安装完成即可。
图4.7 安装过程界面
安装完成后,会弹出如下提示框,我们把Show Release Notes 不要勾选。点击Finish即可
图4.8 安装完成界面
安装完成后,我们找到安装路径G:\Keil_v5\UV4 点击 UV4.exe 运行即可。
图4.9 启动界面
4.2.4 Keil MDK 新建工程
安装完Keil MDK后,我们来新建我们的第一个工程。
(1)安装STM32F407 pack包。
点击下图红色框内的图标。
图4.10 主界面
选择File —— import,导入Keil.STM32F4xx_DFP.2.13.0.pack。该文件可以去官网下载,由于网速较慢,本书附录也会提供国内的下载链接。
图4.11 pack install窗口
选择打开即可。
图4.12 选择pack界面
(2)新建工程
点击 Project —— New uVision project
图4.13 新建工程界面
选择工程路径,然后输入文件名为demo01,点击保存。
图4.14 保存工程界面
弹出此界面,由于本书选择的开发板芯片型号是 STM32F407ZGT6,故而我们选择STMicrolectronics——STM32F407——STM32F407ZG——STM32F407ZGTx。读者需要根据自己的开发板芯片型号选择。
图4.15 芯片型号选择界面
之后弹出如下界面,我们直接选择OK即可。
图4.16 MRTE界面
至此,我们的工程创建完成。
4.2.4 J-LINK驱动安装
本书使用的仿真器是J-LINK,需要在电脑上安装J-LINK驱动。读者可以自己去网上下载相关驱动,也可以直接使用本书附录的驱动文件。
该驱动安装比较简单,点击运行Setup_JLinkARM_V434.exe后一路选择Next 即可安装完成。本书在此不做赘述,读者自行安装即可。
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标准外设库添加到工程中去。这里推荐读者直接使用附录已经添加好的工程文件。
4.3.4 代码分析
(1)工程文件结构
使用keil MDK的new project选项,打开LED demo代码的工程文件——01_demo.uvprojx
图4.18 LED工程代码
左边是工程的代码文件。
common —— 整个工程的公共代码部分,主要是实现delay函数等。
main —— 工程的main函数部分,程序启动后的入口函数。我们从main.c 文件开始分析。
startup_config —— 汇编启动代码部分,我们后续再讲解。
stm32f4_fwlib —— STM32F407的标准外设库文件部分。
user —— 用户编写的代码部分。
(2)main函数分析
打开main.c文件,可以看到如下代码内容:
图4.19 main.c文件
void delay(int ms) 函数:通过使用两个for循环,实现延时等待。
int main(void) 函数:程序启动后的入口函数,调用LED_Init()函数实现GPIO口的初始化。
之后进入 while 循环,调用GPIO_WriteBit 使引脚输出高低电平。
其中,GPIO_WriteBit 是STM32标准外设库里面的函数,其函数原型如下:
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
参数列表:
GPIO_TypeDef* GPIOx ——对应STM32F407的GPIO口分组,可填参数有GPIOA ~ GPIOG
uint16_t GPIO_Pin ——具体引脚编号,可填参数有GPIO_Pin_0 ~ GPIO_Pin_16。
BitAction BitVal ——控制引脚输出的状态,可填参数有Bit_SET 表示输出高电平,Bit_RESET 表示输出低电平。
(3)LED初始化部分
打开led.c文件,可以看到如下代码内容:
图4.20 led.c 文件
该文件直接使用STM32标准外设库的函数去初始化GPIO口。具体每一行代码如下:
GPIO_InitTypeDef GPIO_InitStructure; ——定义GPIO_InitTypeDef结构体的局部变量,用于后面的初始化GPIO引脚。
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOG, ENABLE);
——打开GPIOE、GPIOG时钟。
以下代码的含义是将GPIOE 这一组的 3、4引脚设置为 输出模式、推挽输出、100MHz速度、上拉输出。对应了STM32F407的GPIO口介绍 这一小节。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE, GPIO_Pin_3 | GPIO_Pin_4); ——使用STM32标准外设库函数,设置GPIOE这一组的 3、4 引脚输出高电平。
4.3.5 代码编译下载
(1)编译
点击下图红色框的build按钮,开始编译。
图4.21 编译代码
编译结束后,可以看到下面的Build Output输出信息,则表示编译成功。
图4.22 编译成功
(2)代码下载
代码下载需要使用j-link把开发板和电脑连接起来。之后点击keil MDK中的Options for Target按钮。
图4.23 Options for Target按钮
点击Debug,在下拉菜单中选择J-LINK/J-TRACE Cortex。之后点击右边的Setting按钮。
图4.24 Debug界面
弹出来的界面中,选择Flash Download,如果 Progamming algorithm内容是空的。则点击Add按钮。
图4.25 Flash Download界面
选择STM32F407xx Flash ,点击Add 即可。之后点击确认、OK,退出Options for Target回到keil MDK主界面。
点击红色框的download按钮即可下载程序到开发板运行。
图4.25 下载按钮
4.3.5 小节
本节通过使用LED灯的例子,讲解了STM32的GPIO口操作,同时介绍了STM32标准外设库文件的使用。让读者第一次接触STM32的代码开发,程序下载等操作。