物联网实战--入门篇之(三)嵌入式STM32

目录

一、Keil简介

二、工程结构

三、文件目录

四、STM32简介

五、编码风格

六、总结


一、Keil简介

        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,可以根据当前项目实际需求自定义。

        这里面的文件都有各自的功能,还有很多细节需要项目进行比较深入时才好讲解,或者自己可以打开来多研究研究,整体结构还是比较清晰简洁的。

四、STM32简介

        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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/578708.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github profile Readme实现小游戏[github自述游戏]

Github profile Readme常用于个人主页介绍,将它与action自动化流程结合,可以实现一些小游戏 例如:2048、五子棋 2048实现 losehu (RUBO) GitHub 五子棋 https://github.com/losehu/losehu/tree/main 通过python/C编写可执行文件&#xf…

DSVPN实验报告

一、分析要求 1. 配置R5为ISP,只能进行IP地址配置,所有地址均配为公有IP地址。 - 在R5上,将接口配置为公有IP地址,并确保只进行了IP地址配置。 2. R1和R5之间使用PPP的PAP认证,R5为主认证方;R2于R5之间…

vue+elementUI搭建动态表头的表格

前提:以下代码是vue2项目结合elementUi完成的 数据结构 后端传来的数据是两个list,一个表头的list,一个表格内容的list // 表头 headTableAtts: [{ columnLabel: 姓名, columnName: name },{ columnLabel: 年龄, columnName: age },{ colu…

KT-0855大小鼠Y迷宫——动物行为研究的实验设备

大小鼠Y迷宫视频分析系统是一种专门应用于动物行为研究的实验设备,主要用于评估动物的空间记忆、辨别性学习以及工作记忆等认知功能。该系统通过捕捉和分析动物在迷宫中的行为表现,提供了一系列参数,如进入各臂的次数、时间、正确次数、错误次…

Web APIs知识点讲解(阶段五)

DOM- 网页特效篇 一.课前回顾(手风琴) <!DOCTYPE html> <html><head lang"en"><meta charset"UTF-8"><title>手风琴</title><style>ul {list-style: none;}* {margin: 0;padding: 0;}div {width: 1200px;heig…

LoRA 及其衍生技术总览:An Overview of the LoRA Family

编者按&#xff1a; 对于大语言模型的微调训练来说&#xff0c;传统的全参数微调方法需要处理数百万甚至数十亿级别的参数&#xff0c;计算量和显存占用都非常大。而 LoRA 这种技术方案&#xff0c;通过引入少量的可训练矩阵来调整预训练模型的行为&#xff0c;极大降低了训练所…

Radash一款JavaScript最新的实用工具库,Lodash的平替!

文章目录 Lodash 的痛点进入正题--Radash特点 举例几个常用的api 一说lodash应该大部分前端同学都知道吧&#xff0c;陪伴我们好多年的JavaScript工具库&#xff0c;但是自从 ES6 出现后就慢慢退出前端人的视线&#xff0c;能ES6写的代码绝对不会用Lodash&#xff0c;也不是完全…

C语言数据结构易错知识点(6)(快速排序、归并排序、计数排序)

快速排序属于交换排序&#xff0c;交换排序还有冒泡排序&#xff0c;这个太简单了&#xff0c;这里就不再讲解。 归并排序和快速排序都是采用分治法实现的排序&#xff0c;理解它们对分支思想的感悟会更深。 计数排序属于非比较排序&#xff0c;在数据集中的情况下可以考虑使…

LLM推理入门指南②:深入解析KV缓存

在本系列文章《LLM推理入门指南①&#xff1a;文本生成的初始化与解码阶段》中&#xff0c;作者对Transformer解码器的文本生成算法进行了高层次概述&#xff0c;着重介绍了两个阶段&#xff1a;单步初始化阶段&#xff0c;即提示的处理阶段&#xff0c;和逐个生成补全词元的多…

jetson Orin nano 部署(一)

jetson Orin nano上安装VScode 和 anconda环境配置&#xff0c;在anaconda中安装pytorch、torchvision、tensorrt 安装VScode下载VScode安装VScode 安装anaconda安装pytorh和torchvision&#xff0c;tensorrttrtexec的问题 安装VScode 下载VScode 点击VScode下载链接&#xf…

大数据-hive,初步了解

1. Hive是什么 Hive是基于Hadoop的数据仓库解决方案。由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性&#xff0c;因此使用Hive构建的数据仓库也秉承了这些特性。 简单来说&#xff0c;Hive就是在Hadoop上架了一层SQL接口&#xff0c;可以将SQL翻译成MapRedu…