目录
Keil是一款常用的单片机开发工具,主要包含了编译、仿真、调试和开发界面(IDE),后被ARM公司收购,与其MDK-ARM合并为MDK-ARM Keil软件包,所以有时候他也叫MDK。
目前,大家常用的版本是Keil5,它的整体界面如下,标注出来的是常用的功能:
1、工程目录:直观地展示整个项目的结构以及每个目录的文件,要打开文件直接双击即可。
2、编辑区:一般是编辑C语言文件,偶尔要编辑汇编的,C语言文件编辑时输入变量的前3个字符后会自动提示和补全,比较方便;但是如果不小心输入了中文字符提示了错误就不会提示和补全了,需要重新打开软件,这应该也是个bug,不过问题不大。
3、编译按钮:对应的快捷键是F7,代码编辑到一定程度时候就可以编译下,看下有没有什么错误。
4、下载按钮:对应的快捷键是F8,需要编译成功后,接好烧写器和单片机后才能正确执行,如果提示下载失败看下是不是线没接好,或者线太长了要适当调整下载速率,一般2M以下都没什么问题。
5、项目配置:这一块内容比较多,也是实际项目过程中经常会用到的,这里一一讲解细节。
5.1 点击项目配置按钮后首先弹出如下界面,是Target选项卡,这个界面里主要是红色框框要勾选下,下方的IROM1和IRAM1正常不需要手动设置,把选项卡切换到第一个Device里,再选择你要开发的芯片型号它就会自动把IROM1和IRAM1内容补全了。
5.2 Device选项卡界面如下,在这里选择你在开发的主芯片型号,这个要安装上一篇所说的固件包才会体现(Keil.STM32F1xx_DFP.2.2.0.pack),自己也可以点击右边的网址进行检索下载。
5.3 Output选项卡主要是保存编译出的一些中间文件信息,这个最好设置一个独立的目录存放,工程才不会乱糟糟的。
5.4 Listing选项卡同样的道理,其输出的.map文件可以打开看看,里面包含了每个文件的ROM和RAM占用情况,这在需要优化软件设计的时候有帮助。
5.5 User选项卡主要是下图这个内容,它的作用是在编译完成后再调用fromelf.exe,将编译结果转化成bin文件,这个文件可以直接用自己的方式将其复制到主芯片的指定位置,完成程序升级,有兴趣的话后面开一个IAP远程升级的专题进行详细讲解。
要注意的是,每个人Keil的安装目录都不一样,自己要更改下命令里的目录信息才能正确运行。
5.6 C/C++选项卡内容如下,Define就是全局的宏定义,这个宏定义也可以在文件里定义;Optimization是优化等级,空间足够的话就不要优化了,容易出现莫名其妙的问题,设置成Level0就行;C99 Mode要记得勾起来,编译才会不出错;最后就是添加include的文件夹路径,这样你在C文件中就可以直接#include"xxx.h"了,而不用添加一大串路径 #include"pa/pb/xxx.h"。
5.7 剩下的主要就是Debug选项卡比较重要了,如下图所示,连接上烧写器和STM32后,点击Settings会弹出带有信息的对话框,把下方Port模式改成SW,速度Max改为3M,最好不要超过5M,容易下载失败;烧写器和主芯片都正常的话 右边的框框会显示芯片信息,如果是空白的那就说明主芯片和烧写器的连接有问题。要注意的是 烧写器的驱动要先安装。
要想下载成功还有个必要的设置就是下载算法,如下图所示,STM32F10x...那边如果是空白的就要自己添加,添加步骤相对简单,型号要选对,这个算法也是安装了固件包才会出现的。
Keil的整体使用差不多就这样了,功能很丰富,但常用的也就这些,后面调试方面的在学习过程中再慢慢展示。
网上有很多单片机的教程,不懂大家学习过程中有没有发现,他们的工程都是一节课一个,简单讲就是直接复制上一节课的工程,再简单改改,然后两节课的工程是互相独立的。这在学习阶段问题不大,但是在做实际项目的时候会有问题,一方面是文件很多,管理起来很麻烦,没有统一性,过几天可能都忘了自己写的什么;另一方面是如果一些比较底层的驱动文件有bug,而你几乎所有项目都用到了那个文件,那你就得每个工程的该文件都修改一遍过去,很麻烦,也很容易出错。针对这些个问题,最好在学习阶段就养成一个工程维护的好习惯。
其实Keil软件有个很好的项目管理方式叫工作空间,如下图所示,首先可以建一个工作空间,这个工作空间正常是以一个芯片型号为主,比如STM32F103C8T6,如果有其它的芯片,比如STM32F103VET6,那么就再建立一个工作空间。
建立工作空间之前要先把相应的目录建立清楚,首先是建立一个文件夹存放整个工作空间(比如下图的 STM32F103C8T6_物联网工作空间-RT_Thread),然后在这个文件夹内建立下图所示的几个文件夹,
其中Drivers主要存放驱动文件,属于公共使用的,根据自己的项目会不断增加相关文件,就比如净化器项目里的温湿度SHT30的驱动文件就是放在里面的,这样以后不管什么项目用到这个传感器都可以直接调用这个驱动库,不用再写一遍了。
Libraries文件夹主要存放STM32自带的跟芯片底层相关的文件,以及外设驱动,比如UART、IIC、ADC等,这些文件都是固定的、公用的、后续不用任何改动的。
RT-Thread 文件夹是因为我们这个项目用到了实时操作系统(RTOS)--RT-Thread,一般我们将单片机开发分为两种,一种是裸机编写,一种是使用RTOS;整体上来讲,使用RTOS会比较好,有利于软件结构的模块化,简洁明了;而且我这里使用的是RT-Thread Nano精简版本的,占用空间极小,RAM 占用约 1K 左右,ROM 占用 4K 左右,STM32F103C8T6这款芯片的空间绰绰有余(ROM 64K, RAM 20K)。这些文件也都是固定的、公用的、后续不用任何改动的。
其实,剩下的自定义就是Project文件夹了,从名字也能看出来,我们各自项目的文件都在这个文件夹里,打开文件夹可以看到,里面定义了老板吩咐的各种项目😭,这个具体项目的建立很简单,就是复制之前的项目再稍微整理下就行了,比如第一个项目是净化器,后面的两个直接复制整个净化器的文件夹粘贴,然后把名字改一下,最后进入温湿度的文件夹,把几个文件的名称改成温湿度就行了。
接下来就可以添加刚才复制出来的新项目到整个工作空间了,如下图所示,首先双击刚才建立的工作空间,打开后是空白的,然后右键WorkSpace后单机弹出的选项就可以进行工作空间管理了
根据下图箭头指示的步骤就可以添加净化器项目了,其他的项目也是同样的操作。
新项目添加后上图所指的文件名可以改下,跟平时重命名文件夹一样操作就行,完了之后就可以编译这个项目了,剩下的就是根据新项目的需求增删文件了。激活的项目是有灰度的,如果要改变激活的项目,右键该项目再单击弹出的选项卡即可,如下图所示。
由此可见,工作空间是一个很好的管理项目的方式,以某一芯片型号为核心,只要用到这款芯片的项目都可以在此建立新项目。如果项目中有个驱动文件有bug,比如下图中的drv_sht30.c,这个文件净化器和温湿度的项目都有用到,那我只需要修改下该文件,然后不同项目各自重新编译下就可以了,维护起来清晰明了、方便快捷。
根据上图,项目工程内部文件夹与外部文件夹基本对应,略有区别。内部文件夹也不要乱建立,核心还是要清晰明了,方便管理,我这边只是参考。
首先建立StdPeriph_Driver文件夹存放STM32提供的一些标准库文件,其中f103c8t6.lib是STM32驱动外设被我编译成了库文件,这样就不会有一堆的C文件了。
RT-Thread文件夹存放的与外部的RT-Thread文件夹内容对应,在外部一般设为只读模式,防止误修改。
MQTT文件夹存放MQTT驱动,这个驱动是别人开源的,我们只是拿来用,由于文件数量比较多,内容比较复杂,所以单独建立一个文件夹,里面的文件开发过程中也无需修改,引用就行了。
我们主要操作的对象还是Drivers文件夹和Applications文件夹,Drivers文件夹存放的是底层驱动文件,可以看到它的文件基本都是drv_开头的,从外部的Drivers文件夹添加进来即可,需要用到什么驱动就添加什么,不用所有的驱动都加进来,像净化器这个项目用到了串口、IIC、SHT30、ESP8266等驱动;这些驱动文件在其他其他项目也是可以同样使用的,写好后一般也不用修改,除非是发现了什么bug再去修改。
跟项目本身有直接关系的还是Applications文件夹的内容,像这里的app_air.c文件包含了整个净化器的工作内容,比如读取温湿度值、解析PM2.5、通过ESP8266定时发送数据以及设备识别码设置等等。这里还有一个常用的自定义文件是user_opt.h文件,从文件名可知就是每个项目自定义的配置信息了,比如净化器项目的串口3是解析PM2.5传感器数据,传感器固定的波特率是9600,在这里我们就设置成9600了,串口2是驱动ESP8266 WiFi模块的波特率是115200,可以根据当前项目实际需求自定义。
这里面的文件都有各自的功能,还有很多细节需要项目进行比较深入时才好讲解,或者自己可以打开来多研究研究,整体结构还是比较清晰简洁的。
STM32F103C8T6主要参数如下图所示,串口数量是3个,对付一般项目够用了。
其实STM32的学习主要还是学如何使用下图这些外设驱动,读懂它并能灵活使用它就对了,这里边比较常用的是adc模数转换、exti外部中断、gpio输入输出、iic通讯、wdg看门狗、spi通讯、tim定时器和usart串口,这些外设的使用基本步骤都是初始化+使用,很多没有使用成功的原因大部分是初始化有问题的。
关于STM32的系统教学视频有很多,我以前是看的刘凯老师的视频,后面野火的教程看了些,这些教程在B站上都很多的,本项目学习完后还是建议系统性地学一学,这样才能融会贯通。
编码风格采用RT-Thread的风格,他也是采用Unix风格的,比较适合C语言,核心来讲就是都用小写字母,每个特征之间用下划线隔开,具体可以参考下方的链接。当然了,有些早期的代码我也没有完全按照这个风格来,望见谅。
documentation/contribution_guide/coding_style_cn.md · RT-Thread/rt-thread - Gitee.com
这一篇文章主要还是介绍了整个项目的结构,这样有利于大家对我写的代码进行阅读,同时教大家一些我使用过程中的经验,大家可以看情况吸收,合适的就拿去用,如有错误,请指正。
本项目的交流QQ群:701889554
写于2024-3-29
更多【stm32-物联网实战--入门篇之(三)嵌入式STM32】相关视频教程:www.yxfzedu.com