为什么开始考虑搞嵌入式开发?
近5年来,从云计算、大数据到机器学习、AI,各种新潮的技术概念一波~~接一波。
作为一名好奇心旺盛的软件程序员,每一个技术概念流行起来都会去凑凑热闹。
但,在我的技术栈里,一切开发出来的软件都需要通过PC、手机才能进行人机交互。
怎么破?搞嵌入式开发!
好几年前,一个在搞嵌入式开发的朋友,给我安利了嵌入式开发的知识,由于一直在忙于工作,没有真正的认真接触,直到今年,自己创业,才认真考虑嵌入式是否能够为自己带来新的机遇?
选择STM32
刚开始,我的朋友推荐了树莓派作为我入门的开发板。
树莓派,可以安装操作系统,价格适中,功能完善,几乎就是一台低性能的小电脑,用于熟悉各种引脚功能、把玩常用传感器设备非常方便,还可以非常廉价的搭建Linux操作系统,很适合编程初学者搭建Linux开发环境。
但是它并不能学习到真正的嵌入式开发的知识。相对PC来说,它非常便宜,但是做嵌入式产品,它的功耗、体积和价格都太高。
向朋友请教后,决定选择一款真正的单片机开发板来学习嵌入式开发。
在网上查找资料,了解到目前流行的单片机有
- 51系列:经典,有很多书籍和课程都是围绕51系列写的
- AVR:Atmel公司的新型单片机,据说是用来替代51的
- STM32/STM8:ST公司的ARM内核的单片机
- STC51:国产,深圳宏晶公司的产品,据说是AVR和51的结合体
其中我选择了STM32。原因如下:
- 在技术论坛上看到,51虽然经典,但是确实是有点过时了,技术指标和功能都比不上STM32
- STM32性价比高,功能多,但是价格却依然很便宜,最小系统板相比其他单片机板子比都是很便宜的。
- 资料足够多。不过也看到有人诟病资料太复杂,因为STM32提供的功能确实多,学习的内容自然就多了很多,比如时钟就有5个,比51复杂点。
- 完善的IDE和库。到目前为止,这是我认为STM32最方便的地方,也是真正能够零基础入门的原因。官方提供基于Eclipse的IDE、HAL硬件抽象库(C语言),在完全没学过单片机原理的前提下,稍微看看HAL库,就能做一些简单的小实验。(要知道,大多数51单片机教程里,是要先学习一点寄存器知识以及汇编语言知识才能真正动手的)。
- 大部分单片机的开发环境在windows下很方便,但是在OSX下很少有好用的IDE和调试软件,但是ST官方就提供了跨平台的 all-in-one 开发工具。
动手
访问ST公司的官方网站。https://www.st.com
顺便说一下,单片机的更新速度没有软件领域那么快,因此网上的技术资料没有软件方面的多,并且更新速度也不及时,但是碰巧ST公司这两年更新了很多内容,比如STM32CubeMX、STM32CubeProgrammer、STM32CubeIDE的介绍就比较少,ST公司还封装了HAL库(硬件抽象库),把寄存器的操作都封装成了容易使用的函数,所以建议大家尽量通过官方网站查阅资料。
可以看到,ST公司有很多产品,32位微处理器只是其中一项。STM32即ST公司的32-bit的微处理器(Microprocessor)。
第一步 下载IDE
在ST官网上方搜索框直接搜索stm32cubeIDE
STM32CubeIDE is an all-in-one multi-OS development tool, which is part of the STM32Cube software ecosystem.
STM32CubeIDE 基于ECLIPSE™/CDT的多功能的跨平台开发工具,它属于STM32Cube软件体系的一部分。
在学习阶段,只需要使用STM32CubeIDE 就足够了,它包含了配置工具和调试工具。
第二步 选择一款开发板
和软件开发不同,除了一台电脑,我们还需要购买单片机。但是一块单片机是不能直接用来学习的,我们需要购买一块具有一些简单功能并且引出引脚的单片机开发板。
万能的某宝上直接搜索STM32开发板
就可以看到很多不同型号和价格的开发板,接下来如何选择呢?
单片机本身的价格很便宜,几块到十几块而已,但是开发板的价格差距就很大了,几块到几十块甚至几百块的都有。价格差异主要是开发板的外设功能不同,有很多板子做了很多接口,因此价格也高,但是我们在入门学习并不一定用得到,作为入门,我选择的是最小系统板。
最小系统板,就是只包含一些基本的接口,引出引脚,体积小,价格便宜。
但是最小系统板也有好几款,它们的区别主要在于STM32微处理器的型号。
看看官网的图
从图上可以看出,ST公司根据性能、用途把处理器分成了很多型号,其中F0和F1系列是比较适合入门学习的,这也是为什么某宝上搜索STM32开发板 F0和F1比较多的原因,其中F103C8T6这个型号是最多的,因为它的性能和功能足够丰富,完全满足用于学习,其中一款代号“BluePill”的开发板很好用,价格也便宜。
BluePill开发板长这样,对比着买吧,价格大概在12-22不等(新手建议买焊接好针脚的):
买买买,建议买2-3块,根据我的经验,有很小的几率买到有问题的板子,有2-3块板子,如果发现有什么疑问,可以换着试试,检查一下是自己的问题还是板子的问题,而且作为新手,手上有两三块备用板子,可以放心大胆的玩,不怕玩坏,学习起来更有效率。
第三步 购买配件
除了开发板,我们还需要采购一些设备才能进行调试和开发。我学习的时候完全不懂,身边也没人指导,买来一块板子就懵逼了,怎么用,然后一点一点的配齐配件才能动手做实验。
必要配件:
- 烧写程序的ST-Link V2 :写好的程序安装进单片机的工具
- 面包板:方便接电路做实验
- 杜邦线:接电路必备,公公、公母、母母,都买点
- mini USB电源和线(一般安卓手机充电器和线就可以)
可选配件(初学者不一定会用到,但是想深入,迟早需要用到):
- 各种传感器:除了控制开发板的小灯外,如果能利用传感器做实验是很有意思的事情。
- 发光二极管:和传感器功能差不多,都是为了方便做实验。
- 电阻:很多发光二极管的额定电压电流很低,需要组合电阻
- USB TTL 转接:另一种烧写程序的方式,另外,在电脑上做串口调试的时候会用到
- 锡焊设备
第四步 编写程序
设备都配置齐全后,就可以开始第一个小实验了。
以BluePill开发板为例,首先接好ST-Link V2,接法很简单,开发板上的TX接ST-Link上的RX、开发板上的RX接ST-Link上的TX,开发板的Gnd与ST-Link的Gnd想接,Vcc与Vcc相接,然后插在电脑的USB口上。
打开STM32CubeIDE,新建一个工程,导航上会出现一些配置选项。
Eclipse的部分就不赘述了,主要说说STM32库的选择。
不同型号的处理器,库和配置是不同的,因此,新建项目之前,STM32CubeIDE会要求选择单片机型号,在搜索框中输入对应的单片机型号,然后在列表里选择确定。
之后,IDE就会用对应的库初始化项目。
项目创建完成后,在左侧文件窗口点开 .ioc文件
这个文件非常重要,在ST公司推出CubeMX之前,做初始化是很麻烦的事情,用任何引脚、配置时钟、中断使能、串口配置等都需要编写初始化代码。现在,CubeMX把这些工作都做成了可视化配置,并且CubeIDE里集成了CubeMX的这个功能。
通过可视化的配置,STM32CubeIDE生成了标准的初始化代码,类似下图
在生成的main.c文件中,可以看到很多注释。要注意,这些注释可不是多余的,都很有用。为什么呢?因为,修改.ioc文件会提示是否重新生成main.c文件,一般情况下肯定是需要重新生成的,不然修改的配置不会生效,那么之前如果已经在main.c写的代码怎么办?会被覆盖掉吗?会,除非,你的代码是写在
/* USER CODE BEGIN xxxxx */
/* USER CODE END xxxxxx */
之间,所有不在类似 USER CODE BEGIN 和END 之间的代码,都会被覆盖掉。
STM32CubeIDE生成的main.c留出了很多写用户代码的位置,并且通过注释引导你写在正确的位置。
接下来写一个简单的试验性代码,让BluePill上的PinC13的灯闪起来
首先在打开ioc文件,配置pc13为输出引脚
保存配置重新生成main.c文件
然后在主循环while中添加代码,
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//设置C组13引脚为低电平
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
//延时200ms
HAL_Delay(200);
//设置C组13引脚为高电平
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
//延时200ms
HAL_Delay(200);
}
/* USER CODE END 3 */
OK,一个简单的闪灯程序就完成了。
第五步 烧写程序调试
还记得之前让用ST-link接入,并插在电脑上吗?马上要用到它了。
打开Debug配置
刚才介绍的是SWD的接线方式,所以这里选择SWD接口
接线正常的情况下,点击Debug按钮,程序就能自动烧写到开发板的单片机里并运行了。
这时候,你应该能够看到BluePill上的小绿等快速的闪烁。
到这里,就差不多介绍完了,但是单片机的知识面非常庞杂,相比起来,本篇文章十分粗浅,冰山一角,我只是从一个软件程序员的角度去介绍它,想通过本文让想学习STM32单片机开发的新同学看到一个相对完整的从0到第一个闪灯实验的过程,依此概览单片机学习和开发的轮廓。
单片机的开发需要耐心的学习很多基础知识,有兴趣的同学可以留言一起学习!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。