STM32 01
1、编码环境
1.1 安装keil5
1.2 安装STM32CubeMX
使用STM32CubeMX可以通过界面的方式,快速生成工程文件
安装包可以从官网下载:https://www.st.com/zh/development-tools/stm32cubemx.html#overview
安装完要注意更新一下固件包的位置,因为它的固件包比较大,默认是在C盘的,可以改在其它盘。打开软件-Help-Updater Settings,第一次打开可能会要求过几秒再打开,然后进行修改即可。


2、使用Keil5创建stm32工程
stm32需要很多文件才能正常写代码,例如主函数、中断系统函数、初始化文件、内核、启动文件、外设库函数等,所以我们需要把stm32作为一个工程来管理,在一个工程中创建几个文件夹来管理这些不同功能的函数。
在这里我把一个工程中分为以下几个文件夹:User(主函数、中断系统函数、初始化文件)、Core(内核、启动文件)、Library(官方外设库函数)、Hardware(自己编写对硬件调用部分)、System(自己写的延迟函数之类)。
先新建一个准备用来存放工程的文件夹,然后打开keil5软件,选择Project-New Project,

然后选择我们新建的工程文件夹,点进去,然后取个工程文件的名字(例如我这里取的是Project),要注意文件夹的名字后期改还可以随意,工程文件的名字后面就不能随便改了。


保存之后,根据自己的芯片选择器件型号,这里选的是STM32F103C8,因为我这里的芯片型号是stm32f103c8t6。

点击OK之后会弹出一个keil软件的一个新建工程小助手,可以帮助我们快速新建工程,不需要可以直接叉掉(我没有用,就直接叉掉了),之后就会显示新建的工程页面,现在的工程还是空的,不能直接用,还要添加一些工程必备文件。


然后来到工程文件夹中按照开头说的,建立一些专门的文件夹用来放专门的文件,在Start文件夹中放stm32启动文件、对stm32外设寄存器描述的文件(描述stm32有哪些外围寄存器以及对应的地址位置)以及用来配置时钟的system文件,在Core文件夹中存放对内核寄存器的描述文件,到这里,工程的必要文件就可以了。然后将这些都配置到工程中,选中Sorce Group 1,改成Start,和工程文件夹中我们新建的保持一致,然后右键选择添加已有文件(直接双击Start也可以),然后将文件类型改为ALL files,添加所有文件即可。然后还要在工程文件选项中加入这个文件夹的头文件路径,要不然软件是找不到.h文件的。点击魔术棒按钮,打开工程选项,在C/C++中,找到Include Paths,点击右边3个点,进去之后新建路径,把Start的路径添加进来,点击OK就可以了。然后重复上述过程把Core文件夹也添加进去就可以了。




如果要新建一个User文件夹来放main.c文件,可以在Target 1那里右键添加组,右键添加新文件,选择C文件,名字就叫main,路径选择User文件夹,要不然默认是放在文件夹外面的,

接下来,新建Library文件夹,里面又包含src和inc文件夹,用来存放stm32标准外设驱动库,src里放这些库函数的源文件,inc里放这些库函数的头文件。这时候这些库函数还不能直接使用,还要添加一个用于配置库函数头文件包含关系的文件以及两个用于存放中断函数的文件,将这些放在User文件夹中。最后还需要一个宏定义,可以在main函数的头文件右键打开这个文件,滑到最后。可以看到一个条件编译语句,如果我们定义了USE_STDPERIPH_DRIVER(标准外设驱动)这个字符串,下面这个#include "stm32f10x_conf.h"语句才有效。所以我们还需要复制USE_STDPERIPH_DRIVER这个语句,然后点魔术棒打开工程选项,在C/C++的Define添加这个字符串,这样才能包含标准外设库,也就是库函数,当然还有下面的头文件路径也不要忘了。


到此,基本工程就建立好了,点击箱子按钮还可以更改文件夹的排序。
3、使用STM32CubeMX生成工程文件
3.1 点击ACCESS TO MCU SELECTOR
点击之后会出现这样的界面

在左上角搜索对应的芯片

在右侧双击对应的芯片,就会基于这个芯片生成文件

然后我们就可以根据需要在这里进行相应的配置,比如我我要PB8和PB9的输出管脚功能

选择之后可以看到是这样的,左边可以对其进行更加具体的配置

要注意在SYS这里,原来默认的Debug是No Debug的,我们要将其改成Serial Wire,这样就可以进行重复的修改


在Project Manager这里,我们要给这次的工程取个名字,选择存储路径(不能有中文),将Toolchain/IDE改成MDK-ARM(这样改了之后,它自动生成的代码之后就会自动调用keil软件去打开这个工程项目)。

在Code Generator部分,可以选择只拷贝我们这个工程需要用到的库,选择针对外设的固件库要生成配对的.c/.h文件

都选择好之后就可以就可以点击右上角的GENERATE CODE自动生成代码了。生成完点击中间的Open Project,就会用keil自动打开这个工程了。


4、STM32单片机
4.1 什么是单片机
单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
4.2 STM系列单片机命名规则
ST——意法国半导体
M——Microelectionics微电子
32——总线宽度

4.3 标准库和HAL库的区别
4.3.1 寄存器
stm32的寄存器众多,需要经常翻阅芯片手册,费时费力;但是直接使用寄存器更具灵活性,可以随心所欲达到自己的目的;可以深入理解单片机的运行原理,知其然更知其所以然。
4.3.2 标准库
将寄存器底层操作都封装起来,提供一整套接口(API)供开发者调用;每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx...之类的;配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能;大大降低单片机开发难度,但是在不同芯片间不方便移植。
4.3.3 HAL库
ST公司目前主力推的开发方式,新的芯片已经不再提供标准库;为了实现在不同芯片之间移植代码;为了兼容所有芯片,导致代码量庞大,执行效率低下。
相关文章:
STM32 01
1、编码环境 1.1 安装keil5 1.2 安装STM32CubeMX 使用STM32CubeMX可以通过界面的方式,快速生成工程文件 安装包可以从官网下载:https://www.st.com/zh/development-tools/stm32cubemx.html#overview 安装完要注意更新一下固件包的位置,因为…...
学习笔记:【QC】Android Q - phone 模块
一、phone init 流程图 二、phone MO 流程图 三、phone MT 流程图 四、Log分析(MO_qcril_hal_分析) 1、RILJ请求dial enqueue进队列,QCRIL-hal pop出来处理,最后还是调用qmi_client_send_msg_async发送给modem 11-07 17:29:23.598 2758 2758 D RILJ …...
webscoket+webrtc实现语音通话
1.项目方案 前端采用webrtc创建音频上下文,后创建音频源输入和音频处理器,连接音频输入与处理器,处理器再连接到音频输出(扬声器),再通过事件获取音频数据,把音频数据转换成字节数据通过webscok…...
PHP源码_众筹商城
众筹商城源码 众筹商品平台 商城加共识元富之路 网上商城众筹 前端是编译后的,后端PHP,带商城 运行截图 源码贡献 https://githubs.xyz/boot?app39 部分数据库表 CREATE TABLE ti_shopro_store (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,nam…...
智能小程序 Ray 开发——表单组件 Button 和 Checkbox 实操讲解
Button 多端按钮基础组件,可用于进行强交互的操作。 导入 import { Button } from ray-js/ray; 属性说明 属性类型默认值必填说明支持平台sizekeyof Sizedefault否按钮的大小涂鸦、微信typekeyof Typedefault否按钮的样式类型涂鸦、微信plainbooleanfalse否按钮…...
渗透之sql注入联合查询的注入
sql注入产生的原因: 由于程序过滤不严谨,导致用户有一些异常输入,最终触发数据库的查询。所以会出现sql注入这个问题。有些恶意的人就会利用这些信息导致数据库泄露。 注意:一般我们存在注入点我们会查询管理员的账号和密码&#…...
NLP transformers - 文本分类
Text classification 文章目录 Text classification加载 IMDb 数据集Preprocess 预处理EvaluateTrainInference 本文翻译自:Text classification https://huggingface.co/docs/transformers/tasks/sequence_classification notebook : https://colab.research.googl…...
QT 开发COM(ActiveX)组件基础介绍和方案验证
一、COM简介 1.1 COM是什么? COM,Component Object Model,即组件对象模型,是一种以组件为发布单元的对象模型,这种模型使各软件组件可以用一种统一的方式进行交互。COM 既提供了组件之间进行交互的规范,也…...
[1673]jsp在线考试管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 JSP 在线考试管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…...
每日一算法
问题 等待登机的你看着眼前有老有小长长的队伍十分无聊,你突然 想要知道,是否存在两个年龄相仿的乘客。每个乘客的年龄用 1个0 到 36500 的整数表示,两个乘客的年龄相差 365 以内 就认为是相仿的。 具体来说,你有一个长度为 n 的…...
Spring Cloud Gateway直接管理Vue.js的静态资源
1. 构建Vue.js应用 像之前一样,构建你的Vue.js应用,并将生成的静态资源(位于dist目录)复制到Spring Boot项目的某个目录,比如src/main/resources/static。 2. 配置Spring Boot静态资源处理 Spring Boot默认会处理sr…...
14.集合、常见的数据结构
集合 概念 Java中的集合就是一个容器,用来存放Java对象。 集合在存放对象的时候,不同的容器,存放的方法实现是不一样的, Java中将这些不同实现的容器,往上抽取就形成了Java的集合体系。 Java集合中的根接口&#x…...
NLP从入门到实战——命名实体识别
1. 命名实体识别 1.1 概念 中文命名实体识别(Named Entity Recognition,NER是指识别中文文本中实体的边界和类别。命名实体识别是文本处理中的基础技术,广泛应用在自然语言处理、推荐系统、知识图谱等领域,比如推荐系统中的基于…...
接口测试工具-postman介绍
一、介绍 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。 作用:常用于进行接口测试。 它可以模拟浏览器发起任何形式的HTTP请求...
日志中看到来自User Agent go-http-client / 1.1的大量请求(go-http-client 1.1)服务器爆了
在日志中看到来自User Agent go-http-client / 1.1的大量请求 The go-http-client/1.1 User Agent 是Google的Bot / Crawler 这不是真的。这可能是指Go库(根据您提到的来源,由Google开发,但是我找不到可靠的信息)。 之前写过“G…...
yolov8 区域声光报警+计数
yolov8 区域报警计数 1. 基础2. 报警功能2. 1声音报警代码2. 2画面显示报警代码 3. 完整代码4. 源码 1. 基础 本项目是在 yolov8 区域多类别计数 的基础上实现的,具体区域计数原理可见上边文章 2. 报警功能 设置一个区域region_points,当行人这一类别…...
《QT实用小工具·五十五》带有标签、下划线的Material Design风格输入框
1、概述 源码放在文章末尾 该项目实现了一个带有标签动画、焦点动画、正确提示、错误警告的单行输入框控件。下面是demo演示: 项目部分代码如下所示: #ifndef LABELEDEDIT_H #define LABELEDEDIT_H#include <QObject> #include <QWidget>…...
用Go实现一个无界资源池
写在文章开头 我们希望通过go语言实现一个简单的资源池,而这个资源池的资源包括但不限于: 数据库连接池线程池协程池网络连接池 只要这些资源实现我们指定的关闭方法,则都可以通过我们封装的资源池进行统一管理,需要简单说明一下这个资源池…...
Apache Seata基于改良版雪花算法的分布式UUID生成器分析2
title: 关于新版雪花算法的答疑 author: selfishlover keywords: [Seata, snowflake, UUID, page split] date: 2021/06/21 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 关于新版雪花算法的答疑 在上一篇关于新版雪花算法的解析中…...
13、揭秘JVM垃圾回收器:面试必备知识,你掌握了吗?
13.1、前文回顾 在上一篇文章中,我们详细分析了触发Minor GC的时机,以及对象何时会从新生代迁移到老年代。我们还讨论了为了确保新生代向老年代的内存迁移安全,需要在Minor GC之前如何检查老年代的内存空间,以及在什么情况下会触发老年代的Full GC,以及老年代的垃圾回收算…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
