当前位置: 首页 > article >正文

[STM32]新建工程||一个工程文件应该有哪些基本内容?

目录

一 、开发方法

1.直接使用程序来配置寄存器

2.基于库函数的方式

3.基于HAL库的方式

二 、常规的工程文件分类

STM32芯片型号分类以及缩写

​三 步骤总结

四 工程架构

五 调用外设基本通用步骤


一 、开发方法

1.直接使用程序来配置寄存器

底层,直接,效率高,但是较为复杂。

在计算机体系结构中,寄存器是用于存储和处理数据的小型高速存储器。直接使用程序来配置寄存器通常是通过汇编语言或内嵌汇编(inline assembly)实现的。以下是一个简单的示例,展示了如何使用x86汇编语言直接设置寄存器的值:


section .data; 定义一个常量,表示要设置的寄存器编号register_num = 0x1234section .textglobal _start_start:; 将寄存器编号转换为对应的立即数immediate_value = register_num; 使用内嵌汇编设置寄存器的值mov [register_address + immediate_value], al; 退出程序mov eax, 1xor ebx, ebxint 0x80

在这个例子中,我们首先定义了一个名为register_num的常量,表示要设置的寄存器编号。然后,在_start标签下,我们将寄存器编号转换为对应的立即数(immediate_value),并使用内嵌汇编(mov指令)将该值写入到指定的内存地址(register_address)。最后,我们使用xor和int指令退出程序。

请注意,这个示例仅适用于x86架构的计算机。对于其他架构(如ARM、MIPS等),代码将有所不同。此外,直接操作寄存器通常需要对底层硬件有较深入的了解,因此请谨慎操作。

2.基于库函数的方式

使用ST官方封装好的函数库,通过调用函数间接调用寄存器。

3.基于HAL库的方式

基于图形化界面快速配置。

二 、常规的工程文件分类

在嵌入式开发中,为了方便管理和维护工程代码,可以按照以下规范设置工程内的文件夹:
  1. Inc文件夹:用于存放头文件,包括库文件的头文件和自己编写的头文件。
  2. Src文件夹:用于存放源文件,包括库文件的源文件和自己编写的源文件。
  3. Lib文件夹:用于存放第三方库文件,如CMSIS、HAL库等。
  4. Doc文件夹:用于存放文档,包括工程说明、接口文档、用户手册等。
  5. Test文件夹:用于存放测试代码,包括单元测试、集成测试等。
  6. Build文件夹:用于存放编译生成的中间文件和可执行文件。
  7. Config文件夹:用于存放配置文件,包括编译选项、链接选项、调试选项等。
  8. Tools文件夹:用于存放工具脚本,如自动化构建脚本、自动化测试脚本等。
以上是一种比较常见的文件夹设置规范,可以根据实际情况进行调整和扩展。在设置文件夹时,还需要注意以下几点:
  1. 文件夹命名要简洁明了,尽量使用英文单词或缩写。
  2. 文件夹层次要清晰,避免过深嵌套。
  3. 文件夹内文件要分类存放,避免混乱。
  4. 保持统一性,不同工程的文件夹设置应该尽量保持一致。
总之,规范的文件夹设置可以提高工程代码的可读性和可维护性,减少错误和重复工作,提高开发效率。

STM32芯片型号分类以及缩写

根据下面的表格,选择对应型号和Flash容量的启动凡是
缩写
释义
Flash容量
型号
LD_VL
小容量产品超值系列
16~32K
STM32F100
MD_VL
中容量产品超值系列
64~128K
STM32F100
HD_VL
大容量产品超值系列
256~512K
STM32F100
LD
小容量产品
16~32K
STM32F101/102/103
MD
中容量产品
64~128K
STM32F101/102/103
HD
大容量产品
256~512K
STM32F101/102/103
XL
加大容量产品
大于512K
STM32F101/102/103
CL
互联型产品
-
STM32F105/107

 三 步骤总结

建立工程文件夹,Keil中新建工程,选择芯片型号

  1. 工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
  1. 工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里点击魔术棒按钮添加路径,一定要将所需文件放到工程文件夹,不然一旦文件挪动文件将会丢失。.h文件一般是不参与编译的,但是加入.h文件后方便查阅。
  1. 工程选项->C/C++->Include Paths内声明所有包含头文件的文件夹
  1. 工程选项->C/C++->Define内定义USE_STDPERIPH_DRIVER,使用函数必须定义,(使用标准外设驱动)
  1. 工程选项->Debug->下拉列表选择对应调试器->Settings->Flash Download里勾选Reset and Run
  1. 在此解决中文乱码的问题:Configeration->Editor->Encoding->~~UTF-8~~~

 

  • 配置调试模式,修改成ST-LinkDebugger

四 工程架构

startup_xx.s是启动文件,是程序执行最基本的文件,其中定义了中断向量表,中断服务等函数,

复位中断是程序入口,stm32在上电复位或者按键复位后就会出发复位中断,进而执行调SystemInit,调用main函数,SystemInit函数定义在system_xx.c/.h中。

以上就是主动执行的部分,此外还有被动执行的部分,库函数文件帮助我们实现对寄存器的封装,省去了大部分操作,库函数配置函数用来配置头文件包含关系,

五 调用外设基本通用步骤

基于标准库调用STM32的外设一般需要以下步骤:
  1. 配置外设的时钟:首先,需要配置外设所需的时钟源和时钟频率。这可以通过RCC(Reset and Clock Control)函数来完成。具体的步骤包括选择合适的时钟源设置时钟分频器
  2. 初始化外设的引脚:外设通常需要与微控制器的引脚进行连接。因此,需要配置相应的引脚功能和模式,以使其与外设进行通信。这可以通过GPIO(General Purpose Input/Output)函数来完成。
  3. 配置外设的参数:根据外设的要求,需要配置一些参数,例如数据传输模式、数据位宽、时钟极性和相位等。这可以通过外设的寄存器进行配置。
  4. 初始化外设:在配置完参数后,需要初始化外设。这可以通过外设的初始化函数来完成,该函数将设置外设的寄存器以使其处于预定的工作状态。
  5. 使用外设:一旦外设初始化完成,就可以使用外设进行数据传输或执行其他操作。这可以通过外设的读写寄存器、调用相应的函数或使用中断来实现。
需要注意的是,具体的步骤可能会根据不同的外设和使用的库而有所差异。因此,在使用特定的外设之前,建议查阅相关的文档和参考资料,以了解正确的配置和使用方法。

相关文章:

[STM32]新建工程||一个工程文件应该有哪些基本内容?

目录 一 、开发方法 1.直接使用程序来配置寄存器 2.基于库函数的方式 3.基于HAL库的方式 二 、常规的工程文件分类 STM32芯片型号分类以及缩写 ​三 步骤总结 四 工程架构 五 调用外设基本通用步骤 一 、开发方法 1.直接使用程序来配置寄存器 底层,直接&…...

Unity利用噪声生成动态地形

引言 在游戏开发中,地形是构建游戏世界的基础元素之一。传统的地形创建方法通常依赖于手动建模或预设资源,这种方式虽然精确但缺乏灵活性,且工作量巨大。而使用噪声算法生成地形则提供了一种程序化、动态且高效的解决方案。本文将详细介绍如…...

浅谈StarRocks SQL性能检查与调优

StarRocks性能受数据建模、查询设计及资源配置核心影响。分桶键选择直接决定数据分布与Shuffle效率,物化视图可预计算复杂逻辑。执行计划需关注分区裁剪、谓词下推及Join策略,避免全表扫描或数据倾斜。资源层面,需平衡并行度、内存限制与网络…...

java 中散列表(Hash Table)和散列集(Hash Set)是基于哈希算法实现的两种不同的数据结构

在 Java 中,散列表(Hash Table)和散列集(Hash Set)是两种不同的数据结构,但它们都基于哈希表的原理来实现。下面是它们的联系与区别、实现类以及各自的优缺点,并用表格进行对比整理。 联系与区…...

python编写的一个打砖块小游戏

游戏介绍 打砖块是一款经典的街机游戏,玩家控制底部的挡板,使球反弹以击碎上方的砖块。当球击中砖块时,砖块消失,球反弹;若球碰到挡板,则改变方向继续运动;若球掉出屏幕底部,玩家失…...

【菜鸟飞】通过vsCode用python访问公网deepseek-r1等模型(Tocken模式)

目标 通过vsCode用python访问deepseek。 环境准备 没有环境的,vscode环境准备请参考之前的文章,另外需安装ollama: 【菜鸟飞】用vsCode搭建python运行环境-CSDN博客 AI入门1:AI模型管家婆ollama的安装和使用-CSDN博客 选读文章…...

Figma介绍(基于云的协作式界面设计工具,主要用于UI/UX设计、原型制作和团队协作)

文章目录 注册和登录简单操作说明Figma介绍**核心特点**1. **云端协作与实时同步**2. **跨平台兼容**3. **高效设计工具**4. **原型交互与动效**5. **开发对接友好**6. **插件生态**7. **版本控制与历史记录** **适用场景**- **团队协作**:远程团队共同设计、评审、…...

Text-to-SQL将自然语言转换为数据库查询语句

有关Text-To-SQL方法,可以查阅我的另一篇文章,Text-to-SQL方法研究 直接与数据库对话-text2sql Text2sql就是把文本转换为sql语言,这段时间公司有这方面的需求,调研了一下市面上text2sql的方法,比如阿里的Chat2DB,麻…...

什么是 Fisher 信息矩阵

什么是 Fisher 信息矩阵 Fisher 信息矩阵是统计学和机器学习中一个重要的概念,它用于衡量样本数据所包含的关于模型参数的信息量。 伯努利分布示例 问题描述 假设我们有一个服从伯努利分布的随机变量 X X X,其概率质量函数为 P ( X ...

XSS漏洞靶场---(复现)

XSS漏洞靶场—(复现) 反射型 XSS 的特点是攻击者诱导用户点击包含恶意脚本的 URL,服务器接收到请求后将恶意脚本反射回响应页面,浏览器执行该脚本从而造成攻击,恶意脚本不会在服务器端存储。 Level 1(反射型XSS) 此漏…...

基于ssm的电子病历系统(全套)

一、系统架构 前端:jsp | bootstrap | jquery 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat | idea 二、代码及数据库 三、功能介绍 01. 登录 02. 主页 03. 管理员-个人中心-修改密码…...

Linux-数据结构-线性表-单链表

一.链表的概念 【1】线性表的链式存储 解决顺序存储的缺点,插入和删除,动态存储问题。 【2】特点: 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存…...

基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别

【由于之前学习MyBatis的时候是跟着视频敲的纯MyBatis项目,以至于在突然看到别人在SpringBoot项目里搭建MyBatis方式的时候很懵比…特此文字形式记录一下区别(应该还有好多种其他方式是我不知道的,主要应该就是要知道关键的流程步骤&#xff…...

通过 Python 爬虫提高股票选股胜率

此贴为Python爬虫技术学习贴 在股票中,即便有了选股规则,从5000多只股票中筛选出符合规则的股票也是十分困难的,于是想通过爬虫来实现自动化的快速选股。全文用GP代替股票 实现方案 1、指定两套规则,第一套弱约束,第…...

OpenEuler20.3 安装 Elasticsearch7.17

1、下载elasticsearch wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.17-linux-x86_64.tar.gz wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.17-linux-x86_64.tar.gz.sha512 shasum -a 512 -c elasticsea…...

大数据学习(68)- Flink和Spark Streaming

🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...

Fastdata极数:中国民宿行业发展趋势报告2025

2024年,中国游客出行次数大幅上涨,旅游相关支出也复苏强劲。2025年中国旅游业还将持续稳健的复苏及增长。同时,中国旅游业将见证一场深刻的变革,这场变革的推动力是消费者对旅游期望的转变,经济因素和年轻人全新价值观…...

图论——广度优先搜索实现

99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述 第一行包含两个整数 N, M,表示矩阵的行数和列数。 后续 N 行,每行…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(6)

1.问题描述: 使用华为内置的MapComponent, 发现显示不出来。查看日志, MapRender底层有报错。 解决方案: 麻烦按以下步骤检查下地图服务,特别是签名证书指纹那部分。 1.一般没有展示地图,可能和没有配置…...

【MySQL】B树和B+树的区别?MySQL为什么选用B+树作为索引数据结构?

B树和B树的区别: 结构方面: 1.节点存储内容: B树: 节点同时存储索引和数据。B树:只有叶子节点存储数据记录或指向数据记录的指针,非叶子节点只存键值,用于索引。 B 树的非叶子节点可以存储更…...

鸿蒙路由 HMrouter 配置及使用一

1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中,配置useNormalizedOHMUrl属性为true (我这项目创…...

ERC-6909 最小多代币标准

ERC-6909 Token标准是 ERC-1155 Token标准的一种简化替代方案。 ERC-1155 标准引入了一种多Token接口,使得单个智能合约能够结合可替代的和不可替代的Token(即,​ERC20 和 ERC721)。 ERC-1155 解决了多个挑战,例如降…...

各省水资源平台 水资源遥测终端机都用什么协议

各个省水资源平台 水资源遥测终端机 的建设大部分从2012年开始启动,经过多年建设,基本都已经形成了稳定的通讯要求;河北瑾航科技 遥测终端机,兼容了大部分省市的通讯协议,如果需要,可以咨询和互相学习&…...

需求分析、定义、验证、变更、跟踪(高软47)

系列文章目录 需求分析、定义、验证、变更、跟踪 文章目录 系列文章目录前言一、需求分析二、需求定义三、需求验证四、需求变更五、需求跟踪六、真题总结 前言 本节讲明需求分析、定义、验证、变更、跟踪相关知识。 一、需求分析 二、需求定义 三、需求验证 四、需求变更 五、…...

从零开始 | C语言基础刷题DAY3

❤个人主页&#xff1a;折枝寄北的博客 目录 1.打印3的倍数的数2.从大到小输出3. 打印素数4.打印闰年5.最大公约数 1.打印3的倍数的数 题目&#xff1a; 写一个代码打印1-100之间所有3的倍数的数字 代码&#xff1a; int main(){int i 0;for (i 1; i < 100; i){if (i % …...

PostreSQL指南-内幕探索-学习笔记-01-数据库集簇的逻辑与物理结构

目录 一、环境信息 二、参考内容 三、逻辑结构概念 四、物理结构概念 五、逻辑映射关系 1、数据库与oid映射关系 2、堆表对象与oid映射关系 五、物理映射关系 1、数据库与oid映射关系 2、堆表对象与oid映射关系 六、数据库文件布局 1、表格 2、postmaster.pid文件解…...

docker入门篇

使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台&#xff0c;它可以让开发者将应用程序及其依赖打包到一个容器中&#xff0c;然后在任何环境中运行这个容器&#xff0…...

Unity Shader - UI Sprite Shader之简单抠图效果

Sprite抠图效果&#xff1a; 前言 在PhotoShop中我们经常会用到抠图操作&#xff0c;现在就用Shader实现一个简单的抠图效果。 实现原理&#xff1a; 使用当前像素颜色与需要抠掉的颜色相减作比较&#xff0c;然后与一个指定的阈值比较以决定是否将其显示出来&#xff1b; U…...

本地仓库设置

将代码仓库初始化为远程仓库&#xff0c;主要涉及在服务器上搭建 Git 服务&#xff0c;并将本地代码推送到服务器上。以下是详细的步骤&#xff1a; 1. 选择服务器 首先&#xff0c;你需要一台服务器作为代码托管的远程仓库。服务器可以是本地服务器、云服务器&#xff0c;甚…...

30、Vuex 为啥可以进行缓存处理

Vuex 状态管理基础与缓存的关联 Vuex 的核心概念&#xff1a; Vuex 主要由五个部分组成&#xff1a;state、mutations、actions、getters和modules。其中&#xff0c;state是存储数据的地方&#xff0c;类似于一个全局的数据仓库。在这个菜谱 APP 的例子中&#xff0c;缓存的数…...