STM32固件库(标准外设库)入门学习 第二章 新建工程

STM32固件库(标准外设库)入门学习 第二章 新建工程


文章目录

  • STM32固件库(标准外设库)入门学习 第二章 新建工程
  • 前言
  • 一、新建项目
  • 二、添加工程必要文件
  • 三、新建main函数
  • 四、美观性调整(修改字体)
  • 五、配置调试器
  • 六、配置寄存器方式点灯
  • 七、添加库函数
  • 八、利用库函数实现点灯
  • 总结


前言

STM32编程有三种方式。基于寄存器配置方式、基于标准库方式、基于HAL库的方式。
(1)基于寄存器配置方式,类似51单片机,用程序直接配置寄存器,实现想要的功能,这种方式最底层、最直接、效率更高;但是由于STM32结构复杂、寄存器太多,所以基于寄存器的方式不推荐。
(2)基于库函数方式,使用ST官方封装好的函数,调用这些函数来间接地配置寄存器,由于封装较好,这种方式既能满足对寄存器地配置,又能提高开发效率。本文教程就是这种方式
(3)基于HAL库地方式,可以用图形化界面快速配置STM32,这种方式比较适合快速上手STM32地情况,但是这种方式隐藏了底层逻辑,若对STM32不熟悉,只能停留在很浅地水平,类似Arduino。学过标准库后再来学这种方式,会更好。

一种芯片型号,工程只需要建一次,后面复制即可。


一、新建项目

在这里插入图片描述
STM32固件库(标准外设库)入门学习 第二章 新建工程_第1张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第2张图片


二、添加工程必要文件

打开固件库文件夹,这些就是STM32的启动文件,STM32的程序就是通过启动文件开始执行的,把这些文件全部复制到工程Template文件夹里,新建一个Start文件夹里面。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第3张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第4张图片
stm32f10x.h文件为STM32的外设寄存器描述文件,作用与51单片机头文件REGX52.H一样,用来描述STM32有哪些寄存器和它对应的地址。下面两个system文件是用来配置时钟,STM32主频72MHz,就是system文件里的函数配置的。把这三个文件复制下来,粘贴到start文件夹下。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第5张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第6张图片
STM32是内核和内核外围的设备组成的,而且内核寄存器描述和外围设备的描述文件是不在一起的,所以还需要添加一个内核寄存器的描述文件。这两个cm3(Cortex-M3)文件就是内核的寄存器描述,还带有一些内核的配置函数,所以多了个.c文件。同样复制到start文件夹下。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第7张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第8张图片
回到Keil软件,把刚刚添加的文件增加到工程里来。Source Group 1文件名改为Start。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第9张图片
右键添加已经存在的文件到组里来。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第10张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第11张图片

首先添加启动文件,启动文件有好几类,只能添加一个。根据单片机型号选择后缀为md.s的启动文件。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第12张图片
把所有.c和.h的文件都添加进来,点close,这些都是STM32的基本文件,不需要修改,添加进来即可,文件图标上有小钥匙,这代表这是一个只读文件,也不让修改。

STM32固件库(标准外设库)入门学习 第二章 新建工程_第13张图片

最后需要在工程选项里添加上这个文件夹的头文件路径,要不然软件找不到.h文件,点击魔术棒按钮,打开工程选项,在C/C++里,找到include paths的三个点

STM32固件库(标准外设库)入门学习 第二章 新建工程_第14张图片

新建路径,再点三个点按钮,把Start的路径添加进来
STM32固件库(标准外设库)入门学习 第二章 新建工程_第15张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第16张图片


三、新建main函数

打开工程文件夹,新建一个文件夹

STM32固件库(标准外设库)入门学习 第二章 新建工程_第17张图片
回到keil,在target右击,点击增加组

STM32固件库(标准外设库)入门学习 第二章 新建工程_第18张图片
改个名字为User,然后右键,增加新文件,先择c文件,名字叫main,下面路径要修改选择User文件夹,不然默认是放在文件夹外面,点击add,这样就有了main.c文件。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第19张图片
工程文件夹里也可以看到新建的main.c文件。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第20张图片
在main.c里,先右键,插入头文件,选择stm32f10x.h

STM32固件库(标准外设库)入门学习 第二章 新建工程_第21张图片
写程序,按TAB键可以缩进。main函数是一个int型返回值,void参数的函数。文件的最后一行必须为空行,要不然会报警。编译并建立工程。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第22张图片
到此这个工程目前还没有添加STM32的库函数,所以还是一个基于寄存器开发的工程,若想用寄存器开发32,建到这里即可。
注:编译后报错“use latest compiler version 5’ is not available.”,原因1是版本未选择5.06, 没有core_cm3.o是start路径丢失,再此选择文件夹即可,路径正确后,安装目录的TOOLS INI里的中文也要修改


四、美观性调整(修改字体)

点击扳手可以修改字体
STM32固件库(标准外设库)入门学习 第二章 新建工程_第23张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第24张图片
把编码格式修改为UTF-8,如果打开别人工程也是乱码,需要再修改这个编码格式,tab size可改为4。

STM32固件库(标准外设库)入门学习 第二章 新建工程_第25张图片


五、配置调试器

连开发板,配置调试器。点击魔术棒
STM32固件库(标准外设库)入门学习 第二章 新建工程_第26张图片
默认Ulink,修改为st-link,点击settings,在flash下载这一项,把reset and run这一项勾上,下载程序后会立马复位并执行。这样方便一些,否则每次下载还需要按板子上的复位按键才能执行程序
STM32固件库(标准外设库)入门学习 第二章 新建工程_第27张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第28张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第29张图片

确定后,再重新编译,没问题在点击load按钮,如果一切正常,这个程序就会下载到STM32里。


六、配置寄存器方式点灯

打开STM32参考手册
(1)首先是RCC的一个寄存器,来使能GPIOC的时钟(因为led灯电路图中,连接的是PC13引脚),GPIO都是APB2的外设,在7.3.7 APB2外设时钟使能寄存器(RCC_APB2ENR)里面配置,可以看到IOPCEN,这一位就是是能GPIOC的时钟,这一位写1,其他无关项都先给0。整个寄存器2进制数据换成16进制,就是4个一分组,也就是0 0 0 0 0 0 1 0。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第30张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第31张图片
回到keil,在while死循环前加上RCC->APB2ENR = 0X00000010,这样就可以打开GPIOC的时钟。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第32张图片
(2)第二个寄存器,需要配置一下PC13口的模式。参考手册中找到8.2.2 端口配置高寄存器(GPIOx_CRH) (x=A…E),这个x可以位A到E的任意一个字母。CNF13和MODE13就是用来配置13号口。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第33张图片
CNF为00、MODE为11,整个寄存器换算成16进制就是0 0 3 0 0 0 0 0。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第34张图片
回到keil,写上GPIOC->CRH = 0x00300000。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第35张图片
(3)接下来就可以给PC13口输出数据,找到参考手册8.2.4 端口输出数据寄存器(GPIOx_ODR) (x=A…E),中间有ODR13,这一位写1,13号口高电平,写0就是低电平,写1,odr的值就是0 0 0 0 2 0 0 0。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第36张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第37张图片
回到keil,GPIOC指向ODR,根据电路图发现PC13为低电平,灯亮,所以给ODR全为0灯亮,给ODR 0x00002000就是灭
STM32固件库(标准外设库)入门学习 第二章 新建工程_第38张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第39张图片
以上就是通过配置寄存器来实现点灯,这种方式需要不断查手册了解每个寄存器的每一位都是干啥的。这样的才做也有个弊端,就是把除了PC13之外的位都配置成0。这样会影响到其他端口的原有配置,如果要做到只配置PC13而不影响其他位,还需要&=和|=的操作。这种操作方式代码简洁,但是不方便。


七、添加库函数

打开工程文件夹,新建一个文件夹,叫Library,用来放库函数
在这里插入图片描述
打开固件库文件夹,打开src文件夹。misc是内核库函数,其他未内核外的外设库函数,全选复制到library中。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第40张图片
打开固件库inc文件夹,这些事库函数的头文件,全选复制到library文件夹里。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第41张图片
回到keil,在target处右键,增加组,改名字为Library。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第42张图片
再右键添加已经存在的文件,打开Library,全选增加,把所有库函数文件增加进来。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第43张图片
对于这个库函数来说,现在还不能直接使用,需要增加一个文件,找到这里.conf(configuration)文件是用来配置库函数头文件的包含关系,在这里还有个用来参数检查的函数定义,这是所有库函数都需要的。两个it文件是用来存放中断函数。把这三个文件复制下来,粘贴到User里。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第44张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第45张图片
回到keil,再User组里,把刚才那三个文件增加进来。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第46张图片
最后需要一个宏定义,在主程序头文件右击打开。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第47张图片
滑到最下面找到这个语句,这是一个条件编译,意思就是如果你定义了USE_STDPERIPH_DRIVER(使用标准外设驱动)这个字符串,下面这个stm32f10x_conf.h语句才会有效。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第48张图片
复制这个字符串,打开魔法棒,在这个位置粘贴这个字符串,这样才能包含标准外设库,也就是库函数,还有下面的头文件路径也要增加User和Library,点ok,这样基于库函数的工程就建好了。Library库函数也都有钥匙,不需要更改,唯一需要更改的就是User组的文件。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第49张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第50张图片
把Library文件向上移动,把不用改动的放在最上面。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第51张图片
编译一下,第一次慢,后面会快。


八、利用库函数实现点灯

(1)库函数是间接的配置寄存器,步骤也类似,首先使能时钟,库函数就有这样一个函数开启时钟。RCC_APB2PeriphClockCmd第一个是选择外设,第二个是选择新的状态,可以右键(也可以F12跳转),跳到函数定义,这上面有函数的简介和参数说明。
在这里插入图片描述
STM32固件库(标准外设库)入门学习 第二章 新建工程_第52张图片
简介说,这个函数是用来使能或者失能APB2的外设时钟,第一个参数可以是下面的这些值,可以找到APB2外设GPIOC这一项,然后复制,作为第一个参数即可。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第53张图片
第二参数NewState的值可以是ENABLE或者DISABLE。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第54张图片
在这里插入图片描述
回到看这个函数,他的内部其实还是配置RCC_APB2ENR这个寄存器,经过函数的包装,不需要再去查手册,来确认哪一位是干啥的,而且这一里面已经用&=、|=来操作了,所以这个库函数的配置是不会影响到寄存器的其他位的。这就是库函数和寄存器的区别。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第55张图片
看到这个代码虽然比寄存器长,但是语义更加明确,不需要再查表计算这个寄存器的值了,只需要调用库函数,按照它的提示,把参数填好就行了。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第56张图片
(2)配置端口模式,同样两个参数,第一个选择GPIO,第二个是参数的结构体。
在这里插入图片描述
第一个参数GPIOx,其中x可以是A到G,来选择你要配置那个GPIO;第二个参数是GPIO_InitTypeDef 结构体,需要先定义一个结构体,给结构体起个名字,可以随便起,根据的官方的推荐,最好取GPIO_InitStructure,让后把结构体的每个参数填上,复制粘贴结构体的名字。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第57张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第58张图片
.可以引出三个参数。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第59张图片
右键转mode定义。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第60张图片
右边的介绍说,这个参数可以是GPIOMode_TypeDef里面的一个值,选中这个字符,右击转定义。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第61张图片
这是一个枚举,GPIOMode就是这里的其中一个值,选择框中,复制,这就是通用推免输出。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第62张图片
GPIO_Pin F12转定义,有很多,先择member。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第63张图片
右侧简介说,在GPIO_pins_define里面定义了,选中这个ctrl+f,find next
STM32固件库(标准外设库)入门学习 第二章 新建工程_第64张图片
这里有宏定义的列表,复制回主程序。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第65张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第66张图片
第三个参数也是一样的方法去找,复制粘贴。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第67张图片
填GPIO_Init第二参数,这里有说明,第二个参数是指向结构体的指针,所以这里需要转递结构体的地址。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第68张图片
复制结构体的名字,粘贴到第二个参数位置,在前面加上取地址的符号,最后打上右括号、分号,配置完成。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第69张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第70张图片
以上的方式,stm32配置都是固定的,多打几次就熟悉了。
(3)设置端口的高低电平来进行点灯。这一句就可以将PC13号口置为高电平。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第71张图片
置低电平也有函数。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第72张图片


总结

新建工程里的启动文件选择,新建工程一个加的就是启动文件,启动文件有很多类型,选择的是md.s,其实这个是根据下表的芯片型号来选择,这是F1型号的分类,根据Flash容量进行分类。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第73张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第74张图片
工程架构:
startup_xx.s为启动文件,这是程序执行最基本的文件。这个文件里有中断服务函数,有复位中断,这就是整个程序的入口,当stm32上电复位或者按下复位键后,程序就会进入复位中断函数执行,复位中断函数主要做了两件事情,先是调用SystemInit函数,再是调用main函数,然后程序就结束了。当然实际上单片机的程序永远也不会结束,所以在main函数的最后加一个while(1)死循环。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第75张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第76张图片
STM32固件库(标准外设库)入门学习 第二章 新建工程_第77张图片
SystemInit函数就是定义在startup_xx.c里,看简介是设置微控制器的启动,初始化嵌入式闪存接口、锁相环、更新系统内核的时钟变量,下面note写的是这个函数仅在复位后需要调用。这告诉,单片机在执行main之前,就已经帮把闪存接口、时钟等一系列东西都配置好了。
STM32固件库(标准外设库)入门学习 第二章 新建工程_第78张图片
在启动文件还调用了STM32所有的其他中断,这些中断达到触发条件后就会自动执行,这些中断就是在stm32fx_it.c里面
还可以自己定义一些用户文件,来封装一些模块供主函数和中断调用,这样有利于程序结构的模块化,要不然所有程序都堆在主函数里,主函数太长。

左侧两列是主动执行的东西,右侧那一列是被动执行的东西,相当于STM32的资源,在主函数或者中断函数里,就可以调用这些资源。右上角是stm32f10x.h和core_cm3是外设和内核外设的寄存器描述。

右下角两个文件就是库函数文件,每个外设都提供了一大堆函数,这些函数封装了寄存器的操作,给提供更加人性化的函数调用方式,只要学会了操作套路,配置一个外设就非常简单,连手册都不需要看一眼。conf文件就是用来配置头文件的包含关系,conf文件include了所有库函数头文件,同时在stm32fx.h的最后又包含了conf.h文件,所以在使用这些库函数时,只需要包含stm32f10x.h这一个头文件,就相当于包含了所有的库函数头文件,就可以任意调用库函数。

你可能感兴趣的:(stm32,单片机)