江协科技STM32学习- P4 新建工程

news2024/9/30 3:25:49

    🚀write in front🚀  
🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 

💬本系列哔哩哔哩江科大STM32的视频为主以及自己的总结梳理📚 

🚀Projeet source code🚀   

💾工程代码放在了本人的Gitee仓库:iPickCan (iPickCan) - Gitee.com

引用:

STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

Keil5 MDK版 下载与安装教程(STM32单片机编程软件)_mdk528-CSDN博客

STM32之Keil5 MDK的安装与下载_keil5下载程序到单片机stm32-CSDN博客

0. 江协科技/江科大-STM32入门教程-各章节详细笔记-查阅传送门-STM32标准库开发_江协科技stm32笔记-CSDN博客

术语:

英文缩写描述

正文:

0. 概述

从 2024/06/12 定下计划开始学习下江协科技STM32课程,接下来将会按照哔站上江协科技STM32的教学视频来学习入门STM32 开发,本文是视频教程 P2 STM32简介一讲的笔记。

1. 新建STM32工程

本小节会建立一个STM32工程,STM32工程的文件还是比较多的。目前STM32开发的方式主要有3种。

STM32的开发方式

  • 目前stm32的开发方式主要有基于寄存器的方式、基于标准库的方式(库函数的方式)、基于HAL库的方式
  • 基于库函数的方式是使用ST官方提供的封装好的函数,通过调用这些函数来间接地配置寄存器
  • 基于HAL库的方式可以用图形化界面快速配置STM32,但这种方式隐藏了底层逻辑

库函数文件夹

使用库函数的方式,需要准备一个STM32库函数的压缩包,如下:

库函数文件夹里的内容解释如下:

  • Libraries里面就是库函数的文件,之后建工程会用到
  • project里是官方提供的工程示例和模版,使用库函数可以参考一下
  • Utilities是stm32官方评估板的相关例程,这个评估板是官方用STM32做的一个小电路板用来测评stm32的,这个文件夹存的就是这个小电路板的测评程序
  • 最后面两个文件,一个是库函数的发布文档(有一些版本的说明),一个是使用手册(教如何使用库函数)

建工程步骤

1.给工程起一个通用的名字,文件夹的名称是方便改的,工程名称不太方便改

2.接下来选择器件型号,使用的是stm32f103c8t6

3.这里弹出的是新建工程小助手,可以帮助快速新建工程。(本次实验不使用,可以先跳过)

4.工程文件是空的,现在这个工程还不能用,需要添加一点工程的必要文件

5.打开固件库的文件夹

  • 启动文件的文件路径:Libraries-CMSIS-CM3-DeviceSupport-ST-STM32F10x-startup-arm-

  • 如下就是STM32的启动文件,STM32的程序就是从启动文件开始执行的。

  • 将全部启动文件全部复制下来,然后回到工程文件夹里

6.工程文件夹如下,里面是新建工程自动生成的文件

7.工程文件夹里,新建文件夹(start)用来存放复制过来的启动文件

8.接着回到固件库的STM32F10x文件,可以看到stm32f10x.h和两个system开头的文件system_stm32f10x.c和system_stm32f10x.h文件,将这三个文件复制下来,也粘贴到Start文件夹下。

  • stm32f10x.h是STM32的外设寄存器描述文件,作用和51单片机的头文件REGX52.H一样,是用来描述stm32有哪些寄存器和它对应的地址的
  • 两个system文件是用来配置时钟的,stm32主频72MHz,就是system文件里的函数配置的

9.接下来添加内核寄存器的描述文件

因为stm32是内核和内核外围的设备组成的,而且这个内核的寄存器描述文件和外围设备的描述文件不在一起,所以还需要添加一个内核寄存器的描述文件。打开固件库文件夹下的 CM3-CoreSupport- 文件夹,这两个cm3(Cortex-M3)文件就是内核的寄存器描述,当然还有一些内核的配置函数,所以多了个.c文件。将两个cm3文件复制粘贴到工程文件夹的Start文件夹下。

10.到此为止,工程的必要文件就复制完成了。

11.然后回到keil软件,将刚才复制的文件(start)添加到工程里。

点击选中Source Group 1,然后再点击一下,把这个组改一下名字,也叫Start

接着右键,选择添加已经存在的文件到组里

打开start文件节,把下面这个文件过滤器,选择ALL files,这样就可以看到文件节里的所有文件了

首先添加一下启动文件,启动文件有很多分类,我们只能添加其中一个,我们所用型号需要选择这个后缀为md.s得启动文件(为什么选择这个启动文件,在后面 “新建工程里的启动文件选择” 这个章节解释),选中它点击Add

然后剩下的.c和.h文件都要添加进来,然后Close,这样我们的Start文件夹里面的文件就添加好了

这里的文件都是stm32里最基本的文件,是不需要我们修改的,我们添加进来就可以。文件图标上的小钥匙,意思是文件是只读文件,不可修改。

12.最后我们需要在工程选项里添加上这个文件夹的头文件路径,要不然软件是找不到.h文件的。

点击魔术棒按钮,打开工程选项,在c/c++里,找到这个Include Paths栏,然后点击右边的三个点的按钮,然后再点击新建路径,然后再点三个点的按钮,把start的路径添加进来,点击ok,就把这个文件夹的头文件路径添加进来了

新建工程里的启动文件选择

我们新建工程第一个加的就是启动文件,这个启动文件有很多类型,至于选择哪一个,我们要根据芯片型号来选择。在下面的表中,这是stm32f1系列中的型号分类,其中根据Flash的大小,分为了小容量产品LD,中容量产品MD、大容量产品HD…。stm32f100系列为超值系列,简写为VL,F105和F107为互联型产品CL,这个就没有根据Flash大小来分类.stm32f103c8t6的Flash为64K,所以选择MD的启动文件。

型号分类及缩写如下:

新建文件步骤总结

  1. 建立工程文件夹,Keil中新建工程,选择型号
  2. 工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
  3. 工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里
  4. 工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹(因为像Start等文件夹是自己建的,keil并不知道,所以必须声明一下路径,最好就是自己新建文件就声明一下,这样就不会出现.h文件找不到的问题)
  5. 工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER(使用库函数就必须定义这个)
  6. 工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run

工程架构

1.工程结构主动执行的部分(工程架构左边两个图)

  • 首先是startup启动文件,这个是程序执行最基本的文件,keil中启动文件是用汇编写的,启动文件内定义了中断向量表,中断服务函数等,这个中断函数中有个复位中断,这就是整个程序的入口,当stm32上电复位或者按下复位开关之后,程序就会进入复位中断函数执行,复位函数中断就主要做了两件事情,第一个是调用SystemInit函数,第二个是调用main函数,然后程序就结束了,当然,实际上单片机的程序永远都不会结束,所以在main函数的最后一定有一个死循环
  • SystemInit函数就是定义在System_xx开头的.c里的,在keil里也可以看到这个函数的定义(在main函数之前,单片机就已经执行了一堆东西了,帮我们把闪存接口,时钟等一系列杂碎的东西都配置好了)。
  • 另外在启动文件还定义了stm32所有的其他中断,这些中断达到触发条件后就会自执行,这个中断函数的定义就是在stm32fx_it里面的,自己的中断有建议位置,如下图有所示,当然我们还是习惯在哪里用中断就在哪里,写在别的地方也是可以的
  • 以上就是中断部分的逻辑。

另外你也可以自己定义一些用户文件,来封装一些模块供主程序和中断调用,有利于程序结构的模块化,要不然所有的程序都在主函数里,那主函数就太长了,到此为止,这个工程结构主动执行的部分就介绍完了。

2.被动执行部分(工程架构右1图)

被动执行部分,相当于stm32的资源了,我们在主函数或者中断函数里,就可以调用这些资源,右上角这两个stm32f10x.h和core_cm3这些文件就是外设和内核外设的寄存器描述,点开文件可以看到,都是寄存器和寄存器名字,还有地址信息等,如果直接调用这些寄存器来使用stm32,那就是寄存器的开发方式,很麻烦,所以就提供了下面的两个文件,就是库函数文件,在keil中可以看到,这每个外设都提供了一大堆函数,这些函数封装了寄存器的操作,给我们提供更加人性化的函数调用方式,只要学会了操作套路,那配置一个外设就很简单,连手册都不需看。这个conf的文件就是用来配置头文件的包含关系的,在keil中可以看到conf文件include了所有的库函数头文件,同时我们在stm32f10x.h的最后又包含了conf,所以在使用这些库函数时,我们只需要包含stm32f10x.h这一个头文件,就相当于包含了所有的库函数头文件,这样我们就可以任意地调用库函数了,以上就是整个工程的结构和每个文件的使用

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

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

相关文章

大语言模型超参数调整指南:入门调参的实用手册

在人工智能的广阔天地中,大语言模型(LLM)正以其强大的能力,不断刷新我们对机器理解语言的认知。然而,要使这些模型在特定应用场景下发挥最大效能,关键在于如何巧妙地调整其超参数。本文将带你深入探索 LLM …

4. 数组与集合

数据结构是管理和组织数据的基础,它直接影响到程序的性能和效率。在本章中,我们将深入探讨与数组和集合相关的知识。这些数据结构在Java编程中至关重要,无论是处理简单的线性数据还是复杂的多维数据,合理使用这些结构都能大大提高…

100个智能体实战技巧 | 如何让工作流也能处理图片

相信不少朋友都遇到过想要在工作流中处理图片但是却无从下手的情况 举个例子,扣子中有个插件叫OCR,是可以用来识别图中的文字的 然而作为一个插件,它只能在工作流中被调用,如下图 工作流 vs. 图像流 这就意味着,要使用…

Modal中的跳转用<Link>组件会报错?

在做链接跳转时,一般是用a标签或者link标签。但是当团队规范使用标签时,在modal(antd的版本4)中使用可能就有问题了。 报错内容是,发现link在使用时找不到路由上下文。因此报错。 原因:Link 组件在 return …

Vue3-响应式原理解析

vue3 与 vue2 主要差异之一无疑是响应式实现上的改变。本文主要阐述响应式原理的实现方式解析以及核心源码阅读的注释理解。 本文主要对响应式实现原理进行逻辑梳理,舍弃枯燥无味的代码,只用图解/文字进行功能描述,具体实现请自行阅读。保重!!! 如果问题,虚心求教,还请…

xxl_job任务调度简单使用

一、概念 任务调度是为了自动完成特定任务,在约定的特定时刻去执行任务的过程 如以下应用场景: 某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券 某银行系统需要在信用卡到期还款日的前三天进行短信提醒 某财务系统…

UEditor百度富文本后端上传文件接口

UEditor百度富文本后端上传文件接口 直接上代码 接口: RequestMapping("/UEditorConfig")public String list(HttpServletRequest request, HttpServletResponse response) throws IOException {String config environment.getProperty("ueditor.c…

60%公司推行精益管理失败都源于同一原因,这个原因是...

精益管理在许多公司中已经成为提高运营效率、减少浪费、和提升客户满意度的重要方法。或者你觉得惊讶,根据我们的经验,超过60%的公司在实施精益管理失败,我们发现他们都有一个共同的原因,这个原因就是公司没有跟踪正确的指标&…

【图文并茂】ant design pro 如何优雅奇妙地把 crud 的 api 单独抽出来共用

我们写后台项目,经常要写增删改查的接口。 比如 角色 权限 我们不可能都写一个 api 比如 getRoles, getPermissions 这些请求列表的,都是一样的,只是路径不同 那么我们应该抽出来,放到一起,直接去调,只…

双向电表是什么电表?为什么光伏发电储能要求安装双向电能表!

双向电表是什么电表? 双向电表就在用电的时候假如是正转,那么向外送电的时候就是反转,也就是读数越来越小。反总是指反向总有功,反无是指反向总无功。 双向电表,也称为双向计量电能表,是一种能够计量用电和发电的电…

第三节:Nodify 添加连接关系

引言 Nodify有三层结构,编辑器Editor,节点Node和连接组件Connection,上节介绍了节点和编辑器,本节介绍连接组件。连接组件用于保存节点中连接端子的连接关系,并随节点的拖动改变。 1、连接组件 连接组件存储一个连接关…

海外媒体软文发稿【越南通讯社vnanet】官方媒体发布新闻稿

海外媒体软文发稿【越南通讯社vnanet】官方媒体发布新闻稿 越南通讯社(越南语:Thng tấn x Việt Nam;英语:Vietnam News Agency,简称VNA),简称“越通社”是越南国家通讯社,始建于1945年9月2日。越通社是越…

JVM的内存模型和垃圾回收

JVM内存区域 内存模型图: 堆 线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。 它的目的是存放对象实例。同时它也是GC所管理的主要区域,因此常被称为GC堆,又由于现在收集器常使用分代算法,Java堆中还…

纷享销客AI能力在线索精细化管理中的应用与实践

1、智能评分提高线索转换效率 企业可以经过后台模型配置,和对近1-2年内线索的相关属性进行整理分析,纷享销客AI可以总结出历史相似线索的转换概率,使销售人员可以集中精力在更容易转换的线索上,提高转化效率。 纷享销客AI的智能…

pdf如何转换为jpg图片?这几种转换方法简单又实用!

pdf如何转换为jpg图片?PDF,这一广泛应用于文档传输与存储的格式,虽极大地促进了信息的电子化流通,但在日常办公实践中,也逐渐显露出其局限性,尤其是在文件管理与网络分享方面,PDF的庞大体积常导…

fastadmin 时间选择器可选择具体的时分秒

预期要达到的样式,时间区间可以直接选择具体的时分秒 找到这个文件require-form.js 在pulic/assets/js 下面 找到datetimepicker 属性 设置为true var options {timePicker: true,autoUpdateInput: false,timePickerSeconds: true,timePicker24Hour: true,autoApply: true,lo…

Llama 3.1 70B与Mistral Large 2 128B深度对比

在人工智能的浩瀚宇宙中,两颗新星正在引发行业内的轰动。Meta 的 Llama-3.1-70B 和Mistral Large-2-128B,这两大 AI 巨头以其前所未有的计算能力和复杂性,正引领着智能算法的新浪潮。它们不仅仅是技术的集大成者,更是未来可能性的…

基于微信小程序的点餐小程序/基于微信小程序的订餐系统设计与实现

微信点餐小程序 摘 要 随着互联网技术不断地发展,网络成为了人们生活的一部分,而点餐系统作为网上应用的一个全新的体现,由于其特有的便捷性,已经被人们所接受。目前主流的点餐服务不仅不明确并且管理员管理起来不容易&#xff0…

公司最大的内卷,偷偷做单元测试

一位读者在看过我的《理解这八大优势,才算精通单元测试》后,问我:知道单元测试有好处,但实在没空写。看完文章后又想重新落实一下,有没有啥写好单元测试的技巧? 这位读者绝对不是第一个和我抱怨单元测试的…

安卓窗口window无法移除屏幕外超过屏幕边界?-wms源码层面深入剖析

背景 学习了上一节的窗口位置变化相关的内容后,在窗口移动过程过程中发现有一个限制问题,大家可以看一下如下动态图: 已经尽力把窗口想要拖到屏幕外面,但是一直拖到不生效,只能在屏幕内部进行移动,这个到…