进阶阶段——STM32学习笔记(二)
1 新建工程
STM32 不推荐基于寄存器的方式开发,因为寄存器众多,开发难度大
推荐用标准库的方式或HAL库的方式开发
注意:STM32的程序是从启动文件开始执行的,需要从外部下载好标准库文件后直接加入到工程中。
新建工程的过程可以类比于装修土坯房的过程
1.1 整体步骤
建立工程文件夹,在keil中新建工程project,选定开发芯片后,此时keil里的工程相当于一个土坯房,咱们需要在现在的土坯房里面装修。
即stm32是基于标准库(或者HAL库)开发的,所以咱们需要往已有的工程中添加必要文件才能用
1.1.1在project所在的文件夹里面添加stm32必要文件
1.添加stm32的启动文件startup_xx .s
打开下载来的官方标准库,在其中能找到启动文件
2.添加外设寄存器描述文件(stm32F4XX.h) 和 配置时钟用的system文件
外围设备寄存器描述文件(如stm32F4XX.h):
其作用相当于reg52.h,描述stm32的寄存器和所在地址
system.c和system.h文件用来配置时钟
3. 添加内设寄存器描述文件(core_cmx.h core_cmx.c)
stm32 是由内核和内核外围设备组成,以上步骤添加完外围设备寄存器描述文件后,接下来添加内围设备寄存器描述文件
![image-20230111134219050](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111134157092-310318641.png)
在标准库中找不到core_cm3.c之类的文件时,就可以不用添加,添加core_cm3.h文件就行
1.1.2 在keil软件界面的project中导入刚刚添加的stm32必要文件
左侧菜单栏只能添加的是 .c文件
需要在设置中增加添加.h文件夹的所在路径,才算完成添加.h文件
至此就可以进行寄存器方式开发,在此基础上添加以下库函数文件即可变成寄存器方式开发
hal库.h hal库.c
![image-20230111145722137](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111145702067-2890114.png)
![image-20230111145739652](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111145718627-704010971.png)
![image-20230111145803679](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111145743017-544717008.png)
接着加入以下两个文件
XXXX_it.h XXXX_it.c
![image-20230111145821271](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111145843602-690082925.png)
![image-20230111145936064](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111145920102-824614912.png)
注意添加完.c文件后,也要将.h头文件路径加进去
接着是很重要的一步:需要一个宏定义添加进去
![image-20230111150609530](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111150550679-99155956.png)
找到以下语句
![image-20230111150645791](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111150623684-1420579441.png)
![image-20230111150737354](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111150716387-469864953.png)
![image-20230111150835336](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111150815890-320114222.png)
以上,库函数(标准库)方式开发的必要文件配置完毕
![image-20230111151332764](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111154652293-955240351.png)
在之后我们需要更改的是user中添加的文件来完成程序设计
1.2 两种开发方式的对比
1.2.1 寄存器方式下的配置外设步骤
(跟把大象放进冰箱一样的步骤)
1.先使能时钟
根据外设所挂载的时钟频率总线类型APB1/APB2来RCC里面选择相应的使能寄存器,在使能寄存器中写入数据来使能外设(需要使用数据手册来查找)
2.初始化外设寄存器的值
3.输出外设寄存器的值
繁琐的点在于需要不断查找数据手册,了解寄存器每一个是干什么的,并给它赋值 转换为16进制 &|
无法单独给寄存器中的某一位赋值,所以寄存器赋值一定会影响到其他无辜的位值,可用&=或|=的方式来配置
1.2.2 库函数方式下的配置外设步骤
1.调用使能时钟的函数
![image-20230111151923891](/i/l/?n=23&i=blog/3079098/202301/3079098-20230111154653200-195202703.png)
此函数是来使能或失能挂载载APB2下的外设时钟
此函数中已经包含&=或|=的运算,避免了像寄存器赋值一样伤及无辜
2.初始化外设寄存器的值
GPIO_init()GPIO初始化函数
这其中会涉及到结构体配置,访问结构体成员,给它们赋值
3.输出高低电平函数
GPIO_SET
GPIO_RESET
1.3 工程架构
新建工程就是按照以下的工程架构来建立的
程序在启动文件startup_xx.s中执行,启动文件中有复位中断和其他中断组成。
其中复位中断先调用Systeminit函数来配置时钟频率等初始化信息,然后才执行main主函数。而Systeminit函数在Systeminit.c/h文件中有定义,所以需要添加进工程中。另外,需要添加内外设寄存器描述文件进入工程才可以实现寄存器方式开发。
在此基础上,加入库函数.c/.h文件和库函数配置文件(描述各个库函数之间的关系)才能进行库函数开发。
启动文件中的其他中断则负责调用中断处理函数,而中断处理函数是在如stm32f10x_it.c/h文件中定义的,也需要添加进工程中。