一、STM32 VS 智能家居

想来也很惭愧,STM32对于我来说很熟悉,但我却一直都没有掌握去使用它。我还在学校时就已经接触了STM32,那时候8051在教学中应用还很普遍,3C2440还没有停产,某什么之臂还很火;虽然我的专业是与嵌入式相关的,学过C语言,汇编语言,数字电路,模拟电路。可是遗憾的是这么多年过去了我仍然没有用STM32完完整整的做过一个项目。对软件的使用也仅次于点亮LED灯或实现按键按下检测,对串口的使用还停留在勉强可以发送…仍然记得上课那会,我们的老师陈援峰一边讲解一边用汇编语言写了一个实现实时温度显示的项目。杨伟军老师用STM32实现贪吃蛇的程序。那时候没有好好珍惜这些项目的过程,没有去好好的研究,想想就很遗憾。现在就业已久,目前也就职在一家智能家居企业,久了就知道嵌入式软件编程是有多么的重要。早期很多产品都是用ST系列的单片机,当然还有很多其它的比如NXP,新塘,爱特梅尔等。但是我接触大多数都是用ST的单片机,包括某为或某米的智能穿戴产品。虽然最近两年ST的单片机价格飙升,导致国内很多产品都转向国产化,但是众所周知国产话的东西大多数都是copy过来的。家电行业注重成本,价格还没上涨之时用的是ST的单片机,上涨之后改用其它产品,比如韩国的现代,珠海极海,赛普拉斯等,这些替代ST的产品中有些与ST是完全一样的比如极海的单片机。对掌握STM32应用的想法我有过还多个开始,但是很快就结束了,有个说法叫做“开始即结束”之于我再合适不过。缺乏持之以恒的学习态度,想到这里我就很恨自己。有时候衡量重新学还来不来得及,很想就放弃嵌入式软件开发的学习,可是想想上次算命先生说我能活到70岁,想来还有那么多时间,同时也想做点自己想做的东西,比如在家里实现一些自动化,在工作上不想被淘汰多一个选择或在调试项目时不被随意被人坑了。

二、对STM32的掌握情况

如上所述,对STM32的应用掌握仅次于点亮LED等和检测按键输入或串口勉强通信。没有项目经验和逻辑编写经验,甚至不知道怎么去实现一些简单的逻辑,比如按键长按,短按,双按;按键与led等实现检测到按键按下后常亮,检测到按键长按后闪烁等。对STM32从零开始建工程文档有所了解,如果时库函数的话建工程比较复杂,往往是在一个模板工程上编译成功的前提下开始编写自己的代码。如果是用cubeMX就相对比较简单,图形话的交流界面,大大简化了工程的复杂度。

2.1 STM32启动方式

智能家居代码编程报告 智能家居系统编程_单片机

有3中启动方式,分别是主闪存存储器、系统存储器、内置SRAM。一般我们常采用第一种启动模式即主闪存存储器启动,硬件上要把BOOT0用一个电阻接地。系统储存器启动和内置SRAM启动我见的比较少。主闪存存储器启动的地址是从0x08000000开始的,所以当我们使用“STM32 ST-LINK Utility”下载固件的时memory display那一栏就会显示这个地址:

智能家居代码编程报告 智能家居系统编程_stm32_02

2.2 IO口的输入输出模式

STM32的IO口输入输出模式各有4种,其中输出模式包括:

“开漏输出”

“推挽输出”

“复用开漏输出”

“复用推挽输出”

如何去理解这些输出,我个人的理解是:开漏输出和推挽输出主要是针对普通IO功能,复用开漏输出与复用推挽输出主要是针对IO口用于其它功能配置,例如串口功能,SPI功能,IIC功能,TIMER功能等。开漏输出与推挽输出在CubeMX上也有分带上下拉电阻或不带上下拉电阻。也就是芯片内部会集成上下拉电阻,通过读写寄存器来控制输出是否带上下拉电阻。这个在实际应用中我遇到过的是体现在一些需要带上拉或下拉时外部硬件没有上下拉电阻。

输入模式包括:

浮空输入

模拟输入

上拉输入

下拉输入

其中单片机复位后默认时浮空输入的。下面时不同的IO口功能需要配置的输入输出模式:

智能家居代码编程报告 智能家居系统编程_下拉电阻_03

智能家居代码编程报告 智能家居系统编程_单片机_04

智能家居代码编程报告 智能家居系统编程_智能家居代码编程报告_05

智能家居代码编程报告 智能家居系统编程_智能家居代码编程报告_06

智能家居代码编程报告 智能家居系统编程_智能家居代码编程报告_07

在我们做产品的时候,有些产品要求过“一级能效”。按照国家标准被测产品进入待机状态下要求能效不大于2W,一般时间是半小时的平均能效。而一块板子上往往单片机是比较吃电流的器件,我有测过在所有外设都正常关闭下,单片机没有进入低功耗模式电流需要十几个mA。所以在待机并且单片机又不能进入睡眠状态下(一般智能家居都需要无线模块,并且配对后需要一直通信确认设备是否在线,如果不在线就意味着故障),我们需要把IO口设置成模拟输出模式,因为模拟输出模式是呈高阻态的,这样最不耗电。

智能家居代码编程报告 智能家居系统编程_arm_08

智能家居代码编程报告 智能家居系统编程_stm32_09