stm32学习笔记-2 软件安装及创建工程

news2024/11/16 20:22:39

2 软件安装及创建工程

[toc]

注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。
注:工程及代码文件放在了本人的Github仓库。


2.1 软件安装

软件安装的步骤有:

  1. 安装Keil5 MDK。Keil5 MDK专门用于给ARM系列单片机进行编程,而之前的Keil5 C51是用来给51系列的单片机进行编程的。
  2. 安装器件支持包。只有Keil5才需要这一步,Keil4及之前的版本都不需要。因为现在的ARM芯片层出不穷,不可能每出一款新的芯片就升级整个软件,于是就将芯片的支持包单独拎出来,需要开发那个芯片就安装哪个器件支持包。若不安装器件支持包,那么在创建工程时不会出现对应的芯片型号。

方式一:离线安装。去Keil公司官网的器件支持包下载页面选择对应的公司及器件型号,然后在Device Family Pack文本框中点击“Download”。下载完成后在本地直接点击.pack文件进行安装即可。这个文件会自动识别Keil5文件的安装目录。
方式二:在线安装,速度取决于网速。打开Keil软件点击“Pack Installer”,等待支持的公司及器件列表加载完成。STMicroelectronics公司列表下包含了所有的STM32芯片型号,而GigaDevice公司、MindMotion公司对于国产STM32芯片的兼容都很不错。然后在右侧的_DFP文件后点击“Install”即可。

  1. 软件注册。不破解可能可能会有一些限制,如代码不能超过多少行等。破解软件可以按照UP主提供的百度网盘链接获取,也可以找淘宝店家索取。本质上是根据电脑ID生成密钥。注意破解时勾选ARM选项。
  2. 安装STLINK驱动。可与先将STLINK插入电脑上,看看设备管理器是否识别,若不识别才需要进行后续的操作。STLINK的驱动安装文件在“Keil安装目录→ARM→STLINK→USBDriver→dpinst_amd64.exe(x86是32位的)”;JLINK的驱动安装文件则在“Keil安装目录→ARM→Segger→JLink.exe”。
  3. 安装USB转串口驱动。与之前51单片机相同,同样可以先插上看设备管理器能否识别。若不能识别可以直接尝试系统自动安装,或者根据UP提供的“USB转串口CH340驱动”软件安装。

2.2 STM32的开发方式

目前STM32的开发方式主要有:

  1. 基于寄存器。与51单片机开发流程相同,用程序直接配置寄存器来实现功能。这种方式最底层、最直接、效率最高,但由于STM32结构复杂、寄存器太多,这种方式不推荐。
  2. 基于标准库(库函数)。使用ST官方提供的封装好的库函数,通过调用这些函数来间接的配置寄存器。由于ST公司对寄存器封装的比较好,所以这种方式不仅可以满足寄存器配置,还可以提升开发效率。也是本节课程使用的方法。
  3. 基于HAL库。可以使用图形化界面快速配置STM32,适合快速上手STM32。但这种方式隐藏了底层逻辑,不利于对STM32的进一步学习。推荐学习完库函数的方式后,再去了解这种开发方式,可以极大的提升开发效率。

使用库函数进行开发,需要准备STM32库函数。这个库函数由ST公司提供(注意上面的器件支持包是Keil公司提供,不要搞混了),然后参考CSDN博文 “STM32固件库的下载” 便可以找到自己芯片所对应的固件库。要是嫌麻烦可以直接跳转到最后的下载页面,选择对应的版本后(本教程用的是3.5.0)便可以下载。当然,贴心的UP主提供了STM32F10x标准外设库的压缩包“STM32F10x_StdPeriph_Lib_V3.5.0”,解压后文件如下图所示:

图2-1 “STM32F10x_StdPeriph_Lib_V3.5.0”固件库解压后文件
  1. _htmresc:存放两个图片,没啥用。
  2. Libraries:存放库函数的文件。
  3. Project:官方提供的工程示例和模板,使用库函数的时候可以参考。
  4. Utilities:STM32官方评估板的相关例程,这个评估板是STM32官方自己做的小电路板,专门用于测评STM32。
  5. Release_Notes.html:库函数的发布文档,有一些版本说明。
  6. stm32f10x_stdperiph_lib_um.chm:使用手册,说明如何使用库函数。

2.3 创建工程-基于寄存器

新建工程步骤:

  1. 建立工程文件夹,Keil中新建工程,选择型号。
  2. 工程文件夹里建立Start、User文件夹,复制固件库里面的文件到工程文件夹。
  • Start部分1:启动文件,位于固件库文件夹“.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”。STM32的程序从启动文件执行。
  • Start部分2:位于固件库目录“.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”的三个文件。“stm32f10x.h”描述STM32外设寄存器及其对应的地址,作用相当于51单片机中的头文件“REGX52.h”。“system_stm32f10x.h”、“system_stm32f10x.c”主要用于配置时钟,比如配置STM32的主频为72MHz。
  • Start部分3:位于固件库目录“.\Libraries\CMSIS\CM3\CoreSupport”的两个文件。“core_cm3.h”、“core_cm3.c”是内核寄存器的描述文件,并且还带了一些内核的配置函数。
  • User文件夹:存放用户编写的main.c等文件。
  1. 工程里对应建立Start、User等同名称的分组,然后将文件夹内的文件添加到工程分组里。
  • Strart分组:注意启动文件的选择,只需根据下表选择其中一个.s文件。
  • User分组:注意添加main.c文件时,路径要选上User文件夹,否则默认路径在文件外。下面给出main.c文件中的代码:
#include "stm32f10x.h"                  // Device header
int main(void){
 while(1){
 }
}
//注意最后一行必须是空着
  1. 工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹,否则软件找不到.h文件。
  • 点击魔术棒按钮 → C/C++ → Include Path → 右侧的三个点按钮,添加对应的文件夹即可。
  1. 要使用STLINK下载程序的话,需要在“魔术棒 → debug → use → ST-Link Debugger”,然后进一步点击右侧的“settings”,在第一个界面“debug”的port选择SW,在第三个界面“Flash Download”勾选Reset and Run”。
  2. 最后进行编译,通过。点击编译按钮右侧的“Download”按钮,便可以将程序下载在开发板上。
  • 若报错,可以试一下点击魔法棒,target → ARMCompiler选择V5.06。
  • 注:为了防止乱码问题,可以在扳手工具那里选择UTF-8编码。

工程到目前为止搭建完成。下面展示如何 基于寄存器,点亮LED。

图2-2 STM32F03C8T6核心板LED原理图

根据上图,核心板上的LED一个连接着GND作为电源指示灯(上电常亮),另一个LED灯则连接STM32芯片的 引脚2-PC13 上。所以现在应该控制PC13引脚的高低电平:

#include "stm32f10x.h"                  // Device header

int main(void){
  //配置RCC寄存器,使能GPIOC的时钟。GPIO都属于APB2外设
  RCC->APB2ENR = 0x00000010;
  //配置寄存器PC13:通用推挽输出模式、输出模式50MHz
  GPIOC->CRH = 0x00300000;
  //输出数据寄存器PC13:
  GPIOC->ODR = 0x00002000;//LED灭
//  GPIOC->ODR = 0x00000000;//LED亮
  while(1){}
}

通过编写代码发现,基于寄存器开发STM32有2大弊端:

  1. 编程过程中需要不断翻看参考手册查看每个寄存器的每一位都是干什么的,十分的繁琐。
  2. 上述点灯过程中,将寄存器的其他15位输出都配置成立0,会影响其他端口的原有配置。若采用&=|=的方式会更加麻烦。
图2-3 “基于寄存器点亮LED”代码调用

2.4 创建工程-基于库函数

新建工程步骤:

  1. 建立工程文件夹,Keil中新建工程,选择型号。
  2. 工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹。
  3. 工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里。
  4. 工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹。
  5. 工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER。
  6. 工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run。

基于库函数的开发方式,就是在上述“基于寄存器”开发的基础上,真正引入库函数,并创建文件夹“Library”单独存放。新建工程步骤:

  1. 建立工程文件夹,Keil中新建工程,选择型号。
  2. 工程文件夹里建立Start、User、Library文件夹,复制固件库里面的文件到工程文件夹。
  • Start部分1:启动文件,位于固件库文件夹“.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”。STM32的程序从启动文件执行。
  • Start部分2:位于固件库目录“.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”的三个文件。“stm32f10x.h”描述STM32外设寄存器及其对应的地址,作用相当于51单片机中的头文件“REGX52.h”。“system_stm32f10x.h”、“system_stm32f10x.c”主要用于配置时钟,比如配置STM32的主频为72MHz。
  • Start部分3:位于固件库目录“.\Libraries\CMSIS\CM3\CoreSupport”的两个文件。“core_cm3.h”、“core_cm3.c”是内核寄存器的描述文件,并且还带了一些内核的配置函数。
  • Library部分1:位于固件库目录“.\Libraries\STM32F10x_StdPeriph_Driver\src”。其中的misc.c是内核的库函数,其他的都是内核外的外设库函数。
  • Library部分2:位于固件库目录“.\Libraries\STM32F10x_StdPeriph_Driver\inc”。是上述库函数的头文件。
  • User部分1:存放用户编写的main.c等文件。
  • User部分2:位于固件库目录“.\Project\STM32F10x_StdPeriph_Template”中的三个文件。“stm32f10x_conf.h”用于配置库函数头文件的包含关系,并且也有用于参数检查的函数定义,所有的库函数都需要。“stm32f10x_it.h”、“stm32f10x_it.c”这两个文件用于存放中断函数。
  1. 工程里对应建立Start、User、Library等同名称的分组,然后将文件夹内的文件添加到工程分组里。
  • Strart分组:注意启动文件的选择,只需根据下表选择其中一个.s文件。
  • User部分1:注意添加main.c文件时,路径要选上User文件夹,否则默认路径在文件外。下面给出main.c文件中的代码:
#include "stm32f10x.h"                  // Device header
int main(void){
 while(1){
 }
}
//注意最后一行必须是空着
  • User部分2:配置宏定义。要想使"stm32f10x_conf.h"被添加进来,从而使得所有的库函数定义生效,需要宏定义USE_STDPERIPH_DRIVER。右击"stm32f10x.h"滑倒最下面,可以看见此条定义语句。打开“魔术棒 → C/C++ → Define项目栏粘贴 USE_STDPERIPH_DRIVER → OK”。
  1. 工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹,否则软件找不到.h文件。
  • 点击魔术棒按钮 → C/C++ → Include Path → 右侧的三个点按钮,将三个文件夹都添加进来。
  1. 要使用STLINK下载程序的话,需要在“魔术棒 → debug → use → ST-Link Debugger”,然后进一步点击右侧的“settings”,在第一个界面“debug”的port选择SW,在第三个界面“Flash Download”勾选Reset and Run”。
  2. 最后进行编译,通过。点击编译按钮右侧的“Download”按钮,便可以将程序下载在开发板上。
  • 若报错,可以试一下点击魔法棒,target → ARMCompiler选择V5.06。
  • 注:为了防止乱码问题,可以在扳手工具那里选择UTF-8编码。
  • 小技巧:点击“三个箱子”按钮,可以改变组函数顺序。

工程到目前为止搭建完成。库函数本质上也是间接配置寄存器,所以总体步骤和上面基于寄存器点灯相似。下面展示如何 基于库函数,点亮LED。

#include "stm32f10x.h"                  // Device header

int main(void){
  //1.开启GPIOC的外设时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  //2.配置寄存器PC13的端口模式
  // 2.1首先配置GPIO结构体
  GPIO_InitTypeDef GPIO_InitStructure;//给结构体起名字
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; //寄存器模式为通用推挽输出
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13;      //寄存器引脚为13
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度为50MHz
  // 2.2然后才能调用函数配置寄存器
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  //3.配置数据寄存器PC13的输出
  GPIO_SetBits(GPIOC, GPIO_Pin_13);   //将PC13设置为高电平,LED灭
//  GPIO_ResetBits(GPIOC, GPIO_Pin_13); //将PC13设置为低电平,LED亮
  while(1){}
}

代码调用本质上就一个User文件夹里面的main.c函数,其他的都是复制的,所以在这里就不展示了。

2.5 工程架构

图2-4 STM32工程架构
  • startup_xx.s:启动文件。程序执行最基本的文件,使用汇编语言编写,规定了在复位中断函数中,首先执行SystemInit文件,再执行主函数mian。还定义了所有的中断向量表、中断服务函数。
  • 复位中断:整个程序的入口。当STM32上电复位/按下复位键之后,程序就会进入复位中断函数执行。复位中断函数首先执行SystemInit文件,再执行主函数mian,并且在执行过程中,可以被其他中断所打断。当然实际上单片机工作永远不会结束,所以主函数一般会让程序在最后停留在死循环while(1)中。
  • system_xx.c/.h:包含了SystemInit的具体执行代码。
  • main.c:包含了主函数的具体执行代码。
  • stm32f10x_it.c/.h:定义了所有中断函数的底层代码。
  • 其他用户文件:用户可以自己定义其他文件进行模块化编程。

最右侧的寄存器描述和库函数定义属于被动执行的部分,相当于STM32的资源,是所有文件在执行过程中都有可能调用的。

  • 内核和外设寄存器描述:定义了寄存器及每一位寄存器的名字、地址信息等,但是直接调用寄存器实现某功能是非常麻烦的。
  • 库函数:ST公司针对每一个外设都提供了一大堆函数,这些函数都封装了对于寄存器的操作,所以熟练掌握这些函数的调用套路,甚至于不需要了解器件手册,就可以很方便的实现相应的功能。
  • 库函数配置:配置头文件的包含关系,包含了所有的库函数。而右键添加的“stm32f10x.h”则包含了这个库函数的配置,所以main函数中主只需要声明这一个头文件即可。

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

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

相关文章

网络安全规划实践

在企业IT战略规划方面,很多时候我们会自动忽略网络安全规划,一是不够重视,从公司到技术部门,对网络安全的认识有限,重视不够,不愿意花钱。 二是技术部门自身原因,不愿意多花成本和精力去规划&am…

推荐14款最受欢迎的3d建模软件

最好的 3D 建模软件可以毫不费力地设计出最奇特的创意,并将它们变成令人惊叹的 3D 可视化效果。如果您确切知道要设计的模型类型,请查看此 3D 建模软件列表,比较 15 种一流的 3D 建模平台,然后选择最适合您的一款。最佳 3D 建模软…

金兔迎福报、新春第一炮【2022 中国开源年度报告】!

【中国开源年度报告】由开源社从 2015 年发起,是国内首个结合多个开源社区、高校、媒体、风投、企业与个人,以纯志愿、非营利的理念和开源社区协作的模式,携手共创完成的开源研究报告。后来由于一些因素暂停,在 2018 年重启了这个…

【王道数据结构】第一章 | 绪论 | 数据结构与算法的概念

目录 1.1数据结构的基本概念 1.2数据结构的三要素 1).数据的逻辑结构: 2).数据的存储结构(物理结构): 3).数据的运算 4).数据类型和抽线数据类型 1.3算法的基本概念 1.4 空间…

人大金仓数据库分区表

分区表 声明式创建分区 按列创建分区(PARTITION BY LIST) 将学员表student按所在城市使用partition by list创建分区 创建分区表(基表) 创建格式 create table 表名(字段名 数据类型)PARTITION BY LI…

Redis哨兵工作原理 | 黑马Redis高级篇

哨兵的作用 Redis提供了哨兵机制来实现主从集群的自动故障恢复 监控:sentinel会不断检查master和slave是否按照预期工作 自动故障恢复:如果master故障,sentinel会将一个slave变为master,当故障实例恢复后也以新的master为主 通…

低代码平台助力交通行业数字化科学管理

编者按:本文分析了交通行业的数字化转型需求,并指出了适合交通行业的低代码平台的特性,最后通过相关案例进行了功能展示。关键词:对接能力,国产化,数据引擎,智能化交通运输是国民经济先导性、战…

3、基本的SELECT语句

文章目录1. SQL概述1.1 SQL背景知识1.2 SQL语言排行榜1.3 SQL 分类2 SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 (建议遵守)2.3 注 释2.4 命名规则(暂时了解)2.5 数据导入指令3 基本的SELECT语句3.0 SELECT...3.1 SELECT …

大数据技术架构(组件)15——Hive:内置UDAF函数

1.4.10、内置UDAF函数1.4.10.1、count--可以发现count(id)会把idnull的值剔除掉select count(1),count(*),count(distinct id),count(id) from test1.4.10.2、sumselect sum(1) from test;1.4.10.3、avg该函数太简单了,就不给大家演示了1.4.10.4、min该函数太简单了…

Hive(5):数据定义语言(DDL)

1 数据定义语言(DDL)概述 1.1 DDL语法的作用 数据定义语言 (Data Definition Language, DDL),是SQL语言集中对数据库内部的对象结构进行创建,删除,修改等的操作语言,这些数据库对象包括database&#xff…

面试官问 ,Mybatis SELECT 查询, 集合或者单个对象,如果数据库不存在数据,需要判空吗?

前言 于昨日下班时段,本人正在与生活作斗争,收到了金三银四一线作战小队成员紧急反应的战况问题。 不熟悉的或者是不知道怎么去看源码的看官,上车了。 正文 这面试题问的, 考察的是什么? ① mybatis框架的应用掌握情…

如何实现报表集成?(三)——资源集成

在上一篇,我们介绍了用户同步和单点登录,帮助用户了解什么是用户同步、如何做用户验证,以及如何实现单点登录。 这一篇,我们看下如何做资源集成。行文过程中得到了来自报表软件厂商 Smartbi 的报表产品:电子表格软件的…

leetcode-每日一题-1663-具有给定数值的最小字符串(简单,贪心)

很久没有做过贪心类型的题目了,因为用的很少,大多都用的dp,这道题第一眼看过去以为是dp,因为力扣里面的中等题很多都是dp,但仔细一看发现是贪心,思路其实很简单,先全部最小,中间插一…

机械设备ERP系统可以给企业带来哪些好处?

随着信息化技术的进步与智能制造的发展趋势,很多制造企业也在一直探寻适合自己的信息化管理转型之路。机械设备EPR系统对于机械设备制造企业来说就是关键一环。要充分发挥出机械设备ERP系统的赋能作用,必不可少的是从生产制造的各个环节出发,…

ONLYOFFICE 文档 v7.3 现已发布:表单角色、SmartArt、安全性设置、查看窗口等功能

在 ONLYOFFICE 最新版本的在线编辑器中现已提供高级表单、SmartArt 图形插入、增强密码保护和公式计算、幻灯片特殊粘贴项等多项功能。继续阅读以了解所有更新。 字段填写接收人角色 现在,数字表单将更加高效。您可为需要填写表单的用户分配各种角色,简…

中医名词看不懂?用PaddleNLP做一个中医“百科全书”

我是一个深度学习爱好者,目前对自然语言处理感兴趣,热衷于了解一些人工智能中的数学推导和经典论文复现,正在成长的“小趴菜”一枚,在PPDE指导计划中,创作了中医文献阅读理解项目,下面将由我介绍在项目创作…

Java开发面试(技术面)经历 (二)

2022-11-08,应聘Java开发 :云智慧(实训机构,个人观点,与培训没区别) 今天二面技术面,问了一些问题 1.集合有哪些? 两大容器如图:Collection集合 list下面还有Vector&…

Veeam Backup Replication v12 发布 (含下载) - 面向所有工作负载的备份软件

Veeam Availability Suite v12 请访问原文链接:https://sysin.org/blog/veeam-backup-12/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 全球首屈一指的备份和恢复提供商 管理、控制、保护您的 数据&#xff…

数字化基本概念

数字化是什么?为什么要做数字化转型?感觉只是用计算机软件替代了原有的工作和流程。 听多了,每天的工作也被冠以数字化,说来很重要,确是不清楚为何,也来了解一下。 数字化:改变做事方式、发…

分享企业做微信小程序开发的步骤_公司如何申请微信小程序步骤

对于小程序新手来说,想要建立一个小程序,第一步就是要拥有一个小程序。那么如何开通小程序?公司小程序如何申请?今天就来手把手教你们如何开通小程序吧: 一、填写帐号信息 到微信公众平台首页,直接点击帐号…