STM32 物联网智能家居 (二)-开发环境及工程搭建(STM32CubeMX)
前面第一篇文章我们讲述了物联网智能家居项目的方案设计,从系统设计、硬件设计,再到软件设计。这篇文章我们具体会讲到整个项目需要哪些硬件模块、软件环境、搭建最小工程时用到STM32CubeMX的详细配置指导,以及最后用Keil 5工具进行编译工程的教学,这些都是这篇文章可以学到的。下面我们再来回顾一下整个方案,放到前面开宗明义。
一、回顾整体方案
首先是系统设计,整个系统的操作逻辑如下:
- 中控屏启动后,自动连接家里的路由器,在中控屏上显示出路由器的IP地址;
- 用户用手机上启动微信小程序,输入中控屏显示的IP,连接到家里的中控屏上;
- 用户在微信小程序里,点击图标控制家中的灯、风扇、空调、窗帘、除湿器等,并读取屋内温湿度;
- 并且中控屏每隔60s向微信小程序传输一次家中温度和湿度值进行更新;

下面是硬件设计的框图,以及具体要用到的外设:
我们用I2c通信控制OLED屏幕 显示字符,其中包括时间,温度,湿度,路由器Ip地址,控制信息等;用Usart控制Wifi模块ESP8266 和路由器、微信小程序进行信息交互;通过GPIO控制/读取温湿度传感器、风扇、LED等外设。除此之外,我们通过ST-LINK 或USB串口解决代码开发过程中遇到的问题等等。

在本项目中,软件设计可以分为6个子系统:
- 设备子系统:比如实现LED控制、风扇控制
- 显示子系统:在OLED上显示信息
- 输入子系统:可以接收按键数据、网络数据
- 网络子系统:负责网络连接、数据收发
- 字体子系统:获得字符的字库
- 业务子系统:起综合作用,根据输入值(网络数据),控制设备

为了使软件能够兼容更多的芯片、更多的操作系统,进行软硬件解耦,我们将软件进行了分层设计。
整个软件分为下面几层内容,Microcontroller、HAL、CAL、KAL和APPL层。
APPL层是最上层的应用层,与硬件和操作系统无关,专注于应用层的逻辑。KAL层是内核抽象层(Kernel Abstraction Layer),这一层可以将整个软件分为不同的操作系统平台,通过简单的切换,可以让系统跑在裸机、FreeRTOS或者RT-Thread上面。CAL层是芯片抽象层(Chip Abstraction Layer)这一层来区分不同的芯片,来解决移植到不同的问题。HAL层(Hardware Abstraction Layer)是硬件抽象层,是决定是调用Hal库、寄存器还是库函数来操作底层硬件。以上就是为本项目设计的分层架构的逻辑,借由此软件框架做到容易扩展、容易维护的目的。

二、环境及元器件准备
2.1 软件开发环境
1. 韦东山STM32F103-PRO全套开发板 (STM32F103ZET6)

2. STM32CubeMX
官网下载链接:STM32Cube初始化代码生成器
3. Keil 5
官网下载链接:Keil官网下载地址

4. ST-Link V2

2.2 元器件
名称 | 型号 | 样式 |
---|---|---|
Wifi模块 | ESP8266-01s | ![]() |
温湿度传感器 | DHT11 | ![]() |
OLED显示屏 | 0.96寸,白色显示,I2c通信 | ![]() |
电机 | L9110电机驱动风扇模块 | ![]() |
三、STM32CubeMX工程搭建
3.1 硬件概览
名称 | 端口 | GPIO输出 | 引脚模式 | 特性 | 备注 |
---|---|---|---|---|---|
INB | PC6 | High | Output Pushpull | Pull-up | 电机控制 |
INA | PE6 | High | Output Pushpull | Pull-up | 电机控制 |
K1 | PE14 | n/a | Input mode | n/a | 按键K1 |
K2 | PE15 | n/a | Input mode | n/a | 按键K2 |
WHITE | PF7 | High | Output Pushpull | Pull-up | LED白灯 |
BLUE | PF8 | High | Output Pushpull | Pull-up | LED蓝灯 |
GREEN | PF9 | High | Output Pushpull | Pull-up | LED绿灯 |
SCL | PF10 | High | Output Pushpull | Pull-up | I2c时钟线 |
SDA | PF11 | High | Output Pushpull | Pull-up | I2c数据线 |
USART1_TX | PA9 | n/a | Alternate Function Pushpull | n/a | USART1_TX |
USART1_RX | PA10 | n/a | Input mode | Pull-up | USART1_RX |
USART3_TX | PD8 | n/a | Alternate Function Pushpull | n/a | USART3_TX |
USART3_RX | PD9 | n/a | Input mode | Pull-up | USART3_RX |
3.2 创建工程
打开STM32CubdeMX,点击New Project创建新工程

选择 STM32F103 ZET6

3.3 系统配置
点击左侧System Core,选择RCC,将HSE和LSE都设置为Crystal/Ceramic Resonator(晶体/陶瓷振荡器)

点击SYS,选择Debug功能为JTAG(5 pins),跟板子调试口对应

3.4 USART串口配置
根据原理图,我们将USART1和USART3进行配置
选择左侧的Connecttivity选项,点击USART1,如下图所示,点击Mode开始配置

STM32对USART模块提供了下面的这些模式,根据需求选择相应模式,本项目选择的是异步模式Asynchronous。

下面我们来对USART进行配置,首先开发板上的串口对应的USART1串口,Mode配置为异步模式Asynchronous,STMCubeMX会自动分配引脚,目前分配的USART1_RX对于PA10,USART1_TX对于PA9,和我们开发板的引脚正好对应,如果不对应的话,可以根据芯片的data Sheet改成相应的引脚。
下面的参数配置Parameter Settings按照默认配置来,波特率为 115200 bit/s,这里确保主从机是一致的,才能通信成功,数据位 8,无校验位,停止位1,数据方向:Receive and Transmit,采样:16.

点击下方的GPIO Settings,可以看到为USART1自动分配的默认引脚

按照上面的配置过程,我们将USART1和USART3一起配置了。下面是配置完后GPIO选项下面的USART的配置:

3.5 PORT口配置
按照3.1的硬件概览进行PORT口配置:

3.6 时钟树配置
点击上方的Clock Configuration,开始配置时钟:

下面我们来看一下时钟树的结构,如下图所示

现在开始配置开发板相关的时钟频率,首先选择做左边的Input frequency,选择外部8M的晶振,选择HSE,选择PLLCLK,在HCLK处将时钟敲定为72MHz,即STM32F103可支持的最大时钟频率:

3.7 工程导出设置
如下图所示,设置工程:

代码生成设置

点击右上角,生成代码GENERATE CODE:

下面代码就生成完毕了,用Keil 5软件打开工程,进行编译:

四、工程编译
打开Keil 5,设置编译器:

下面进行编译,默认大家的Keil 5环境都是可以用的:

编译OK。

五、总结
至此,第二节STM32 物联网智能家居 (二)-开发环境及工程搭建(STM32CubeMX)就完成了,这里我们完成了软件环境的搭建,以及最小工程的设置,以及基本的外设硬件配置。后面就能够开始我们软件各子系统程序的编写了。
六、往期文章
STM32 物联网智能家居 (一) 方案设计STM32+ESP8266+TCP/UDP/MQTT
STM32 BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建
STM32 BootLoader 刷新项目 (二) 方案介绍
STM32 BootLoader 刷新项目 (三) 程序框架搭建及刷新演示
STM32 BootLoader 刷新项目 (四) 通信协议