STM32入门_江协科技_3~4_OB记录的自学笔记_软件安装新建工程

3. 软件安装

  • 3.1. 安装Keil5 MDK

    • 作者的资料下载的连接如下:
    • https://jiangxiekeji.com/download.html#32
  • 3.2. 安装器件支持包

  • 因为新的芯片层出不穷,所以需要安装Keil5提供的器件升级版对软件进行升级,从而支持新的芯片;如果不安装,新建工程无法出现相应型号的芯片;

  • 安装作者提供的支持包:《 keil5支持包》
    在这里插入图片描述

  • 如图所示点击软件界面的绿色图标弹出Pack Installer的对话框

  • 点击refresh图标可以刷新列表,并选择下载相应的pack包,但是笔者提示速度较慢

  • 也可以参考CSDN如下链接的教程,从官网下载pack并独立安装:

  • https://blog.csdn.net/phenixyf/article/details/124377673
    在这里插入图片描述

  • 3.3. 注册
    直接参考CSDN如下链接的破解教程:
    https://blog.csdn.net/ChenGuiGan/article/details/80218875?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171429279216800222883916%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=171429279216800222883916&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-80218875-null-null.142v100pc_search_result_base4&utm_term=keil5%20%E5%AE%89%E8%A3%85%E7%A0%B4%E8%A7%A3&spm=1018.2226.3001.4187

  • 3.4. 安装STLINK驱动

  • 需要ST-LINK插到电脑上面;

  • 进入电脑设备管理器窗口,找到STM32 STlink,可能在其他设备里面;

  • ST LINK 驱动在Keil5的安装目录:

  • C:\Keil_v5\ARM\STLink\USBDriver
    在这里插入图片描述

  • 3.5. 安装USB转串口驱动、

  • 将USB转窗口的U盘插到电脑USB口上面

  • 因为和之前51开发板一样,用的CH340,看设备管理器,如果没有识别,需要安装驱动

  • 驱动位置:
    在这里插入图片描述

4. 新建工程

  • 4.1. 目前STM32开发方式有3种

    • 基于寄存器(同51单片机,程序直接配置寄存器,效率高,但是复杂,不推荐)
    • 基于标准库函数(调用官方封装好的函数间接配置寄存器,本课程使用该方式)
    • 基于HAL库(可用图形化界面快速配置,但是该方式隐藏底层逻辑,目前不推荐,但推荐学习标准库后采用此方式)
    • 找到作者提供的固件库文件《STM32F10x_StdPeriph_Lib_V3.5.0》目录下面:
    • Libraries包含新建工程所需要的库函数文件
    • Project下面包含官方提供的工程实例和模板
    • Utilities包含官方评估版的相关例子,官方的STM32的测试电路板
  • 4.2. 新建工程实例:

    • 新建STM32程序存储文件夹
    • 打开Keil5软件-project-New uvision Project新建工程-选择刚建立的STM32程序存储的文件夹,再新建<2-1 STM32工程模板>文件夹并双击进入
    • 工程文件名< project >并保存
    • 在跳出来的器件选择对话框种选择< STM32F103C8 > 并点ok
    • 关闭跳出的《Manage Run-time environment》对话框;暂时不使用这种新建工程小助手;
    • 打开刚才解压的固件库文件夹-libraries,找到目录:/\STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/\ST/\STM32F10x/\startup/\arm (此文件夹包含STM32所有启动文件)
    • 复制目录下所有文件并拷贝到:2-1 STM32工程模板/Start (start目录需要手动新建)
    • 回到固件库文件夹,找到:/\STM32F10x_StdPeriph_Lib_V3.5.0/\Libraries/\CMSIS/\CM3/\DeviceSupport/\ST/\STM32F10x (复制:《 stm32f10x.h 》作用类似于51单片机的REGX52.h,描述寄存器的地址;《 system_stm32f10x.c》《system_stm32f10x.h》这2个system文件主要用于时钟配置,这3个文件复制到Start文件夹下面)
    • 因为STM32由内核和内核外围设备组成,并且内核寄存器的描述文件与外围设备的描述文件不在一起,所以还需要添加内核寄存器的描述文件;
    • 找到如下目录: /\STM32F10x_StdPeriph_Lib_V3.5.0/\Libraries/\CMSIS/\CM3/\CoreSupport (将《core_cm3.c》 《core_cm3.c》复制粘贴到Start目录下面)
    • 回到Keil软件,点击SourceGroup目录,改名为Start
    • 右键Start目录选择“add existing files。。。”,然后在跳出的对话框中选择后缀md.s的文件添加到start目录中(启动文件只能添加一个),其他的.c与.h文件也添加进去,如图:
      在这里插入图片描述

    在这里插入图片描述

    • 至此Start目录里面的文件添加完毕,同时看到文件logo上面带有钥匙,文件都为只读文件。
    • 如下图操作将start文件目录添加到项目中:
      在这里插入图片描述

    在这里插入图片描述

    • 打开《2-1 STM32工程模板》文件夹,新建User文件夹,此文件夹用于存放main函数文件,在Keil软件中Target中右键选择“add group”,并修改新添加的group名称为User,右键User,添加新文件,选择c文件,文件名称命名为main
      在这里插入图片描述

    在这里插入图片描述

    需要注意main.c的文件的位置在user文件夹下面
    在这里插入图片描述

    如图所示简单输入main函数并编译无错(寄存器开发STM32到此配置完毕):
    在这里插入图片描述

    需要注意最后一行需要如图保持空行状态,否则报错:
    在这里插入图片描述

  • 4.3. ST LINK 接线和Keil软件配置如下:

    • 需要根据作者的视频教程,将最小系统板与ST LINK 烧录器连接如下:
    • GND-GND
    • 3.3V-3.3V
    • DCLK-SWCLK
    • DO-SWDO
      在这里插入图片描述
  • 如图将ST LINK烧录器插入电脑中,并在Keil软件中配置如图(后续每次下载程序后立马执行程序,无需再按开发板上面的复位按键):
    在这里插入图片描述

  • 单击download按钮程序会自动下载到开发板上面:
    在这里插入图片描述

  • 4.4. 配置寄存器完成点灯操作,需要配置3个寄存器:

    • 参考STM32参考手册:《STM32F10xxx参考手册(中文).pdf》

    • 首先配置RCC-使能GPIOC的时钟,GPIO都是APB2的外设,手册中找到RCC_APB2ENR里面配置
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • 综上,IOPCEN位需要置1,其他置0,因为共32位,转为16进制有8位数:0x00000010

RCC->APB2ENR = 0x00000010;
  • 4.5. PC13口模式配置:
    • 根据最小系统板的原理图,需要操作的是PC13口:

    • CNF13需要配置为推挽输出模式;

    • MODE13需要配置为最大输出模式50MHz;
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • 综上,CNF13位需要置00,MODE13位配置11,其他置0,因为共32位,转为16进制有8位数:0x00300000

GPIOC->CRH = 0x00300000;
  • 4.6. PC13口输出数据

    • ODR13位写1为高电平,写0为低电平,

    • 如果写1, ODR的值0x00002000

    • 如果写0,ODR的值0x00000000
      在这里插入图片描述
      在这里插入图片描述

    • 在Proteus中模拟的ODR13口写0,LED灯亮如下:
      在这里插入图片描述
      在这里插入图片描述

    • 在Proteus中模拟的ODR13口写1,LED灯灭如下:
      在这里插入图片描述
      在这里插入图片描述

    • 总结上述寄存器配置的问题是:效率低(需要反复查看手册),配置一个寄存器位会影响到其他位(例如除LED位其他都置0了),

  • 4.7. 库函数操作方式(对比上述寄存器配置的区别)

    • 在2-1 STM32工程模板的目录下面新建Library文件夹用于存放库函数
      在这里插入图片描述

    • 找到库函数文件夹 ( STM32F10x_StdPeriph_Lib_V3.5.0/\Libraries/\STM32F10x_StdPeriph_Driver/\src)

    • 其中misc.c是内核内的库函数,其他为内核外的库函数;目录中所有库函数复制粘贴到项目的Library目录下面;

    • 找到库函数头文件的文件夹 ( STM32F10x_StdPeriph_Lib_V3.5.0/\Libraries/\STM32F10x_StdPeriph_Driver/\inc)

    • 将所有的文件复制粘贴到项目的Library目录下面;

    • 回到Keil软件,在Target1下面添加Library的文件夹并将所有的Library的文件添加进来;
      在这里插入图片描述

    • 找到固件库文件夹(STM32F10x_StdPeriph_Lib_V3.5.0/\Project/\STM32F10x_StdPeriph_Template)

    • 将(stm32f10x_conf.h(配置库函数头文件的包含关系&参数检查的函数定义,所有库函数均需要) ;stm32f10x_it.c(用于存放中断函数) ;stm32f10x_it.h )这3个文件复制粘贴到工程的User目录下面

    • 返回Keil软件,并将刚才添加的3个文件加入到User组里面;

    • 右键如图stm32f10x.h并打开这个文件
      在这里插入图片描述

    • 找到文件中最下面的如下语句,复制如下字符串,字符串的意思是如果定义使用标准外设驱动这个字符串,才会使stm32f10x_conf.h这个文件有效;
      在这里插入图片描述

    • 粘贴字符串到项目的选项的C/C++的Define中,这样才能包含标准外设库,也就是库函数
      在这里插入图片描述

    • 同时下面的头文件路径中也要把User与Library添加进去
      在这里插入图片描述

    • 至此基于库函数的工程建立完毕,user组里的文件可以修改,library中带钥匙标识的无法修改;

    • 点击如图的图标,将Library组上移到User组上面,User组放最下面(因为组内文件需要修改,看起来舒服点)
      在这里插入图片描述

  • 4.8. 使用库函数来实现点灯操作

  • 库函数间接配置寄存器,与寄存器操作步骤一样

  • 如果Keil没有跳出代码自动补全,可以参考如下链接中的教程:

  • https://blog.csdn.net/m0_73843839/article/details/129889671

  • 使能时钟:RCC_APB2PeriphClockCmd, 右键打开函数的相关的定义如下,同时需要注意这个函数包含2个参数,具体描述参考打开的函数中的描述,按照描述填入到函数的参数项中。
    在这里插入图片描述
    在这里插入图片描述

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  • 配置端口模式(GPIO_Init函数)(两个参数,第一个是选择哪个GPIO,第二个参数是结构体),如下图keil中跳出的提示,根据提示配置参数;
    在这里插入图片描述

  • 此处使用结构体来配置参数,代码逻辑复杂,这节先follow作者操作,右键点击函数,打开函数的说明如下图,第一个参数GPIOx,x位置填入C,表示13口,第二个参数为结构体,所以需要先定义一个结构体;
    在这里插入图片描述

  • 此处keil中程序输入如下:

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//时钟初始GPIO_InitTypeDef GPIO_InitStructure;					//结构体类型GPIO_InitStructure.GPIO_Mode =GPIO_InitStructure.GPIO_Pin =GPIO_InitStructure.GPIO_Speed =GPIO_Init(GPIOC,
  • 右键点击.GPIO_Mode打开函数介绍如下图:
    在这里插入图片描述

  • 选中如图所示的字符按Ctrl+F搜索,如下图:
    在这里插入图片描述

  • 如下图所示,GPIO_Mode是用枚举的方式列出,我们用的是Out_PP一项(通用推挽输出)
    在这里插入图片描述

  • GPIO_Pin与上述类似找到说明和位置如下图,这边需要的是GPIO_Pin_13
    在这里插入图片描述

  • GPIO_Speed与上述类似,如下图,需要50MHz;
    在这里插入图片描述

  • 综上代码为下述代码,其中 &GPIO_InitStructure是用指针表示 &GPIO_InitStructure的入口地址;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//时钟初始GPIO_InitTypeDef GPIO_InitStructure;					//结构体类型,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;		//GPIO_Init(GPIOC, &GPIO_InitStructure);					//&指针表示地址
  • 最后加入对相应端口的操作(置0或1)来实现灯的亮和灭,最终程序如下,GPIO_SetBits用于端口置1,GPIO_ResetBits用于端口置0,用//注释掉GPIO_ResetBits测试GPIO_SetBits,测试灯灭没问题;反之测试灯亮没有问题;
#include "stm32f10x.h"                  // Device headerint main(void)
{
//	RCC->APB2ENR = 0x00000010;
//	GPIOC->CRH = 0x00300000;
//	GPIOC->ODR = 0x00002000;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//时钟初始GPIO_InitTypeDef GPIO_InitStructure;					//结构体类型,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;		//GPIO_Init(GPIOC, &GPIO_InitStructure);					//&指针表示地址GPIO_SetBits(GPIOC,GPIO_Pin_13);						//13口置高//GPIO_ResetBits(GPIOC,GPIO_Pin_13);						//13口置低while (1){}
}

在这里插入图片描述

  • 4.8. 补充:

  • 程序中的启动文件的选择是根据具体芯片的型号来选择的:
    在这里插入图片描述

  • 具体选择需要查看下表:
    在这里插入图片描述

  • 4.9. 新建工程的步骤总结:
    •建立工程文件夹,Keil中新建工程,选择型号
    •工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹,一定要复制到工程文件夹中,否则外部文件位置变更工程就找不到相应的文件了;
    •工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里,建议.h与.c都添加,方便查看;
    •工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹
    •工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER,使用库函数必须定义这个;
    •工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run

  • 4.10. 工程架构
    在这里插入图片描述

  • 如上图所示,startup是启动文件,是程序执行最基本文件,复位中断是程序的入口,做了2件事情,第一个是调用systemInit函数,第二是调用main函数;

  • 上图蓝色和紫色部分为STM32中主动执行部分;

  • 上图粉色与绿色部分是STM32中被动执行部分,是主函数或者中断函数可调用的资源,粉色为寄存器开发模式需要查看的寄存器资源,用此方法开发太过于麻烦;

  • 上图绿色部分为库函数,给我们提供了更加人性化的函数调用方式,便于开发。

  • 因为库函数配置文件的存在,实际main函数头文件包含了 stm32f10x.h就已经包含了所有的库函数头文件,这样就可以任意调用库函数了;

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

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

相关文章

unity-C#调用百度千帆AppBuilder的OpenApi

目录 功能描述准备工作百度智能云账号创建应用编辑应用创建Api秘钥Api调用流程unity代码Unitywebrequest非流式流式注意事项 Restsharp 功能描述 使用百度千帆AppBuilder平台,通过api调用的方式实现AI大模型对话功能(文字) 准备工作 百度智能云账号 请自行在百度智能云进行…

力扣---二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: []实现方法&…

nginx+Tomcat动静分离

本⽂的动静分离主要是通过nginxtomcat来实现&#xff0c;其中nginx处理图⽚、html等静态的⽂ 件&#xff0c;tomcat处理jsp、do等动态⽂件. 实验环境 192.168.200.133 nginx反向代理 192.168.200.129 static 192.168.200.130 dynamic 步骤 修改三台主机名 [rootadmin ~]#…

关于Centos 7/8 网络设置 与工具连接

网络三步曲的配置 1、首先更改虚拟机的网络配置 查看子网地址以及网关 如果有要求需要更改IP地址&#xff0c;规定第三位是指定数值&#xff0c;那么需要全部更改 例如&#xff0c;IP地址为192.168.200.30 其中200为重点&#xff0c;更改时为以下步骤 1、点击DHCP设置&#x…

【数据结构】顺序表专题

前言 本篇文章我们来进行有关顺序表的专题训练&#xff0c;让我们一起来看一下有关顺序表的算法题 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 &#x1f4dd;若有问题 评论区见 &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 1.移除…

每天五分钟深度学习:导数是反向传播算法的数学基础

本文重点 导数作为微积分学的核心概念之一,不仅在数学领域内占有举足轻重的地位,更在实际问题中发挥着不可替代的作用。我们要想学习反现象传播算法,我们前提是先要学习导数的概念。本节课程我们将看一下导数是什么? 导数 导数,顾名思义,是函数在某一点或某一段区间内…

【国标语音对讲】EasyCVR视频汇聚平台海康/大华/宇视摄像头GB28181语音对讲配置

一、背景分析 近年来&#xff0c;国内视频监控应用发展迅猛&#xff0c;系统接入规模不断扩大&#xff0c;涌现了大量平台提供商&#xff0c;平台提供商的接入协议各不相同&#xff0c;终端制造商需要给每款终端维护提供各种不同平台的软件版本&#xff0c;造成了极大的资源浪…

值得买科技新思路,导购电商的终点是“AI+出海”?

在以往&#xff0c;大众普遍认为品牌的消费者大多是高度忠诚人群&#xff0c;而事实上&#xff0c;非品牌忠诚者相比重度消费者&#xff0c;对促进品牌增长更为重要。 这类非品牌忠诚者被定义为摇摆的消费者群体&#xff0c;也就是那些购买品牌产品概率在20%-80%之间的消费者。…

mysql-sql练习-5-行列互转

目录 成绩单 简单互转 需求 多行转多列 分组 判断 聚合 理解 分组 合并 逆向需求 多列转多行 输出 合并 abc 去重 合并 拆分 需求 建表 多行转多列 逆向需求 多列转多行 拆分 按长度 拆分 按个数 成绩单 简单互转 需求 多行转多列 分组 判断 聚合 with tmp as(--…

[Transactional Level Bypass] Bypass Validation Rule in Apex Batch Class

问题 现有一个batch job用于批量更新Lead&#xff0c;最近频繁收到apex exception email, 显示更新Lead的时候触发了validation rule&#xff0c;导致apex job运行失败。 batch class节选如下&#xff1a; public void execute(Database.BatchableContext bc, List<Lead&…

49. 字母异位词分组 128. 最长连续序列

49. 字母异位词分组 128. 最长连续序列 把集合里面的所有元素都放入set容器里面 定义结果最大连续数量 ans for循环遍历每个元素 先判断集合里面有没有比这个元素小1的 如果没有 说明这个元素就是序列的第一个元素 然后接着找集合里面有没有比这个元素大1的 while一直找 …

C语言中的趣味代码(五)

我想以此篇结束关于C语言的博客&#xff0c;因为在C语言拖得越久越不能给大家带来新的创作&#xff0c;在此我也相信大家对C语言已经有了一个新的认知。进入正题&#xff0c;在这一篇中我主要编一个“英语单词练习小程序”来给大家展开介绍&#xff0c;从测试版逐步改良&#x…

【无标题】测试下目录间距

文章目录 前言一、Java基础题1、Java语言的三大特性2、JDK 和 JRE 有什么区别3、Java基本数据类型及其封装类4、说明一下public static void main(String args[])这段声明里关键字的作用5、 与 equals 的区别6、Java语言的三大特性7、Java语言的三大特性8、Java语言的三大特性9…

OpenHarmony实战开发-属性样式动画

在关键帧&#xff08;Keyframes&#xff09;中动态设置父组件的width和height&#xff0c;实现组件变大缩小。子组件设置scale属性使父子组件同时缩放&#xff0c;再设置opacity实现父子组件的显示与隐藏。 <!-- xxx.hml --> <div class"container"><…

OGG extract进程占据大量虚拟内存导致服务器内存异常增长分析

现象 oracle服务器一节点内存&#xff0c;一个月来持续升高&#xff0c;近一月上涨10%左右。 问题分析 OS内存使用情况 使用内存最大的10个进程如下&#xff0c;PID为279417占用最大的内存。 查询279417&#xff0c;发现是ogg相关进程。 发现ogg的extract进程占用了大量的虚拟内…

vite打包配置

目录 minify默认是esbuild&#xff0c;不能启动下面配置 使用&#xff1a; plugins: [viteMockServe({mockPath: mock})]根目录新建mock/index.ts. 有例子Mock file examples&#xff1a;https://www.npmjs.com/package/vite-plugin-mock-server 开发环境生产环境地址替换。根…

spark实验求TOP值

实验1&#xff1a;求TOP值 已知存在两个文本文件&#xff0c;file1.txt和file2.txt&#xff0c;内容分别如下&#xff1a; file1.txt 1,1768,50,155 2,1218, 600,211 3,2239,788,242 4,3101,28,599 5,4899,290,129 6,3110,54,1201 7,4436,259,877 8,2369,7890,27 fil…

活性炭复合纳米纤维膜

活性炭复合纳米纤维膜是一种结合了活性炭和纳米纤维技术的新型复合材料。这种材料通常通过特定的制备工艺&#xff0c;如静电纺丝技术&#xff0c;将活性炭纳米纤维与其他材料&#xff08;如TiO2、聚合物等&#xff09;结合在一起&#xff0c;形成具有良好结构和功能的薄膜。 活…

UDP!!!

UDP!!! 一 : 传输层的协议:二 : UDP2.1 UDP长度2.2 UDP校验和2.2.1 : 为什么会出现传输出错的情况??2.2.3: 对数据进行校验的方式CRCmd5 三 : UDP的适用场景 一 : 传输层的协议: 传输层的协议有UDP,TCP UDP:无连接,不可靠传输,面向数据报,全双工 TCP:有连接,可靠传输,面向字…

nvm 切换 Node 版本失败

创建vue3项目时&#xff0c;需要切换到更高版本的 node&#xff0c;于是使用 nvm (node 包版本管理工具)进行版本切换 切换版本时&#xff0c;显示成功&#xff0c;但再次查看当前 node 版本时&#xff0c;发现没切换过来。 解决方法&#xff1a; where node 查看node的安装…