对于完全没接触过单片机的robomaster电控新人,在初期的学习中往往是痛苦不已,对于一些嵌入式的相关概念也比较模糊,那笔者也根据自己的经历,给大家梳理一下一些基础概念,让大家能更快地掌握电控的学习方法,鉴于笔者能力有限,难免有疏漏之处,欢迎大家在评论区与笔者讨论指正。
单片机一词是很多年前的概念了,其对应的英文是“Single Chip Microcomputer”,但是大家听到的更多的是MCU(micro control uint) 微型控制单元,是因为在过去半导体工艺发展起步阶段,一个完整的计算机系统是由多个芯片在一个PCB板上,当时出现了在一种芯片上集成了CPU、SRAM、Flash等模块的微型计算机系统称为单片机。但是随着半导体技术的发展,几乎现在所有买到的都是单片机,不存在分离式的”多片机“。而现在流行的MCU叫法,突出了单片机两个特点:一个是微型的芯片级计算机,另一个就是擅长控制,而不是DSP(擅长运算)。
再谈谈STM32,从字面上来理解,ST是意法半导体公司,M是Microelectronics,32代表32位,合起来STM32就指ST公司开发的32位微型控制器,其实在大学生眼中,STM32单片机常常与51单片机进行比较,51单片机作为入门级的经典MCU,是传统的8位单片机,其结构简单,易于教学,而且不需要额外的仿真器只需通过串口就可以实现下载编程。但是毕竟51单片机资源有限,性能跟不上需求,在这样的情景下,ST(意法半导体)公司推出了极高性价比,拥有简单易用的库开发方式的STM32。STM32属于一个微控制器,自带了许多常用的通信接口,比如USART,IIC,SPI等,可以接许多传感器,也就能控制许多设备。像大学生比赛中常见的四轴飞行器、物流小车、平衡车,再到日常生活中常见的扫地机器人、智能手环等都有STM32的身影。
STM32是一个相当大的家族,有许多的系列以满足不同的需求。
那我们目前主流用的一般有两种系列,F1系列与F4系列,如果是普通应用,无需外接RGB屏幕可以选择F1系列;如果是追求高性能,数据运算量比较大,或是需要外接屏幕的,可以选择主频更高的F4系列,像Robomaster比赛中常用的A板和C板都是F4的开发板,而B板则是F1系列。
那么说到底STM32也只是一块芯片,但我们平时拿在手里开发的俗称“板子”的东西,正规一点的称呼叫开发板,开发板将芯片中的引脚引出来,连接到各种传感器上,然后通过程序控制这些引脚输出高电平或者低电平来控制各种传感器工作。开发板是一种评估板,板载资源非常丰富,引脚复用也比较多,力求在一个板子上验证芯片的全部功能。
Robomaster A板 Robomaster B板 Robomaster C板
下面我以A板为例,介绍一下开发板的组成。将A板的保护海绵揭开,可以看到A板的芯片STM32F427IIH6(左图)
芯片的正面是丝印,ARM表示芯片使用的是ARM公司的内核,STM32F427IIH6是芯片型号,后面的字应该是与芯片的生产批次有关,最下面是ST公司的logo。芯片的四周是引脚(这张图片看的不是很清楚,我在右侧放了一张STM32F429IGT6的芯片,可以很清楚的看到四周的引脚)。芯片的左下角有个小圆点表示是1脚,然后引脚从1脚逆时针的顺序排列(这是所有芯片的引脚排列顺序)。
可以看出A板的芯片型号是STM32F427IIH6,那这个型号有什么含义,我在这里简单介绍一下STM32的命名规则 那么从表解读看,A板的芯片STM32F427IIH6的含义是:32位的MCU,基础型,(427这里没解释,可以近似看作407的升级版),176引脚,2048k 的flash容量,LFBGA封装,温度范围从-40°到+85°。这些东西我们不需要刻意去记,但是了解他们的命名规则可以在看到芯片型号就能大概掌握其基础信息。A板、B板和C板的芯片型号在开发板用户手册都能查到。
这份表格摘自A板的开发板用户手册。可以看出A板的外设接口非常丰富,3.3V~24V电源的输出,2路CAN,4路串口(除开DBUS),8路PWM,18个用户自订GPIO,自订按键等,是一款非常强劲的开发板。在以后的文章中,我也会逐步介绍这其中的一些功能。
说完了硬件部分,我们再来讲一下程序开发。那单片机的程序开发工具我们常常使用的是Keil MDK 5 和STM32CubeMX,Keil是美国Keil软件公司(现已被ARM公司收购)出品的支持ARM微控制器的一款IDE。 IDE的全称是集成开发环境(Integrated Development Environment),简单的来说IDE相当于编辑器+编译器+连接器+其他组件,可以无需借助其他软件就可以实现完整的程序开发。也就是说我们用keil这一款软件就可以实现代码编写、代码编译、程序烧录、程序调试的功能。那既然有了keil我为什么还要提STM32CubeMX这一款软件呢?这就不得不谈到STM32的主流开发方式了。
STM32的主流开发方式包括寄存器开发和固件库开发,其中固件库开发包括标准库开发和HAL库开发。寄存器开发是非常底层的开发方式:即直接通过操控寄存器来实现功能。这样的好处是工程运行效率高,但开发难度较大,可读性和可移植性差。当工程比较简单时,可移植性可能不能给你带来很直观的感觉。一旦工程量庞大起来,可移植性往往是最优先考虑的。那么固件库开发就是将一系列的寄存器操作进行封装,降低了开发的难度,提高了程序的可读性和可移植性。然后就是固件库开发中的标准库开发和HAL库开发。标准库开发用的是标准库函数,HAL库开发用的是HAL库函数。既然都是库函数,那何必要封装成两个库呢?实际上,HAL库是配合支持ST开发的一款图形化工程配置软件STM32CubeMX一起使用的。
图形化工程配置,就是根据自己对硬件外设需求(这里的外设指的是芯片上的外设,简称片上外设,像以后的文章中会讲到的GPIO、USART、IIC、SPI等都是外设),通过一些选项的勾选,像填表一样告诉软件你的需求,然后软件会根据你的需要自动写好底层的配置代码。可能大家会不太好理解为什么外设要配置底层代码。实际上,在图形化配置工程出现之前,单片机开发要复杂许多,之前配置一个外设,需要查看芯片手册,看哪些资源在什么引脚上,要考虑引脚复用问题,时钟线配置问题等等。现在有了图形化配置工具cubemx,虽然不是说可以完全抛弃手册随手编程,但是配置的流程大大简化也不易出错。而STM32CubeMX是ST公司近几年极力推荐的程序生成开发工具,所以在这几年新推出的STM32芯片,ST公司干脆直提供HAL库,但是毕竟都是封装好的固件库函数,所以学了HAL库函数之后,阅读标准库函数也不会存在很大障碍,所以大家也不用太过于纠结学那种开发方式,只要理解了STM32的本质,任何库都只是一种工具。当然个人建议还是先从HAL库开始学起,对整个单片机开发之后再从寄存器层面思考单片机开发。
考虑到网上有丰富完整的keil以及stm32cubemx的安装教程,我这里就不再赘述。还是从使用层面给大家介绍一下两个软件的一些常见的使用方法。
打开KEIL的一个工程,我想重点讲一下红圈部分的功能,其余未标出的要么是太常规像保存、新建、打开等。要么是在日常使用过程中不常用的功能。
编译类按钮,使用频率非常高,从左到右依次是:
编译当前文件
编译修改过的文件
编译所有文件
编译多个工程文件
停止编译(未编译时是灰色)
下载
编辑跳转类,从左到右依次是:
撤销 ctrl+Z
重做 ctrl+Y
光标移到上一次位置
光标移到下一次位置(配合上一个按钮使用)
注释所选代码
取消注释所选代码
进入调试(debug)模式
在进入调试模式下,keil的界面会有较大变化,主要是调试的一些功能,那在本篇文章中不做介绍,在之后的文章中我们会以实例来介绍debug模式下的keil
这两个按钮功能比较复杂,但是也有许多是平时不怎么用的,还是先说左边这个按钮
这个按钮叫做 工程目标选项(Options for Target )按钮,也叫做魔术棒按钮。我们重点讲一下其中的C/C++选项卡
第一处为预定义,像一些库函数的头文件,和芯片相关的头文件在这里统一宏定义,一般是不用往上面加东西的,但有时候程序报错了在网上查找解决方法有时就是这里缺少了相关头文件
第二处最为重要,像Robomaster这种代码量不小的比赛,一个兵种的代码往往有许多头文件和源文件,那么有时为了需要分类不同的文件夹来存放不同的源文件和头文件,那么要想头文件被引用(include)到,就要在Include Path中将对应的头文件所在的目录包含进来,具体是点右边的省略号按钮,再添加路径
魔术棒中还有一个Debug选项卡也是比较常用的,但是放在之后的文章讲解
再来说说这个 单工程管理按钮
我们主要使用的也就是Project Items选项卡,在这个页面中,我们能自主的决定我们的一个工程结构,你可以新建一个group来放目的不同的源文件,也可以解散你觉得分类繁琐的group。总之,如果你在你的工程文件内新生成的源文件要放入你的工程结构内,就需要在这里将你的源文件添加到其中的一个group内。
在keil左侧的一大块是四个窗口(如果少了几个可以在菜单栏中的view选项中勾选缺失的),我们重点讲解Project窗口以及Functions窗口
在project窗口内,我们可以看到整个工程的文件目录,像本例就是light_led工程,下有四个文件夹,里面有hal库的源文件,有一些芯片的启动文件,这些都是在我们选好相应芯片后自动生成的,如果你之后添加了你的源文件group进来(具体操作在上面),那么在project窗口也能看到,其中有些源文件有可展开的加号,点开后可以看到这个源文件到底包含了哪些头文件
然后是Functions窗口,这是一个新人很难察觉到功能,在Functions窗口内,我们可以看到这个工程所有的源文件,同样有可展开的加号,点开后我们可以看到这个源文件所有定义的函数,如本图所示,在gpio.c中,只定义了一个MX_GPIO_Init的函数(这就是STM32CubeMX自动生成的GPIO相关的底层代码),还可以看到,有许多源文件中有hal字样,这些源文件里面的函数都是hal库的函数,那么自然而然的我们也可以查看这些源文件里的函数:双击该函数可以跳转到该函数的定义。
最后是与编译相关的窗口,在keil的底部
可以看到有一个Build Output窗口和一个Error List窗口
Build Output窗口: 在点击编译按钮后,Build Output窗口会滚动字幕来表示编译的进度,那最后编译通过 没有错误没有警告的话就像上图一样。那如果变编译有错误,就会出现错误信息并提示编辑不成功,如下图。那如果是编程中出现一些可能会出现错误的地方,或是所写代码不是很严谨,那么会以黄色三角惊叹号标注在左侧行数旁,虽然编译结果是只要没error,就可以下载到开发板中,但有些时候我们还是要注意一写警告信息
编译错误,不能下载到开发板中
编译无错误,但有警告可以下载到开发板中
那么不是说只有在编译完我们才能知道编译的一个错误与警告情况,在Error_list窗口中,keil会实时地将可能存在的错误和警告的行数和原因打印出来,这也很方便我们养成良好的编程习惯
在本图中,我在一行语句中添加了一个空格,在Error_list窗口就马上写出了可能的错误原因,错误所在源文件,错误所在行数,在主编程视窗的行数左侧,也有小红叉注明。这些提示,虽然有的时候可以很快的找到错误纠正,但是有些时候也会存在误判,可能是由于代码还没编写完,那如何处理这些信息,就依靠日常的编程经验了。
打开STM32CubeMX,可以看到上图,那么我们要新建一个工程通常可以通过快捷键 Ctrl+N,或是在上方File文件夹内选New Project,或是在中间选ACCESS TO MCU SELECTOR, 在图中有三种新建工程的方式
从MCU选择芯片新建工程 2. 从开发板中选择对应开发板新建工程 3. 从实例中选择新建工程
那么我们通常都是从MCU新建工程,点开后得下图
那么我们可以从内核,芯片系列, Line(?暂时不清楚什么意思),封装方式,其他和所用外设等类别来选择我们的芯片,但是我们一般是已经有了相应芯片来新建工程,所以我们只需在Part Number的右侧搜索框中输入我们芯片的型号即可,这里以A板的STM32F427IIH6为例。可以看到红框中为我们所需的芯片,右侧的参数也能对上。双击芯片型号开始配置
那么可以看到中间的正方形代表的就是我们的芯片,一些圆形就是我们的引脚。那我们现在所在的就是Pinout & Configuration选项卡,这里主要是选择我们需要的外设。
System Core 选项卡中可以配置 GPIO,DMA,独立看门狗(IWDG), 中断(NVIC),RCC时钟,SYS调试等
Analog中主要配置的是与模拟量相关的,比如模数转换器(ADC)
Timers主要配置定时器,可以看到F4有非常多的定时器外设
Connectivity主要配置与通信相关的外设,比如CAN, IIC,SPI,串口(UART&USART)
Middleware配置一些中间件,像FreeRTOS在这里配置
每个选项卡选到具体的外设配置,在右侧都会有详细的配置条目,这里不做介绍,在之后具体学到相应外设我们再做讲解。
接下来是Clock Configuration,在这里你可以清楚看到该芯片的时钟树,而每个时钟的来源,倍频分频因子,都可以通过勾选来实现清晰的时钟配置,如果你没有其他的要求,你可以在你想要的外设所在的总线上填好频率后,按回车软件会自动根据你的需要配置合理的分频倍频。
当所有都配置好后,我们需要填写一下其他信息,比较简单我就在图中说明了,设置完后我们就点generate code 生成代码
注意,工程所在的路径不能包含中文,否则在generate code中会报错
本篇文章我们主要介绍了单片机的一些概念和开发的软件的使用,目的是熟悉一下软件的使用和环境的搭建。下一篇文章我会给大家介绍单片机的GPIO外设。