02STM32软件安装新建工程
STM32软件安装&新建工程
- 1.软件安装:
- 1.1Keil5 MDK安装
- 1.2安装器件支持包
- 离线安装支持包
- 在线安装支持包
- 1.3软件注册:
- 1.4安装驱动
- STLINK驱动
- JLink驱动在此文件夹下
- USB转串口
- 2.新建工程
- 2.1STM32开发方式:
- 1.寄存器
- 2.标准库
- 3.HAL库
- 固件库压缩包说明
- 新建工程步骤
- 总体
- 建立工程文件夹
- 工程文件夹里建立Start、Library、User等文件夹
- 建立Start文件夹
- 建立User文件夹&编译器需注意的问题
- 基于寄存器开发的演示&修改字体编码等
- 建立Library文件夹 &添加文件到Keil中
- 定义USE_STDPERIPH_DRIVER
- Flash Download里勾选Reset and Run
- 库函数编程
- 1.使能时钟
- 2.配置端口模式
- 3.配置GPIO的输出电平
- 工程架构
- 主动执行的部分:
- 被动执行的部分:
1.软件安装:
安装Keil5 MDK
安装器件支持包
软件注册
安装STLINK驱动
安装USB转串口驱动
1.1Keil5 MDK安装
如果之前安装了KeilC51,可以直接选择C51的安装目录,这样两个软件可以共存了
没有的话新建文件夹Keil5就可以了(名称不要带有特殊字符和中文,国外软件,可能对中文会存在一些问题)
选好文件路径后,Pack会自动变化,直接Next即可
安装完成后会弹出是否需要安装ULINK的驱动(ULINK是Keil公司开发的调试器),点击 是 即可
1.2安装器件支持包
安装器件支持包是Keil5才需要安装的,Keil4和之前的老版本不需要安装,是因为现在ARM的芯片型号非常多,升级换代的速度也快(Keil软件不能出一款芯片就升级一下软件,而且同时支持所有型号的芯片,占用内存非常大,所以芯片的器件支持包就被独立出来了,开发哪种芯片就安装对应的支持包就好了,如果没有安装支持包,在新建工程时不会出现相应的器件型号)
现在这个软件是C51和MDK共存的情况,如果想切换为C51,只需在下拉列表中选择Legacy Device(传统设备)即可
离线安装支持包
可以用浏览器到网站上下载,下载好支持包之后再离线安装
根据要开发的器件型号选择相应的支持包,直接双击,目标路径会自动选择安装时的目录
直接点击Next即可,重新打开Keil5,会发现安装了新的支持包了
在线安装支持包
(开发其他芯片找型号很方便,防止找不到器件支持包)
点击绿色按钮,弹出的就是Pack Install界面
这里可以用来安装支持包,并且所有可以用Keil软件来开发的芯片都可以找到(就是网速较慢)
下面提示的就是正在获取的东西,右边有进度条显示进度。由于我的没联网,显示的是Cannot read
如果点进来没有自动获取,可以点更新按钮,获取最新列表
可以看到就有很多器件公司
点击安装对应器件系列的DFP文件安装,就会自动下载DFP文件并且自动安装上
1.3软件注册:
Keil必须用管理员身份运行。其余自行了解
注册成功后就可以不用管理员身份运行了
1.4安装驱动
STLINK驱动
D:\Keil_v5\ARM\STLink\USBDriver
在Keil安装目录下面有
amd64就是64位的,x86是32位的,根据电脑选择合适驱动
JLink驱动在此文件夹下
USB转串口
是ch340的驱动 CH341ESR.EXE。要注意有一些USB转串口不是用的340芯片哦
2.新建工程
2.1STM32开发方式:
1.寄存器
和51一样,程序直接控制配置寄存器。最底层,效率最高,但是由于STM32结构复杂,寄存器太多,不推荐这种开发方式
2.标准库
库函数(ST官方提供的封装好的函数,调用这些函数直接配置寄存器,由于ST对寄存器封装地比较好,这种方式既能满足对寄存器的配置,对开发人员也比较友好,有利于提高开发效率)需要库函数压缩包,即固件库的文件,标准库函数压缩包
3.HAL库
适合快速上手STM32,同时移植效果更好,但是隐藏了底层逻辑,如果对STM32不熟悉,就只能停留在很浅的水平。
推荐51用寄存器开发,STM32推荐标准库开发,后面提高效率开发再学HAL库开发,配合RTOS开发
固件库压缩包说明
STM32F10x_StdPeriph_Lib_V3.5.0 STM32标准固件库里面的文件说明:
1._htmresc文件夹 两张图片,没啥用
2.Libraries文件夹 存放的库函数文件,要用到
3.Project文件夹 官方提供的工程示例和模板,以后使用库函数的时候可以进行参考
4.Utilities文件夹 官方评估板的相关例程,官方用STM32做的一个小电路板,用来测评STM32的
5.Release_Notes.html发布文档 版本说明
6.stm32f10x_stdperiph_lib_um.chm使用手册 教如何使用这个库函数,有时间可以看
新建工程步骤
总体
1.建立工程文件夹,Keil中新建工程,选择型号
2.工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹(为添加工程文件准备的,建文件夹是因为文件比较多,需要分类管理,文件夹的名称和数量没有限制,按照自己的理解来建就可以,需要用的文件一定要复制到工程文件夹里,不要添加工程文件夹外面的文件,不然外面的文件挪位置,工程里就找不到文件。保持工程的独立性)
3.工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里(在Keil里方便管理文件,因为Keil没法直接添加文件夹,所以还得重复,在Keil里建立分组,然后添加文件)(.h文件不参加编译也添加进来的原因,因为.h文件需要经常打开看,加进来比较方便)
4.工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹(因为Start、Library等文件夹是自己建的,Keil软件并不知道,要用自己文件夹里的.h文件,就必须声明一下这个路径)
5.工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER(使用库函数的条件编译)(其他工程在这个位置还声明了 一个STM32F103X_MD的字符串,Keil5在新建工程后就自动声明好了这个,不需要再额外声明了)
6.工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run
建立工程文件夹
Keil中新建工程(文件夹名称方便改,但是工程名称不方便改),选择器件型号
Manage Run-Time Enviroment 新建工程小助手,可帮助快速新建工程,暂时不用
此时工程已建好
工程文件夹里建立Start、Library、User等文件夹
建立Start文件夹
1.Stm32的启动文件
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
全选复制粘贴到Start文件夹下
2.STM32的外设寄存器描述文件、时钟配置文件和函数
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x文件夹下
stm32f10x.h是STM32的外设寄存器描述文件;和51单片机的头文件REGX52.H一样。描述STM32有哪些寄存器和它对应的地址的
system_stmf10x.c和.h文件时用来配置时钟的,STM32主频72MHz,就是system文件里的函数配置的
stm32f10x.h、stm32f10x.h、stm32f10x.三个文件粘贴到Start文件夹下
STM32由内核和内核外围的设备组成,而且内核的寄存器描述和外围设备的描述文件不是在一起的,所以还需添加内核寄存器的描述文件
3.内核寄存器的描述文件
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
core_cm3.h和core_cm3.c两个文件
这两个文件就是内核的寄存器描述(还带了一些内核的配置函数,所以有一个.c文件)
全粘贴到Start文件夹下
建立User文件夹&编译器需注意的问题
target下添加组,改名User,新建main.c文件(注意要放到User文件夹下)
右键插入头文件
写好代码(注意最后一行要空行,要不然会报警告)
编译并建立工程(官方最新发的KeilMDK没有自带v5编译器,官方也不提供ARM Compiler5了,需要自己下载一个)
注意选择这个v5版本
此时还没有添加STM32的库函数,所以此时还是基于寄存器开发的工程
基于寄存器开发的演示&修改字体编码等
查找好对应的寄存器编写代码控制寄存器
第一个寄存器打开GPIOC的时钟、
第二个寄存器配置PC13口的模式,
第三个寄存器给PC13口输出数据
可以看出来这种方式需要不断地查手册来了解每个寄存器的每一位都是干啥的
扳手处可以选择修改编码格式(UTF-8可以防止中文乱码)、字体大小(ASM和C/C++修改大小)、tab缩进(一般选4)
建立Library文件夹 &添加文件到Keil中
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src文件夹
STM32的标准外设库驱动
但是misc.c是内核的库函数,其他是内核外的外设库的库函数
全选复制粘贴到Library文件夹下
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc
标准外设驱动库的头文件
全选复制粘贴到Library文件夹下
但是固件库的文件此时还不能直接使用,还需要
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template文件夹
stm32f10x_conf.h、stm32f10x_it.c和stm32f10x_it.h三个文件
Stm32f10x_conf.h (configuration)配置库函数头文件的包含关系的;还有用来参数检查的函数定义,这是所有库函数都需要的
Stm32f10x_it.c 和it.h 用来存放中断函数的
这三个文件复制粘贴到User目录下
工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里
选中该组,再单击即可完成改名
添加存在的文件到组里来,文件类型选择All files
启动文件有很多分类,但是我们只能添加其中一个,对应器件的FLASH内存容量大小来选择启动文件
Value Line 超值系列简写
Low Density
Medium Density
High Density
EXtra Large
Connectivity Line
剩下的C文件和头文件就都添加进来
工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹
这些文件都是STM32最基本的文件,不需要我们修改,添加就可。(文件图标带了小钥匙,意味着只读的文件)
(唯一需要更改的就是User组里的文件)
工程选项里面要添加上这个文件夹的头文件路径,否则Keil软件找不到.h文件
新建路径,把Start、User、Library的文件夹路径添加进来
可以点击此处,调整文件顺序
定义USE_STDPERIPH_DRIVER
工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER
打开"stm32f10x.h"头文件滑到最后面,此处为条件编译,如果定义了USE_STDPERIPH_DRIVER(使用标准外设驱动)这个字符串,才会包含“stm32f10x_conf.h”,需复制这个字符串粘贴到此处
Flash Download里勾选Reset and Run
工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run
默认是ULINK,要选择对应的烧录器STLINK Debugger,再点击右边的settings按钮
在FLASH download中勾选 Reset and Run。这样下载程序之后会立马复位并执行,不然下载之后还要按复位按键才能执行
库函数编程
1.使能时钟
库函数有这样一个函数RCC_APB2PeriphcClockCmd(选择外设,选择状态) //APB2外设时钟控制
可以右键调到函数定义,有函数简介和参数说明
内部其实还是配置RCC_APB2ENR这个寄存器,但是经过函数包装,可以不用去查手册来确认哪一位是干什么的。虽然代码长,但是语义更加明确,也不需要再查找计算寄存器的值了。只需要调用库函数,按照提示,把参数填好就行
2.配置端口模式
注释里的东西,没办法右键跳转,就可以查找ctrl+f,搜索定义的位置
此处转GPIO.Pin的定义时出现了一个框,说明它的定义有多个。
选择member这一项双击即可(但是这里面的原理需要细究弄清楚才行)
3.配置GPIO的输出电平
工程架构
主动执行的部分:
startup_xx.s启动文件 程序执行最基本的文件
汇编语言写的,启动文件定义了中断向量表,中断服务函数等
中断服务函数有一个复位中断,这就是整个程序的入口。上电复位或者按键复位后,程序就进入复位中断函数执行
复位中断函数主要做两个事:
1.调用SystemInit函数
2.调用main函数
对应启动文件
复位的中断函数,调用SystemInit,再调用main,然后程序结束(但是main会设置有死循环)
SystemInit函数是定义在这个system开头的.c里的
函数的作用:设置微控制器的启动,初始化嵌入式闪存接口、锁相环、更新系统内核的时钟变量
note写的这个函数仅在复位后需要调用
下面的是配置的东西。这些都不需要我们更改
只需要知道,在main函数之前,单片机就执行了一堆东西了,把闪存接口、时钟等一系列杂散的东西都配置好了
另外启动文件还定义了STM32所有的其他中断,
中断函数的定义就在stm32f10x_it里面,打开Keil可以看到
ST建议把中断写到这个位置,但写在别的地方也可以,可以哪里用就哪里写
可以自己定义一些用户文件,来封装一些模块供主函数和中断调用。有利于程序结构的模块化
被动执行的部分:
相当于STM32的资源,在主函数或者中断函数可以调用这些资源
stm32f10x.h和core.cm3.c/.h就是外设和内核外设的寄存器描述
这里面都是寄存器和寄存器每一位的名字,还有地址信息等,如果直接调用这些寄存器来使用STM32,就是寄存器的开发方式(这么多,麻烦啊)
所以ST公司提供了misc.c/.h stm32f10x_xxx.c/.h 库函数 和 stm32f10x_conf.h 库函数配置
这每个外设都提供了一大堆的函数,这些函数封装了寄存器的操作,给我们提供更加人性化的函数调用方式,只要学会了这些操作套路,那配置外设就很简单
conf.h文件就是配置头文件的包含关系,conf文件include了所有的库函数头文件。同时在stm32f10x.h最后,又包含了 stm32f10x_conf.h (conf文件),所以使用这些库函数时,只需要包含stm32f10x.h这一个头文件,就相当于包含了所有的库函数文件,这样就可以任意的调用库函数了
相关文章:

02STM32软件安装新建工程
STM32软件安装&新建工程 1.软件安装:1.1Keil5 MDK安装1.2安装器件支持包离线安装支持包在线安装支持包 1.3软件注册:1.4安装驱动STLINK驱动JLink驱动在此文件夹下USB转串口 2.新建工程2.1STM32开发方式:1.寄存器2.标准库3.HAL库 固件库压…...

社区6月月报 | Apache DolphinScheduler重要修复和优化记录
各位热爱Apache DolphinScheduler的小伙伴们,社区6月月报更新啦!这里将记录Apache DolphinScheduler社区每月的重要更新,欢迎关注。 月度Merge Stars 感谢以下小伙伴上个月为Apache DolphinScheduler所做的精彩贡献(排名不分先后…...

Docker 使用基础(2)—镜像
🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━️💟──────── 4:20 🔄 ◀️ ⏸ …...

Docker学习笔记(三)Dockerfile
一、什么是Dockerfile Dockerfile 是一个用于自动化构建 Docker 镜像的文本文件,其中包含了从一个基础镜像开始,到最终形成所需定制镜像的所有指令集。这个文件中的每一条指令都对应着构建镜像过程中的一个步骤或一层,指导 Docker 如何安装软…...
学懂C#编程:C# 索引器(Indexer)的概念及用法
C#中的索引器(Indexer)是一种特殊的成员,它允许类或结构的实例像数组那样通过索引来访问其内部的数据。索引器提供了一种灵活的方式来暴露集合或数组类型的内部数据,使得客户端代码可以使用类似于数组下标的语法来访问类的成员&am…...

汇川CodeSysPLC教程03-2-14 与HMI通信
硬件连接 PLC与HMI连接采用何种连接方式,通常是参考双方支持哪些接口。PLC(可编程逻辑控制器)与HMI(人机界面)之间的通讯方式主要有以下几种: 串行通讯(Serial Communication)&…...

centos部署jar包
第一步: 将IDEA中的项目打包为jar,将这个jar文件放到centos服务器上的目录里,我在opt新建api目录,将jar文件放入,如下图: 第二步: 将需要读取的配置文件也放入此目录(其他目录也可以,和脚本中…...

CSS相对定位和绝对定位的区别
CSS相对定位和绝对定位的区别 区别1:相对的对象不同 相对定位是相对于自己绝对定位是相对于离自己最近的有定位的祖先 区别2:是否会脱离文档流 相对定位不会脱离文档流,不会影响其他元素的位置绝对定位会脱离文档流,会影响其他元素的布局 代…...
SpringCloud之nacos共享配置文件实现多数据源灵活切换
目录 前言 1.引入Springboot相关的aop切面依赖 2.创建自定义注解DataSourceKey 3.创建对ThreadLocal类 4.创建aop切面 5.创建动态数据源类 6.创建多数据库连接配置类 7.关键代码讲解 8.nacos主要配置 前言 通过Spring AOP(面向切面编程)的功能来动…...

原生小程序生成二维码方法之一
效果图: 第一步:下载对应的包并构建(工具---》构建npm) npm install weapp-qrcode --save 第二步:在wxml页面声明canvas <canvas style"width: 200px; height: 200px;margin:0 auto;" canvas-id"myQ…...

Kubernetes k8s Pod容器 探针 健康探测
目录 Pod容器健康探测 为什么要对容器做探测? 启动探测startupprobe 存活性探测livenessProbe 就绪性探测readinessProbe ReadinessProbe LivenessProbe startupProbe配合使用示例一般程序中需要设置三种探针结合使用,并且也要结合实际情况ÿ…...

Conformal low power-2.电源感知等效性检查
电源感知等效性检查 ■ 第24页:电源感知等效性检查概述 ■ 第24页:启动低功耗(等效性检查)软件 ■ 第25页:电源感知等效性检查流程 ■ 第28页:电源感知等效性检查示例Do文件 电源感知等效性检查概述…...

【密码学】从有限状态自动机到密钥流生成器
本文是对流密码内容的拓展,在流密码中种子密钥通过一个伪随机数生成器产生一个与明文等长的伪随机密钥流。而本文的内容就是在回答这样两个问题: 伪随机密钥流是如何生成的?流密码、流密钥生成器和有限状态自动机之间是什么关系?…...

3.相机标定原理及代码实现(opencv)
1.相机标定原理 相机参数的确定过程就叫做相机标定。 1.1 四大坐标系及关系 (1)像素坐标系(单位:像素(pixel)) 像素坐标系是指相机拍到的图片的坐标系,以图片的左上角为坐标原点&a…...

Centos7 安装Docker步骤及报错信息(不敢说最全,但是很全)
一、操作系统要求: 要安装Docker Engine,您需要CentOS 7及以上的维护版本。存档版本不受支持或测试。必须启用centos临时存储库。默认情况下,此存储库已启用,但如果已禁用,则需要重新启用它。建议使用overlay2存储驱动…...
【C语言】符号优先级详解
C语言符号优先级详细解析 在C语言中,不同的运算符具有不同的优先级和结合性,这决定了在表达式中运算符的计算顺序。理解这些优先级和结合性是正确编写和理解C语言程序的基础。本文将详细解析C语言中的符号优先级,包括各类运算符的优先级、结…...

天翼云高级运维工程师202407回忆题库 最新出炉
备考天翼云高级运维工程师 必须备考天翼云 之前觉得外企牛批 然后民企,拔地而起,民企也不错,工资高,有钱途 现在看来看去,还是国企好,体制内的,有保障,树大根深 有必要备考下天…...
在Python中什么是上下文管理器以及如何使用with语句来管理资源
什么是上下文管理器? 在Python中,上下文管理器(Context Manager)是一种支持with语句的协议,允许对象管理资源,如文件、线程锁的获取和释放、数据库连接等。上下文管理器负责资源的分配和释放,确…...

(四)、python程序--贪吃蛇游戏
一、绪论 贪吃蛇游戏。 已实现功能: 1、上下左右移动; 2、吃食物,随机生成食物; 3、碰撞检测,判断是否游戏结束。 二、代码分享 1、main.py import pygame import sys import food as c_food import snake as c…...
什么是DNS欺骗
DNS欺骗(DNS Spoofing),也称为DNS缓存中毒(DNS Cache Poisoning),是一种网络攻击形式,攻击者通过操纵DNS记录,将用户重定向到一个伪造的、恶意的网站。这些恶意网站可能看起来与用户…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...