目录
tips:以下都是自己在网课学习整理的总结跟归纳~可能有自己偏向(就是详略啦~)ヾ(◍°∇°◍)ノ゙(嗯哼 因为大部分都是网课内容而已 主要是拿来自用而已~ 所以感兴趣可以自己去看同款江协网课——
STM32的开发方式
STM32的开发方式 主要有
1)基于寄存器的方式
同51单片机的开发方式一样,是用程序直接配置寄存器,来达到我们想要的功能
这种方式最底层、最直接、效率会更高一些;但由于STM32的结构太复杂、寄存器太多,所以基于寄存器的方式目前是不推荐的
2)基于标准库的方式(也就是库函数的方式)(本课程使用的)
是使用ST官方提供的封装好的函数,通过调用这些函数来间接地配置寄存器;由于ST对寄存器封装的比较好,所以这种方式既能满足对寄存器的配置,对开发人员也比较友好,有利于提高开发效率
3)基于HAL库的方式
可以用图形化界面快速配置STM32,比较适合快速上手STM32的情况,但这种方式隐藏了底层逻辑
文件杂述
01-寄存器操作方式
点灯操作
![]() |
GPIOC->ODR = 0x00000000;为灯开
GPIOC->ODR = 0x00002000;为灯关
寄存器操作需要挨个位去变,虽语句简便,但麻烦,需了解清楚每一位的表示,并且会将其他原值改变,不能只更改位,而不去影响其他位
02-基于库函数方式开发
02.1-文件解析
文件夹Libraries:库函数的文件,之后建工程时会用到
文件夹Project:官方提供的工程实例和模板,以后使用库函数的时候可以参考一下
文件夹Utilities:STM32官方评估板的相关例程,该评估板为官方用STM32做的一个小电路板,用来测评STM32的,该文件夹里存的是这个小电路板的测评程序
文件Release_Notes.html:库函数的发布文档,内有版本的说明
文件stm32f10x_stdperiph_lib_um.chm:使用手册,内有教如何使用这个库函数
Start文件夹中为启动文件
文件stm32f10x.h:STM32的外设寄存器描述文件,作用与52单片机的头文件REGX52.H一样,用来描述STM32有哪些寄存器和它对应的地址的
文件system_stm32f10x.c
&文件system_stm32f10x.h:这两个system文件是用来配置时钟的;STM32主频72MHz,就是system文件里的函数配置的
添加内核寄存器:
由于该STM32是内核和内核外围的设备组成的,而且该内核的寄存器描述和外围设备的描述文件不是在一起的,所以我们需要添加一个内核寄存器的描述文件
文件core_cm3.c
&文件core_cm3.h:这两个cm3(Cortex-M3)文件,就是内核的寄存器描述,还带了一些内核的配置函数,所以多了个.c的文件
需要在工程选项里添加文件夹的头文件路径,否则软件会找不到.h文件
创建文件文件Library :存放库函数
misc.c是内核的库函数,其他为内核外的外设库函数(/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src)
stm32f10x_conf.h文件:这个conf(configuration)文件)是用来配置库函数头文件的包含关系的,另外这里面还有个用来参数检査的函数定义,这是所有库函数都需要的
02.2-条件编译
![]() |
意思是:如果定义了USE_STDPERIPH_DRIVER(使用标准外设驱动)字符串,下面这个include conf.h语句才有效
02.3-库函数点灯(操作)
库函数也是间接地配置寄存器
首先是使能时钟,库函数有这样一个函数来开启时钟,叫RCC_APB2PeriphClockCmd(RCC_APB2外设时钟控制)
函数的参数解析 |
函数介绍 |
函数具体参数 |
02.4-最终配置(点灯)
![]() |
总内容解析
01-启动文件选择
新建工程 第一个加的就是启动文件,根据芯片型号来选择启动文件;
表中为STM32F1系列中的型号分类:
![]() |
容量大小根据Flash大小来分,和根据芯片型号来选择:
100型号要选择带VL的,然后再根据Flash的大小选择LD、MD还是HD
101/102/103型号则选择不带VL的,然后再根据Flash的大小选择LD、MD、HD还是XL
105、107型号为互联型产品,直接选择CL的启动文件,没有根据Flash大小再分类
02-新建工程步骤
![]() |
【第二步】 是为了添加工程文件准备的,建文件夹是因为文件比较多需要分类管理一下(文件夹的名称和数量没有限制,可以根据自己理解来建)
【第三步】 是为了在Keil里方便管理文件,因为Keil没法直接添加文件夹(.h文件是不参与编译的,所以其他很多工程都是不添加.h文件的)
【第四步】 是因为Start、Library等文件夹是自己建的,Keil不知道,所以要用自己文件夹里面的.h文件就必须声明一下这个路径(最好是自己建的所有文件都声明一下,这样就不会出现.h文件找不到的问题了)
【第五步】 是使用库函数的条件编译,使用库函数就必须定义这个(另外,其他的工程在这个位置还声明了一个STM32F10X_MD的字符串,但Keil5在新建工程时就已经自动帮忙声明了,就不需再额外声明了)
【第六步】 是选择调试器来进行下载的选项(用STLINK就选STLINK即可)
03-工程架构
工程结构主动执行的内容(左一、二)
![]() |
startup_xx.s启动文件:程序执行最基本的文件
(Keil中启动文件是用汇编写的,启动文件内定义了中断向量表、中断服务函数等;该中断服务函数有个复位中断,是整个程序的入口;当STM32上电复位或者按下复位键后,程序就会进入复位中断函数执行)
对应启动文件的这里
![]() |
复位中断函数主要做两件事情:第一个是调用SystemInit 第二个是调用main函数
实际上单片机的程序永远也不会结束,所以main函数的最后一定要加个死循环
SystemInit函数就是定义在system开头.c(sytem_xx.c)里面
该函数的作用:是设置微控制器的启动,初始化嵌入式闪存接口、锁相环、更新系统内核的时钟变量;
![]() |
下面的note写的是 这个函数仅在复位后需要调用
(我们只需要知道 在main函数之前,单片机已经执行了一堆东西了,帮我们把闪存接口、时钟等一系列杂碎的东西都配置好了;另外在启动文件还定义了STM32所有的其他中断,这些中断达到触发条件后就会自动执行)
另外也可以自定义一些用户文件来封装一些模块,供主函数和中断调用
被动执行的东西(右一)
![]() |
右一相当于STM32的资源
在主函数和中断函数里,就可以调用这些资源
stm32f10.h和core_cm3.c/.h 文件 就是外设和内核外设的寄存器描述
寄存器调用比较麻烦
下面两个为库函数文件,库函数封装了寄存器的操作,更人性化
conf文件就是用来配置头文件的包含关系的