STM32 入门详解

目录

一、Keil开发的背景

二、STM32中的命名规则

三、片上资源/外设

四、系统结构

​编辑

五、STM32F103C8T6引脚定义

六、keil中工程创建

1、Keil中的Start文件

1.STM32的启动文件

2.stm32f10x.h和两个system的含义

扫描二维码关注公众号,回复: 17575977 查看本文章

3.stm32内核寄存器的描述

2、Keil中的Library文件

3、User文件夹

4、main中的调整和代码

1.添加文件夹:例如Start,Library,User等

2.添加stm32f10x_it.c等文件

 3.移动文件夹和文件的位置

4.标准库中的代码

 5.工程架


一、Keil开发的背景

        目前STM 32的开发方式主要有有三种方式,分别是:基于寄存器的方式基于标准库(即基于库函数)和HAL库的方式。基于寄存器的方式和51的开发方式相同,即用程序直接配置寄存器来实现功能,虽然这种方式最底层并且效率会高一些,但是非常复杂;基于标准库的方式是使用ST官方提供的封装好的封装好的函数,通过调用这些函数来间接的配置寄存器,因为ST官方对寄存器封装的比较好,所以这种方式既能满足对寄存器的配置,同时对开发人员也比较友好,有利于提高开发效率;最后基于HAL库开发的方式,可以使用图形化界面快速配置STM32,可以快速上手,但是隐藏了底层逻辑,如果不熟悉STM32,只能停留在比较浅的水平,但是非常方便。


二、STM32中的命名规则


三、片上资源/外设


四、系统结构


五、STM32F103C8T6引脚定义


六、keil中工程创建

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

1、Keil中的Start文件

1.STM32的启动文件

        和名字一样,STM32的程序是从启动文件开始执行的

         选择具体的启动文件可以根据下面的表格进行对比选择:

2.stm32f10x.h和两个system的含义

         stm32f10x.h 是STM32外设寄存器的描述文件,是用来描述STM32 有哪些寄存器和它对应的地址的。

        另外的两个system文件是用来配置时钟的,STM32 主频72MHz,就是system文件中的函数配置的

3.stm32内核寄存器的描述

        因为这个stm32 是内核和内核外围的设备组成的,而且这个内核的寄存器描述和外围设备的描述文件不是在一起的,所以我们还需要添加一个内核寄存器的描述文件。这两个core_cm3文件就是内核的寄存器描述,当然他还带了一些内核的配置函数,所以有个.c的源文件

2、Keil中的Library文件

        这个文件夹是用来存储stm32库函数的。

下面文件中src是.c源文件,inc是.h头文件

在上面的文件中,misc是内核库函数,其他的就是内核外的外设库函数。

3、User文件夹

         stm32f10x_conf.h:用来配置库函数头文件的包含关系的,并且还有个用来参数检查的函数定义,是所有库函数都需要的。

        两个stm32f10x_it(interrupt)结尾的文件:是用来存放中断函数的。

        GPIO都是APB2的外设,所以用APB2外设时钟使能寄存器RCC_APBENR里面配置。

        这是一个条件编译, 意思是如果你定义USE_STDPERIPH_DRIVER这个字符串,下面的include conf.h语句才有效,所以我们还需要复制一下这个字符串,然后打开工程选项,在c/c++中的define栏目粘贴这个字符串,这样才能包含标准外设库,也就是库函数。

4、main中的调整和代码

1.添加文件夹:例如Start,Library,User等

2.添加stm32f10x_it.c等文件

 3.移动文件夹和文件的位置

4.标准库中的代码

引脚配置时的流程:

  1. 首先使能时钟,使用RCC_APB2PeriphClockCmd来开启时钟,两个参数,第一个事选择外设,第二个是选择的状态。
  2.  第二步是配置端口模式,使用GPIO_Init(),其中两个参数第一个是选择哪个gpio,第二个是参数的结构体,使用了结构体来配置参数,机构提的名字建议使用官方推荐的GPIO_InitStructure作为结构体名。

 在上面的代码中,库函数RCC_APB2PeriphClockCmd已经使用 |= 和 &= 将内容进行操作了,这个库函数是不会影响寄存器的其他位操作。stm32中只是使用低16位。

 5.工程架构

        启动文件是用汇编写的,启动文件中定义了中断向量表,中断服务函数等,中断服务函数中有一个复位中断,只是整个程序的入口,当上电复位或者按下复位键之后,程序就会进入复位中断执行,复位中断函数主要做两件事情,第一个是调用SystemInit函数,第二个是调用main函数,对应启动文件,进入SystemInit,然后进入_main中,然后程序就结束,但是单片机永远不会结束,所以在main函数的最后,一定是一个死循环。如下图:

         从上述可知,在main函数之前,单片机已经执行了很多东西,已经把闪存接口,时钟等一系列琐碎的东西都配置好了