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

news2024/10/9 22:21:29

目录

一、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.coloradmin.cn/o/1554482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宝塔面板操作一个服务器域名部署多个网站

此处记录IP一样,端口不一样的操作方式: 宝塔面板操作: 1、创建第一个网站: 网站名用IP地址,默认80端口。 创建好后,直接IP访问就可以了。看到自带的默认首页 2、接下来部署第二个网站: 仍然是…

Spark-Scala语言实战(7)

在之前的文章中,我们学习了如何在IDEA中导入jars包,并做了一道例题,了解了RDD。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢…

自建机房私有云吗?

大家好,我是小码哥,之前一种有没搞清楚公有云、私有云的概念,今天算是弄清楚了,这里给大家分享一下公有云、私有云的区别,以及自建机房算不算私有云! 其实私有云(Private Cloud)和公…

修复系统中缺失的VCRUNTIME140.dll文件DLL错误问题

在计算机编程中,动态链接库(DLL)是一种重要的组件,它提供了许多功能和资源供程序使用。其中,VCRuntime140.dll是Visual C Redistributable Packages的一部分,它包含了运行C应用程序所需的运行时库。本文将详…

双端队列deque和vector以及list的优缺点比较

参考:https://blog.csdn.net/TWRenHao/article/details/123483085 一、vector vector具体用法详情点这里 优点: 支持随机访问 CPU高速环缓存命中率很高 缺点: 空间不够,便需要增容。而增容代价很大,还存在一定的空间浪费。 头部…

DSVPN实验报告

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

DC-5靶机

一.环境搭建 1.下载地址 靶机下载地址:https://download.vulnhub.com/dc/DC-5.zip 2.虚拟机配置 切换nat模式,有问题全选重试和是,打到这了,我感觉这个配置我都不用写了,启动靶机如下图所示即可 二.开始渗透 1.信…

Unity | 工具类-UV滚动

一、内置渲染管线Shader Shader"Custom/ImageRoll" {Properties {_MainTex ("Main Tex", 2D) "white" {}_Width ("Width", float) 0.5_Distance ("Distance", float) 0}SubShader {Tags {"Queue""Trans…

ARMv8-A架构下的外部debug模型(external debug)简介

Armv8-A external debug Armv8-A debug模型一,外部调试 External debug 简介二,Debug state2.1 Debug state的进入与退出 三,DAP,Debug Access Port3.1 EDSCR, External Debug Status and Control Register调试状态标识&#xff0…

Midjourney绘图欣赏系列(十四)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…

什么是自然语言处理(NLP)?

此为观看视频What is NLP (Natural Language Processing)?后的笔记。 你正在看这个视频,试图理解作者说的单词和句子,当我们要求计算机做到这一点时,这就是 NLP,即自然语言处理。 NLP 在人工智能应用中实用价值很高。NLP 从非结构…

C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现

在前几节的研究中,我们已经实现网络层与业务层分离,本节实现数据层与业务层分离,降低各层之间的耦合性,同时实现用户注册业务。 网络层专注于处理网络通信与读写事件 业务层专注于处理读写事件到来时所需求的各项业务 数据层专…

Mysql从0到1 —— CRUD/索引/事务

文章目录 1 预备知识1.1 安装1.2 登录 & 退出1.3 配置文件my.cnf 2 基础知识2.1 链接服务器2.2 什么是数据库2.3 基本使用2.3.1创建表2.3.2 插入数据 2.4 服务器、数据库、表的关系2.5 SQL分类2.6 存储引擎 3 Mysql数据库的操作3.1 创建和删除3.2 字符集和校验规则3.3 查看…

YOLOv8全网独家改进:红外小目标 | 注意力机制改进 | 维度感知选择性集成模块DASI,红外小目标暴力涨点| 2024年3月最新成果

💡💡💡本文独家改进:维度感知选择性集成模块DASI,解决目标的大小微小以及红外图像中通常具有复杂的背景的问题点,2024年3月最新成果 💡💡💡红外小目标实现暴力涨点,只有几个像素的小目标识别率大幅度提升 改进结构图如下: 收录 YOLOv8原创自研 https://blo…

Challenging BIG-Bench tasks and whether chain-of-thought can solve them阅读笔记

不是新文章哈,就是最近要看下思维链(chain of thought,CoT)这块,然后做点review。 文章链接(2022年):https://arxiv.org/pdf/2210.09261.pdf GitHub链接:GitHub - suzg…

100个AI Agent应用场景合集

人工智能代理(AI Agent)的发展正在以前所未有的速度改变我们的生活和工作方式。从日常生活的小事到企业级的复杂决策,AI Agent 的应用场景广泛且多样。 100个AI Agent应用场景合集 以下是 100 个 AI Agent 的创新应用场景,它们展示…

代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 509. 斐波那契数题目解法 70. 爬楼梯题目解法 746. 使用最小花费爬楼梯题目解法 感悟 509. 斐波那契数 题目 解法 使用动态规划 class Solution { public:int fib(int n) {if(n <…

书生浦语训练营2期-第一节课笔记

笔记总结: 了解大模型的发展方向、本质、以及新一代数据清洗过滤技术、从模型到应用的典型流程、获取数据集的网站、不同微调方式的使用场景和训练数据是什么&#xff0c;以及预训练和微调在训练优势、通信/计算调度、显存管理上的区别。 收获&#xff1a; 理清了预训练和微调…

unity学习(77)--多玩家信息交互--不同类型的数据包

明白各个数据包的作用&#xff0c;以及是否正确的发挥作用 1.“120包”&#xff0c;客户端登录时发给服务器的&#xff0c;服务器处理后返回“121包”。 2.“121包” &#xff0c;服务器返回给客户端的&#xff0c;包含登录时所有在线玩家的信息。 客户端也通过createPlayer函…

故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab) 模型描述 CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型是一种深度学习模型,结合了卷积神经网络(CNN)和双向长短期记忆网络(BiLSTM)的优点…