基于STM32标准库函数的LED流水灯实验

一、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端口和定时器。与寄存器编程方式相比, 库函数更加具有逻辑性与模块性。寄存器需要不断查找手册,找到寄存器对应的地址,包括使能寄存器,输出寄存器等等,过程很麻烦,不过还是通过查阅资料完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值