江科大笔记——新建工程

STM32的开发方式

目前STM32的开发方式主要有基于寄存器的方式、基于标准库的方式(库函数的方式)、基于HAL库的方式:

  • 基于库函数的方式是使用ST官方提供的封装好的函数,通过调用这些函数来间接地配置寄存器。
  • 基于HAL库的方式可以用图形化界面快速配置STM3,但这种方式隐藏了底层逻辑。

基于标准库的方式新建工程

使用库函数的方式,需要准备一个STM32库函数的压缩包,在资料包固件库资料里面的文件:
在这里插入图片描述

解压完成后,是库函数文件夹目录:

  • Libraries里面就是库函数的文件,之后建工程会用到。
  • Project里是官方提供的工程示例和模版,使用库函数可以参考一下。
  • Utilities是stm32官方评估板的相关例程,这个评估板是官方用STM32做的一个小电路板用来测评stm32的,这个文件夹存的就是这个小电路板的测评程序。
  • 最后面两个文件,一个是库函数的发布文档(有一些版本的说明),一个是使用手册(教如何使用库函数)。
    在这里插入图片描述

新建工程步骤

1.在桌面新建一个文件夹命名STM32Project。
在这里插入图片描述
2.新建工程:打开keil——点击project——New Project——选择STM32Project——新建文件夹(2-1 STM32工程模版)——点进去

在这里插入图片描述
3.接下来给工程文件起个名字(Project)——保存

在这里插入图片描述

4.接下来选择器件型号:
选择芯片STM32F103C8
在这里插入图片描述
5.这里弹出的是新建工程小助手,可以帮助快速新建工程,暂时不用,先关掉。
在这里插入图片描述
6.工程文件是空的,现在这个工程还不能用,需要添加一点工程的必要文件
在这里插入图片描述
7.打开固件库的文件夹:

启动文件的文件路径:Libraries——CMSIS——CM3——DeviceSupport——ST——STM32F10x——startup——arm

如下就是STM32的启动文件,STM32的程序就是从启动文件开始执行的。

将全部启动文件全部复制下来,然后回到工程文件夹里
在这里插入图片描述
工程文件夹如下,里面是新建工程自动生成的文件
在这里插入图片描述
工程文件夹里,新建文件夹(start)用来存放复制过来的启动文件
在这里插入图片描述
8.接着回到固件库的STM32F10x文件,可以看到stm32f10x.h和两个system开头的文件。

system_stm32f10x.c和system_stm32f10x.h文件,将这三个文件复制下来,也粘贴到Start文件夹下。

  • stm32f10x.h是STM32的外设寄存器描述文件,作用和51单片机的头文件REGX52.H一样,是用来描述stm32有哪些寄存器和它对应的地址的。

    两个system文件是用来配置时钟的,stm32主频72MHz,就是system文件里的函数配置的。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
9.接下来,还需要添加一个内核寄存器的描述文件。打开固件库文件夹下的 CM3-CoreSupport-——文件夹,这两个cm3(Cortex-M3)文件就是内核的寄存器描述,当然还有一些内核的配置函数,所以多了个.c文件。
在这里插入图片描述
将两个cm3文件复制粘贴到工程文件夹的Start文件夹下。
在这里插入图片描述
10.然后回到keil软件,将刚才复制的文件(start)添加到工程里。

  • 点击选中Source Group 1,然后再点击一下,把这个组改一下名字,也叫Start
    在这里插入图片描述
    在这里插入图片描述
  • 接着右键,选择添加已经存在的文件到组里

在这里插入图片描述

  • 打开start文件节,把下面这个文件过滤器,选择ALL files,这样就可以看到文件节里的所有文件了

在这里插入图片描述

  • 首先添加一下启动文件,启动文件有很多分类,我们只能添加其中一个,我们所用型号需要选择这个后缀为md.s得启动文件(为什么选择这个启动文件,在后面
    “新建工程里的启动文件选择” 这个章节解释),选中它点击Add。

在这里插入图片描述

  • 然后剩下的.c和.h文件都要添加进来,按住Ctrl键,依次添加Add。然后close,这样我们的Start文件夹里面的文件就添加好了

在这里插入图片描述

  • 这里的文件都是stm32里最基本的文件,是不需要我们修改的,我们添加进来就可以。文件图标上的小钥匙,意思是文件是只读文件,不可修改。

在这里插入图片描述
12.最后我们需要在工程选项里添加上这个文件夹的头文件路径,要不然软件是找不到.h文件的。

  • 点击魔术棒按钮,打开工程选项,在c/c++里,找到这个Include Paths栏,然后点击右边的三个点的按钮,然后再点击新建路径,然后再点三个点的按钮,把start的路径添加进来,点击ok,就把这个文件夹的头文件路径添加进来了。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
13.接下来我们再新建一个main函数,看看工程是否可行:

  • 打开工程文件夹,新建一个(user)文件夹,main函数就放在这个文件夹里。

在这里插入图片描述

  • 在keil中,在Target点击右键,点击添加组,命名为User

在这里插入图片描述

  • 然后在user右键,点击添加新文件,选择c文件,名字为main。路径需要注意为User文件夹,要不然默认是放在文件夹外面的,这样我们就有了main.c文件了。

在这里插入图片描述

在这里插入图片描述

  • 在main.c里,右键,插入头文件,选择stm32f10x.h

在这里插入图片描述

  • 写一个main函数,点击build按钮,编译并建立工程。目前工程还没有添加stm32的库函数,所以还是基于寄存器开发的工程。

在这里插入图片描述

  • 调节字体,点击扳手,把字号调节14。

在这里插入图片描述
在这里插入图片描述

  • 点击扳手,选择utf-8,避免中文乱码,如打开别人工程,看到中文乱码,需改这个编码格式。tab缩进为4比较舒服。

在这里插入图片描述

寄存器方式点灯操作

接下来,进行配置寄存器来完成点灯操作

需要stm32最小系统板,stlink,四根母对母的杜邦线(母对母的杜邦线是指两端都是母插头的杜邦线。这意味着该电缆可以连接两个具有相同或兼容的插头的设备。

在这里插入图片描述
stm32板子上,电源灯会常量,另一个连接在PC13口上灯默认是闪烁状态(芯片里的测试程序)
在这里插入图片描述
然后,在keil中配置一下调试器,点击魔术棒,选择debug,调试器默认是ULINK,更换为stlink调试器,然后再点击右边的设置按钮,在flash下载这一项,把reset and run 勾上(勾上后,我们下载程序后会立马复位并执行,否则每次下载后,还需要按一下板子上的复位按键才能执行程序),配置好调试器后,点击确定,ok。
在这里插入图片描述
在这里插入图片描述
然后重新编译一下,再点击LOAD按钮(程序下载到stm32里),板子上灯不闪(因为程序为空)
在这里插入图片描述
在这里插入图片描述
接下来,配置寄存器,来点亮灯,我们只需要配置3个寄存器就可以点灯了:

1.打开GPIOC的时钟(PC13亮灯)
2.配置PC13口的模式
3.端口输出数据寄存器
在这里插入图片描述

库函数工程建立

1.打开工程文件夹,新建一个文件夹叫library,用来存放库函数,接着打开固件库的文件夹。

在这里插入图片描述

打开librarys——stm32标准外设驱动——src——这些就是库函数的源文件。misc(混杂的意思)是内核的库函数,其它的就是内核外的外设库函数。

全选这些库函数文件粘贴到工程文件夹的library下。
在这里插入图片描述
然后再打开固件库的inc文件夹,这些是库函数的头文件,全部复制粘贴到工程文件夹library下。
在这里插入图片描述
在这里插入图片描述
2.接着回到keil软件,同样在Target处右键,然后添加组,然后改名为library,再右键,添加已经存在的文件,打开library,全选,添加,这样就把所有的库函数文件都添加进来了,但是对于这个库函数来说,现在还不能直接使用,需要再添加一个文件,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
3.打开固件库文件夹–打开project——打开——stm32Template文件夹里

有两个it结尾的文件和一个conf.h的文件:
conf(configuration)文件是用来配置库函数头文件的包含关系的,以及里面还有个用来参数检查的函数定义,这是所有库函数都需要的。

两个it(interrupt)文件是用来存放中断函数的。将这三个文件复制粘贴到工程的user目录下,接着回到keil软件,在user组里,将刚才的三个文件添加进来。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.最后还需要一个宏文件,可以在这个 #include “stm32f10x.h” 文件右键,打开文件,划到最下面
在这里插入图片描述
看到这个语句,这是一个条件编译,意思是,如果你定义了USE_STDPERIPH_DRIVER (使用标准外设驱动)这个字符串,下面这个 #include "stm32f10x_conf.h"语句才有效。

在这里插入图片描述
所以,我们还需要复制一下这个USE_STDPERIPH_DRIVER 字符串,然后打开工程选项(魔术棒),在c/c++的Define栏目粘贴这个字符串,这样才能包含标准外设库(库函数 )

在这里插入图片描述
当然还有下面的头文件目录,把user和library目录的路径也都添加上
在这里插入图片描述
在这里插入图片描述
这样,我们基于库函数的的工程就建好了。
可以看到Library里面的库函数也带了钥匙,不需要我们进行更改,我们唯一需要更改的是user组的文件。
点一下三个箱子的按钮,将这个Library往上挪一下,将不用改的放到最上面,看着舒服。
在这里插入图片描述

keilkill批处理

分享工具:keilkill批处理,作用:可以把工程编译产生的中间文件都删除。

(1)可以复制到工程文件夹里。
(2)如要把工程分享给别人的话——双击批处理文件,就会把中间的文件删掉。
(3)如要恢复中间文件,重新编译即可。

在这里插入图片描述
可以复制到工程文件夹里
在这里插入图片描述
在这里插入图片描述

库函数方式点灯操作

库函数其实也是间接配置寄存器,所以和上面寄存器方式操作步骤一样。

1.首先是使能时钟

使用如下函数来开启时钟,有两个参数,第一个是选择外设,第二个是选择新的状态
在这里插入图片描述

  • 右键,跳转到函数定义,有函数的简介和参数说明,brief是简介,param是参数,一共两个参数。第一个参数可以是arg里的任意一个,第二个参数可以是enable或者disable

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.第二步是配置端口模式

函数GPIO_Init():有两个参数,第一个是选择哪个GPIO,第二个是参数的结构体。这里使用了结构体来配置参数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 我们需要先定义一个结构体,在上面先把这个结构体的类型写上,然后给结构体起个名字,根据官方的推荐,我们最好起一个这样的名字,叫GPIO-InitStructure,然后把结构体的每个参数填上,复制粘贴结构体的名字,然后用**(点)**来引出结构体的参数(三个参数:GPIO模式、GPIO端口、GPIO速度)

在这里插入图片描述
最后,右键转到Mode的定义介绍是说这个参数可以是GPIOMode-TypeDef里的一个值,可以选中GPIOMode-TypeDef这个字符,按一下Ctrl+F,搜索一下这个定义的位置,点击find next。

可以看到,这是个枚举类型的结构体,GPIOMode就是这里的其中一个值,然后我们选择Out-PP这一项,是通用推挽输出。

在这里插入图片描述
在这里插入图片描述

  • 然后我们继续看下一个参数GPIO_InitStructure.GPIO_Pin,转到它的定义,这里下面出现了一个框,这个是说他的定义有很多个,我们在框中选择member这一项,双击,然后跳转的其实还是刚才那个函数说明位置。

在这里插入图片描述

  • 这个GPIO_Pin的说明是说这个参数在GPIO_pins_define里面定义了,我们还是一样,选中,Ctrl+F, findnext,可以看到这里有个宏定义的列表,我们选择GPIO_PIN_13,复制,然后填到第二个参数位置。

在这里插入图片描述

  • 结构体第三个参数也是一样,右键,跳到定义,选中,Ctrl+F,Find Next,选中50MHz的速度,复制粘贴

在这里插入图片描述

  • 现在,这个GPIO_Init的第二个参数了,第二个参数的说明是一个指向结构体的指针,所以这里我们需要传递结构体的地址,那我们复制结构体的名字,粘贴到第二个参数位置,然后前面加一个取地址的符号(&),这样,GPIO模式就配置完成了。
GPIO_Init(GPIOC,&GPIO_InitStructure);

3.最后,设置端口的高低电平来进行点灯。

函数GPIO_SetBits,可以把指定端口设置为高电平,第一个是GPIOC,第二个是GPIO_Pin_13,这一句就可以将PC13口置为高电平;GPIO_SetBits函数可以置低电平,这一句可以将pc13口置为低电平。

GPIO_SetBits(GPIOC,GPIO_Pin_13); // 设置端口的高电平
GPIO_ResetBits(GPIOC,GPIO_Pin_13);// 设置端口的低电平

在这里插入图片描述
灯亮
在这里插入图片描述

总结

新建工程里的启动文件选择
我们新建工程第一个加的就是启动文件,这个启动文件有很多类型,至于选择哪一个,我们要根据芯片型号来选择。

在下面的表中,这是stm32f1系列中的型号分类,其中根据Flash的大小,分为了小容量产品LD,中容量产品MD、大容量产品HD…。stm32f100系列为超值系列,简写为VL,F105和F107为互联型产品CL,这个就没有根据Flash大小来分类.stm32f103c8t6的Flash为64K,所以选择MD的启动文件。

在这里插入图片描述
与之对应

在这里插入图片描述
新建文件步骤总结
在这里插入图片描述

工程架构

1.工程结构主动执行的部分(工程架构左边两个图)
在这里插入图片描述
首先是startup启动文件,这个是程序执行最基本的文件,keil中启动文件是用汇编写的,启动文件内定义了中断向量表,中断服务函数等。

这个中断函数中有个复位中断,这就是整个程序的入口,当stm32上电复位或者按下复位开关之后,程序就会进入复位中断函数执行。

复位函数中断就主要做了两件事情,第一个是调用SystemInit函数,第二个是调用main函数,然后程序就结束了。对应启动文件如下所示:
在这里插入图片描述

当然,实际上单片机的程序永远都不会结束,所以在main函数的最后一定有一个死循环。
在这里插入图片描述

SystemInit函数就是定义在System_xx开头的.c里的,在keil里也可以看到这个函数的定义(在main函数之前,单片机就已经执行了一堆东西了,帮我们把闪存接口,时钟等一系列杂碎的东西都配置好了)。
在这里插入图片描述

其他中断:就是在启动文件的下面那些

在这里插入图片描述

另外在启动文件还定义了stm32所有的其他中断,这些中断达到触发条件后就会自执行。**其他中断函数的定义就是在stm32fx_it里面的。**以上就是中断部分的逻辑。

在这里插入图片描述

另外,你也可以自己定义一些用户文件,来封装一些模块供主程序和中断调用,有利于程序结构的模块化,要不然所有的程序都在主函数里,那主函数就太长了。

在这里插入图片描述
到此为止,这个工程结构主动执行的部分就介绍完了

2.被动执行部分(工程架构右1图)
在这里插入图片描述

被动执行部分,相当于stm32的资源了,我们在主函数或者中断函数里,就可以调用这些资源,

右上角这两个stm32f10x.h和core_cm3这些文件就是外设和内核外设的寄存器描述,

在keil可以看到,都是寄存器和寄存器名字,还有地址信息等,如果直接调用这些寄存器来使用stm32,那就是寄存器的开发方式,很麻烦。
在这里插入图片描述

所以就提供了库函数文件,在keil中可以看到,这每个外设都提供了一大堆函数,这些函数封装了寄存器的操作,给我们提供更加人性化的函数调用方式。
在这里插入图片描述

这个conf的文件就是用来配置头文件的包含关系的,在keil中可以看到conf文件include了所有的库函数头文件,
在这里插入图片描述

在这里插入图片描述
同时我们在stm32f10x.h的最后又包含了conf,在这里插入图片描述
所以在使用这些库函数时,**我们只需要包含stm32f10x.h这一个头文件,就相当于包含了所有的库函数头文件,**这样我们就可以任意地调用库函数了。
在这里插入图片描述

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

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

相关文章

【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理(一)K值选择(二)距离度量1、欧式距离2、曼哈顿距离3、闵可夫斯基距离 (三)决策规则1、分类决策规则2、回归决策规则 三、算法优缺点优点缺点 四、KNN分类任务实现对比&am…

【CKA】二、节点管理-设置节点不可用

2、节点管理-设置节点不可用 1. 考题内容: 2. 答题思路: 先设置节点不可用,然后驱逐节点上的pod 这道题就两条命令,直接背熟就行。 也可以查看帮助 kubectl cordon -h kubectl drain -h 参数详情: –delete-empty…

【COSMO-SkyMed系列的4颗卫星主要用途】

COSMO-SkyMed系列的4颗卫星主要用于提供一个多用途的对地观测平台,服务于民间、公共机构、军事和商业领域。以下是这4颗卫星的主要用途: 民防与环境风险管理: 卫星的高分辨率雷达图像可用于监测自然灾害,如地震、洪水、滑坡等&am…

【计算机网络】网络层详解

文章目录 一、引言二、IP 基础知识1、IP 地址2、路由3、IP报文4、IP报文的分片与重组 三、IP 属于面向无连接型四、IP协议相关技术1、DNS2、ICMP3、NAT技术4、DHCP 一、引言 TCP/IP的心脏是网络层。这一层主要由 IP 和 ICMP 两个协议组成。网络层的主要作用是“实现终端节点之…

Redis进阶篇 - 缓存穿透、缓存击穿、缓存雪崩问题及其解决方案

文章目录 1 文章概述2 缓存穿透2.1 什么是缓存穿透?2.2 缓存穿透的解决方法2.2.1 做好参数校验2.2.2 缓存无效Key2.2.3 使用布隆过滤器2.2.4 接口限流 3 缓存击穿3.1 什么是缓存击穿?3.2 缓存击穿的解决方法3.2.1 调整热点数据过期时间3.2.2 热点数据预热…

Postgresql怎么查询数据库中所有的表,odoo17数据库最依赖表整理

今天遇到了一个需求,需要梳理odoo中数据库表的分类,所以想要知道怎么查询当前数据库中所有的表,特此记录. 一个简单的SQL语句: select * from pg_tables;得到的结果如下: 显然这个有点杂乱,我们换一个SQL语句: select tablename from pg_tables where schemanamepublic不过…

软件测试学习笔记丨Mock的价值与实战

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32331 一、Mock的价值与意义 1.1 简介 测试过程中,对于一些不容易构造或获取的对象,用一个虚拟的对象来替代它,达到相同的效果,这个虚拟的对象…

启动服务并登录MySQL9数据库

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) Windows平台下安装与配置MyS…

Activiti 工作流大致了解

一、什么是 Activiti 简而言之&#xff0c;就是系统的流程图&#xff0c;如&#xff1a;请假审批流程、账单审批流程等。 二、mysql与pom配置 mysql要使用jdbc:mysql://localhost:3306/activiti?autoReconnecttrue pom文件要添加关键依赖 <!--activiti核心依赖--> &…

makefile和CMakeLists/C++包管理器

make 大家可能会很奇怪&#xff0c;都什么年代了&#xff0c;还学makefile&#xff0c;cmake都有些过时了&#xff0c;为什么还要再学这个呢&#xff1f; 我是这么看待这个问题的&#xff0c;cmake跨平台性还是很有有优势的&#xff0c;有着多年积累的底蕴&#xff0c;借助大模…

IDE 使用技巧与插件推荐全面指南

目录 目录 常用IDE概述 Visual Studio Visual Studio Code IntelliJ IDEA PyCharm Eclipse IDE 使用技巧 通用技巧 Visual Studio 专属技巧 Visual Studio Code 专属技巧 IntelliJ IDEA 专属技巧 插件推荐 Visual Studio 插件 Visual Studio Code 插件 IntelliJ…

STM32 实现 UDP 广播通信

目录 一、引言 二、准备工作 1.硬件准备 2.软件准备 三、LWIP 协议栈的配置与初始化 1.添加 LWIP 源文件 2.配置 LWIP 3.初始化 LWIP 四.创建 UDP 广播套接字 1.创建 UDP 控制块 2.绑定本地端口 五、设置 UDP 广播选项 1.设置广播地址 2.设置广播选项 六、发…

防反接电路设计

方案1 串联二极管&#xff0c; 优点&#xff1a;成本低、设计简单 缺点&#xff1a;损耗大&#xff0c;P ui 方案2 串联自恢复保险丝 当电源反接的时候&#xff0c;D4导通&#xff0c;F2超过跳闸带你留&#xff0c;就会断开&#xff0c;从而保护了后级电路 方案3 H桥电路…

[数据集][目标检测]电力场景防震锤缺陷检测数据集VOC+YOLO格式705张1类别

重要说明&#xff1a;防震锤缺陷图片太难找&#xff0c;数据集里面存在大量单一场景图片&#xff0c;请仔细查看图片预览谨慎下载&#xff0c;此外数据集均为小目标检测&#xff0c;如果训练map偏低属于正常现象 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径…

COMP 6714-Info Retrieval and Web Search笔记week2

tokenizer&#xff1a;分词器 右半部分&#xff1a;倒排索引 Westlaw AND&#xff08;&&#xff09;&#xff1a; 要搜索必须同时出现在文档中的两个或多个词语&#xff0c;请使用 AND&#xff08;&&#xff09;。例如&#xff0c;输入 narcotics & warrant&#x…

net core mvc 数据绑定 《2》 bind fromquery,FromRoute,fromform等,自定义模型绑定器

mvc core 模型绑定 控制绑定名称 》》》Bind 属性可以用来指定 模型应该 绑定的前缀 public class MyController : Controller {[HttpPost]public ActionResult Create([Bind(Prefix "MyModel")] Ilist<MyModel> model){// 模型绑定将尝试从请求的表单数据中…

(二)大模型调用

一、基本概念 1.1、Prompt 大模型的所有输入&#xff0c;即&#xff0c;我们每一次访问大模型的输入为一个 Prompt&#xff0c; 而大模型给我们的返回结果则被称为 Completion。 1.2、Temperature LLM 生成是具有随机性的&#xff0c;在模型的顶层通过选取不同预测概率的预测结…

白内障分类数据集 3.4G

用于白内障检测的白内障和正常眼睛图像分类数据集。 名称 白内障分类数据集 规模 数据量&#xff1a;3.4GB图像数量&#xff1a;未明确提供&#xff0c;但通常这类数据集包含数千张图像。 类别 正常眼&#xff1a;无白内障的眼睛早期白内障&#xff1a;轻度白内障的眼睛中…

DC00024基于ssm实验室预约管理系统java web项目web教师预约jsp预约管理系统

1、项目功能演示 DC00024基于web实验室预约管理系统ssm教室预约实验室预约管理系统java web项目MySQL 2、项目功能描述 基于ssm实验室预约管理系统分为用户和系统管理员两个角色。 2.1 系统管理员 1、系统登录 2、用户管理&#xff1a;修改个人信息、修改个人密码、教师管理…

MySql Explain优化命令使用

MySql Explain优化命令使用 truncate table student // 自增id 从 0 开始 delete from student // 自增id 会保留 &#xff0c; 108 区别&#xff1a; 1&#xff1a;自增id 2&#xff1a;delete 可以恢复 truncate 无法恢复 前言 EXPLAIN 是一个用于获取 SQL 语句执行计划的…