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 header

int 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就已经包含了所有的库函数头文件,这样就可以任意调用库函数了;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何将 redis 快速部署为 docker 容器?

部署 Redis 作为 Docker 容器是一种快速、灵活且可重复使用的方式&#xff0c;特别适合开发、测试和部署环境。本文将详细介绍如何将 Redis 部署为 Docker 容器&#xff0c;包括 Docker 安装、Redis 容器配置、数据持久化、网络设置等方面。 步骤 1&#xff1a;安装 Docker 首…

ICode国际青少年编程竞赛- Python-1级训练场-基本操作

ICode国际青少年编程竞赛- Python-1级训练场-基本操作 1、 Dev.step(3)2、 Dev.step(1)3、 Dev.step(7)4、 Dev.step(-1)5、 Dev.step(-5)6、 Dev.step(3) Dev.step(-8)7、 Dev.turnRight() Dev.step(1)8、 Dev.turnLeft() Dev.step(1)9、 Dev.step(4) Dev.tur…

串的模式匹配之BF算法实现

概述 BF算法-暴力枚举 匹配失败处理 匹配成功结束 算法思想 代码实现 定义串的存储结构&#xff1a;装字符的ch数组标记长度的length 最坏时间复杂度分析 代码整合

微调Mistral 7B以实现命名实体识别 (NER)

文章来源&#xff1a;fine-tuning-mistral-7b-for-named-entity-recognition-ner 2024 年 4 月 19 日 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;命名实体识别&#xff08;NER&#xff09;被认为是一项关键任务&#xff0c;应用范围广泛&#xff0c;包括信息…

电脑找不到msvcp140.dll如何修复?msvcp140.dll丢失的多种解决方法分享

在日常电脑操作过程中&#xff0c;用户可能会遇到一个令人困扰的问题&#xff0c;即屏幕上突然弹出一条错误提示&#xff1a;“由于找不到msvcp140.dll&#xff0c;无法继续执行代码”。这一情况往往导致应用程序无法正常启动或运行&#xff0c;给工作和娱乐带来不便。不过&…

ICode国际青少年编程竞赛- Python-1级训练场-for循环入门

ICode国际青少年编程竞赛- Python-1级训练场-for循环入门 1、 for i in range(4):Dev.step(4)Dev.turnLeft()2、 for i in range(3):Dev.step(6)Dev.turnRight()3、 for i in range(3):Dev.turnRight()Dev.step(2)Dev.turnLeft()Dev.step(-3)4、 for i in range(4):Dev…

数据结构-AVL树

目录 什么是 AVL 树 ASL 度量查找效率 结构体定义 平衡调整 调整类型 左旋和右旋 右旋 左旋 左、右平衡调整 左平衡调整 右平衡调整 插入数据 模拟建立 AVL 树 什么是 AVL 树 二叉排序树的形状取决于数据集&#xff0c;当二叉树的高度越小、结构越合理&#xff0c…

如何在iOS设备(iPhone,iPad等)上恢复丢失的照片

如果你像现代90%的人一样拥有智能手机&#xff0c;那么你很可能使用口袋里的微型电脑拍摄大部分&#xff08;如果不是全部&#xff09;照片&#xff0c;而不是标准的傻瓜相机或数码单反相机。 像任何数字设备一样&#xff0c;存储和保存这些照片可能是一个变化无常的过程&…

MySQL商城数据库88张表结构(46—50)

46、消息队列表 CREATE TABLE dingchengyu消息队列表 (id int(11) NOT NULL AUTO_INCREMENT COMMENT 序号,userId int(11) DEFAULT NULL COMMENT 用户id,msgTtype tinyint(4) DEFAULT 0 COMMENT 消息类型,createTime datetime DEFAULT NULL COMMENT 创建时间,sendTime datetim…

centos7安装真的Redmine-5.1.2+ruby-3.0.0

下载redmine-5.1.2.tar.gz&#xff0c;上传到/usr/local/目录下 cd /usr/local/ tar -zxf redmine-5.1.2.tar.gz cd redmine-5.1.2 cp config/database.yml.example config/database.yml 配置数据连接 #编辑配置文件 vi config/database.yml #修改后的内容如下 product…

学习CSS3,实现红色心形loading特效

试想一下&#xff0c;如果你的网站在加载过程中&#xff0c;loading图由一个老旧的菊花转动图片&#xff0c;变为一个红色的心形loading特效&#xff0c;那该有多炫酷啊。 目录 实现思路 初始化HTML部分 延迟动画是重点 设定动画效果 完整源代码 最后 实现思路 每个…

问界M7碰撞后车门打不开,都是隐形门把手的错?

问界M7碰撞后车门打不开&#xff0c;并不能简单地归咎于隐形门把手的设计。实际上&#xff0c;碰撞后车门无法打开可能涉及多个因素&#xff0c;具体分析如下&#xff1a; 隐藏式门把手的设计与工作原理&#xff1a;隐藏式门把手在正常状态下与车身表面齐平&#xff0c;解锁时才…

AI图书推荐:如何使用ChatGPT来提升逻辑分析能力

在一个日益由数据和技术驱动的世界中&#xff0c;进行逻辑思考和做出明智决策的能力比以往任何时候都更为关键。逻辑分析构成了理性思考的基础&#xff0c;引导我们穿越复杂问题&#xff0c;并帮助我们得出合理的结论。随着人工智能&#xff08;AI&#xff09;的出现&#xff0…

C语言-调试技巧

目录 一、调试介绍1.1 Debug和Release的介绍1.2 Windows环境调试介绍1.2.1 学会快捷键1.2.2 查看临时变量的值1.2.3 查看内存信息1.2.4 查看调用堆栈1.2.4 查看汇编信息1.2.5 查看寄存器信息 二、编程常见的错误2.1 编译型错误2.2 链接型错误2.3 运行时错误 三、易于调试的代码…

【C++】双指针算法:四数之和

1.题目 2.算法思路 这道题目十分困难&#xff0c;在leetcode上的通过率只有36%&#xff0c;大家要做好心理准备。 在做个题目前强烈建议大家先看看我的上一篇博客&#xff1a;有效三角形个数&#xff0c;看完之后再去leetcode上写一写三数之和&#xff0c;搞懂那两个题目之后…

网络安全实训Day16

网络空间安全实训-渗透测试 漏洞扫描 定义 扫描和探测目标范围内的主机存在哪些安全漏洞&#xff0c;或扫描目标范围内的那些主机存在某个指定的漏洞 漏扫工具 AWVS APPScan MSF 使用MSF扫描漏洞并利用 1.搜索需要的攻击模块 search ms17-010 2.使用攻击模块 use 模块名称…

jsp校园商城派送系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 校园商城派送系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用serlvetdaobean mvc 模式&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8.…

每日一题-贪心算法

目录 前言 买入股票的最佳时机(1) 买入股票的最好时机(2) 前言 当你踏上贪心算法的旅程&#xff0c;仿佛置身于一场智慧的盛宴&#xff0c;每一步都是对问题解决方案的审慎选择&#xff0c;每一次决策都是对最优解的向往。贪心算法以其简洁高效的特性&#xff0c;被广泛运用于…

yolov5-pytorch-Ultralytics训练+预测+报错处理记录

一、前言 玩一段时间大模型&#xff0c;也该回归一下图像识别。本项目用于记录使用基于Ultralytics的yolov5进行目标检测测试。为什么用Ultralytics呢&#xff1f;答案有3 1、其良好的生态&#xff0c;方便我们部署到其它语言和设备上。因此本次测试结论&#xff1a;大坑没有&…

基于YOLOv8的水稻虫害识别系统,加入BiLevelRoutingAttention注意力进行创新优化

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;基于YOLOv8的水稻虫害识别&#xff0c;阐述了整个数据制作和训练可视化过程&#xff0c;并加入BiLevelRoutingAttention注意力进行优化&#xff0c;最终mAP从原始的 0.697提升至0.732 博主简介 AI小怪兽&#xff…