一、STM32标准库函数简要介绍及与寄存器编程的区别
STM32标准库是一套由STMicroelectronics提供的软件库,用于简化在STM32微控制器上开发应用程序的过程。它包含了许多常用的函数和驱动程序,可用于配置和操作STM32微控制器的各种硬件资源。
STM32标准库函数可以分为几个主要类别:
系统初始化函数:用于初始化系统时钟、中断向量表和其他系统设置。
GPIO函数:用于配置和操作通用输入/输出端口,包括设置引脚方向、读取和写入引脚状态等。
外设驱动函数:用于配置和操作各种外设,如串口、SPI、I2C等。这些函数包括初始化外设、发送和接收数据等。
中断处理函数:用于配置和处理中断。它们允许您定义中断服务函数,并将其与特定的中断源关联起来。
与寄存器编程相比,STM32标准库函数的主要优势在于简化了开发过程。使用标准库函数,您可以通过调用封装好的函数来配置和操作硬件资源,而无需直接访问寄存器。这样可以减少编写大量底层代码的工作量,并提高开发效率。
二、STM32标准库函数工程模板的建立
2.1 新建工程
我们首先打开keil MDK,点击“NEW PROJECT"
命名好工程名字,文件路径。(建议工程名字使用英语)。完成后,选择STM32F103C8T6。
随后弹出来的这个界面不用管,直接取消掉。这个是用它自带的library添加所需库函数。但是我试了很多次发现文件总是缺少一些,所以就自己手动添加了。
2.2 新建组与库函数文件的添加
进入工程界面,点击魔术棒右边的三个箱子的图案。这是用来管理分组的。
进入管理界面,在中间添加四个组,名字命名为Start,Library,User,System。
同时,我们在工程对应文件夹中也新建同名的这些文件。
所有配置函数需要在ST官网进行下载:https://www.st.com/zh/embedded-software/stm32-standard-peripheral-libraries.html
在Start本地文件夹中,我们存放STM32编程所需的启动库函数,所需列表如下。(Startup函数只需选用.md那一项即可,但全部添加也没有什么问题,只是我们只用那个文件而已)
在Library本地文件夹中,我们存放STM32编程所需的应用库函数,包括GPIO,中断,定时,看门狗等等源函数。我们如果想要使用这些功能,直接找到里面对应的函数,根据函数的定义进行规范调用即可。
在User本地文件夹中,我们存放STM32内核函数以及我们的主函数。
在System本地文件夹中中,我们存放我们自己想定义和配置的函数。这也是满足模块化编程的需要。如果所有函数都挤在main函数中,就会显得很乱没有逻辑性。所以我们把一些函数单独分组放在一起,写上头文件,在使用时在主函数中单独调用即可。在这里我们需要配置一个延时函数Delay。
我们还需要修改一下头文件路径,这样编译器才能找到我们所添加的函数
点击魔术棒,选择C/C++,在“Define”栏中写上如下字符
随后点开“Include Paths”右边的三个点,在窗口中将我们的Start,Library,System,User文件都添加进去
然后我们在keil中点击每个组,将本地文件夹里对应的文件添加到组里面,添加结果如下所示
我们最后在主函数中写上头文件,写上主函数和while循环。进行编译。如果没有错,说明工程建立成功了。
我们这里使用的是V5编译器,在魔术棒中,选择"Target",进行设置
三、LED流水灯实验
程序主函数最终代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//?????GPIO_InitStructure,GPIO_InitTypeDef????????,?Library??gpio.h????????
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//??GPIOA???,????????
//??GPIOA
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//?????????
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0;//??GPIOA?0123??
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//???????50MHZ
GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIO_Init???GPIO???,???????????????,????
while (1)
{
GPIO_Write(GPIOA, ~0x0001); //16???2???,0000 0000 0000 0001,????,A0?????
Delay_ms(1000);//??1000ms,???1?
GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010,????,,A1?????
Delay_ms(1000);
GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100,????,,A2?????
Delay_ms(1000);
GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000,????,,A3?????
Delay_ms(1000);
}
}
keil调试与端口电平波形显示
在KEIL中,我们不仅可以用硬件对我们的代码进行编译下载,还可以使用KEIL自带的软件调试功能。我们利用KEIL逻辑分析仪对端口的电平变化波形进行观察。
因为出现以上情况,所以我们在下图改成如下
在1056行将9改为6
再点开“Debug”,修改以下选项
修改完成后,点击打开调试界面,然后打开逻辑分析仪
在逻辑分析仪的左上角有一个“Set Up”选项,点击它。
在弹出的窗口中,我们新建观察引脚。在框中输入(PORTA.X),你想观察几号引脚,X就填几。我这里观察0,1,2三个引脚。添加完成后,一定要把每个的“Display Type"改成比特
然后得到波形
根据观察结果我们看到,波形都是连续变化的,PA0由低变高后,PA1紧接着变成低电平。低电平持续时间为1s。
添加链接描述
四、总结
此次STM32学习的主要内容为基于STM32标准外设库的LED流水灯。在学习LED流水灯项目中,我深入了解了STM32标准外设库的用法。通过库函数的调用,可以方便地配置和控制MCU的外设,如GPIO端口和定时器。与寄存器编程方式相比, 库函数更加具有逻辑性与模块性。寄存器需要不断查找手册,找到寄存器对应的地址,包括使能寄存器,输出寄存器等等,过程很麻烦,不过还是通过查阅资料完成了。