物联网实战--入门篇之(三)嵌入式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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用 C++ 部署深度学习模型?

深度学习模型在诸多领域如图像识别、自然语言处理、语音识别等展现出强大的应用潜力。然而,模型训练与实际部署是两个不同的环节,许多开发者在使用Python进行模型训练后,出于性能、集成便利性或特定平台要求等因素,会选择使用C进行…

[机器学习]练习-KNN算法

1.𝑘近邻法是基本且简单的分类与回归方法。𝑘近邻法的基本做法是:对给定的训练实例点和输入实例点,首先确定输入实例点的𝑘个最近邻训练实例点,然后利用这𝑘个训练实例点的类的多数来…

基于单片机声音分贝采集和显示控制系统设计

**单片机设计介绍,基于单片机声音分贝采集和显示控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机声音分贝采集和显示控制系统设计,主要目标是实现声音分贝的实时采集、处理以及显示…

Java复习第十三天学习笔记(HTML),附有道云笔记链接

【有道云笔记】十三 3.29 HTML https://note.youdao.com/s/Ru3zoNqM 一、基本标签 HTML:超文本标记语言 定义页面结构 CSS&#xff1a;层叠样式表 页面显示的样式、排版 BootStrap JS: JavaScript 界面交互(动态交互、逻辑) JQuery <!DOCTYPE html> <html> &l…

[羊城杯 2020]EasySer

[羊城杯 2020]EasySer 进入页面&#xff0c;发现是ubuntuapache2&#xff0c;但是好像没啥用 尝试访问/robots.txt&#xff0c;得到 访问/star1.php/&#xff0c;查看源码&#xff0c;得到提示 一看就知道是ssrf&#xff0c;使用http://127.0.0.1/ser.php&#xff0c;得到…

阿里云CentOS7安装Flink1.17

前提条件 阿里云CentOS7安装好jdk&#xff0c;官方文档要求java 11&#xff0c;使用java 8也可以。可参 hadoop安装 的jdk安装部分。 下载安装包 下载安装包 [hadoopnode1 ~]$ cd softinstall/ [hadoopnode1 softinstall]$ wget https://archive.apache.org/dist/flink/flin…

【物联网】Qinghub MQTT 连接协议

基础信息 组件名称 &#xff1a; mqtt-connector 组件版本&#xff1a; 1.0.0 组件类型&#xff1a; 系统默认 状 态&#xff1a; 正式发布 组件描述&#xff1a;通过MQTT 连接网关&#xff0c;发布或订阅MQTT broker相关的数据信息。 配置文件&#xff1a; 配置文件作为MQT…

前端-css-2

1.背景样式 属性名作用属性值background-color背景颜色颜色background-image设置背景图像地址url(地址)background-repeat设置背景图像重复方式 repeat&#xff1a;重复。 repeat-x&#xff1a;横向重复。 repeat-y&#xff1a;纵向重复。 no-repeat&#xff1a;不重复。 back…

Flink集群主节点JobManager启动分析

1.概述 JobManager 是 Flink 集群的主节点&#xff0c;它包含三大重要的组件&#xff1a; ResourceManager Flink集群的资源管理器&#xff0c;负责slot的管理和申请工作。 Dispatcher 负责接收客户端提交的 JobGraph&#xff0c;随后启动一个Jobmanager&#xff0c;类似 Yarn…

ssm 设备采购管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 设备采购管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

61、服务攻防——中间件安全CVE复现K8sDockerJettyWebsphere

文章目录 K8sDockerWebSphere K8s k8s&#xff1a;简单来说&#xff0c;跟docker一样&#xff0c;是个容器系统。 k8s对外攻击面总结 常见漏洞&#xff1a;未授权访问、提权漏洞 Docker docker逃逸&#xff1a;1、由内核漏洞引起&#xff1b;2、由Docker软件设计引起&#x…

vue3+threejs新手从零开发卡牌游戏(二十):添加卡牌被破坏进入墓地逻辑

在game目录下新建graveyard文件夹存放墓地相关代码&#xff1a; game/graveyard/p1.vue&#xff0c;这里主要设置了墓地group的位置&#xff1a; <template><div></div> </template><script setup lang"ts"> import { reactive, ref,…

HTML5 和 CSS3 提高

一、HTML5 的新特性 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这些新特性。 声明…

架构之第三方框架pinyin4j与hutool搭配使用原理

一、工作原理 Hutool工具将包括pinyin4j等翻译工具插件绑定。实现通过spi接口的方式实现调用&#xff0c;底层实现可自由切换 注&#xff1a;Hutool绑定的pinyin插件有如下图几种。也就是没有添加maven依赖如pinyin4j等拼音插件。 注&#xff1a;若没有依赖pinyin插件。使用时…

性能与压力测试

一、性能监控 1.1 jvm内存模型—堆 由于所有的对象实例以及数组都要在堆上分配内存&#xff0c;并且堆是垃圾收集器管理的主要区域&#xff0c;也被称为“GC堆”&#xff0c;所以堆是我们优化最多考虑的地方。 首先&#xff0c;堆可细分为&#xff1a; Young区&#xff08;新…

动态规划刷题(算法竞赛、蓝桥杯)--导弹拦截(线性DP)

1、题目链接&#xff1a;[NOIP1999 提高组] 导弹拦截 - 洛谷 #include <bits/stdc.h> using namespace std; const int N2e55; int a[N],x,n; int b[N],len;int main(){while(cin>>x)a[n]x;//求最长不上升子序列 b[0]2e9;//初始化为无穷大for(int i1;i<n;i){if(…

配置visual studio code 用秘钥远程连接SSH服务器

配置visual studio code 用秘钥远程连接SSH服务器 文章目录 配置visual studio code 用秘钥远程连接SSH服务器简介1. 生成SSH密钥对2. 将公钥添加到Ubuntu服务器3. 将私钥添加到visual studio code的SSH配置文件中 简介 通过SSH密钥认证&#xff0c;用户无需在每次连接时输入密…

FFmpeg将绿幕视频处理成透明视频播放

怎么在网页端插入透明视频呢&#xff0c;之前在做Web3D项目时&#xff0c;使用threejs可以使绿幕视频透明显示在三维场景中&#xff0c;但是在网页端怎么让绿幕视频透明显示呢&#xff1f; 如图上图&#xff0c;视频背景遮挡住后面网页内容 想要如下图效果 之前有使用过ffmpeg…

《算法笔记》系列----质数的判断(埃氏筛法)

目录 一、朴素算法 二、埃氏筛法 1、与朴素算法对比 2、算法介绍 3、例题即代码实现 一、朴素算法 从素数的定义中可以知道&#xff0c;一个整数n要被判断为素数&#xff0c;需要判断n是否能被2.3.n- 1中的一个整除。只2&#xff0c;3..n- 1都不能整除n&#xff0c;n才能…

服务器被CC攻击之后怎么办?

1.取消域名绑定取消域名绑定后Web服务器的CPU能够马上恢复正常状态&#xff0c;通过IP进行访问连接一切正常。但是不足之处也很明显&#xff0c;取消或者更改域名对于别人的访问带来了不变&#xff0c;另外&#xff0c;对于针对IP的CC攻击它是无效的&#xff0c;就算更换域名攻…