基于标准外设库的LED灯

0关于固件库

1、固件库相当于你在一个文件里定义好的函数,定义好的宏,在main函数中调用。使main函数更加的简洁。更像高级语言一样让人有上下文的既视感。

2、使用寄存器操作STM32,相对来讲简单,但是代码量过于繁琐,而且指针,和地址偏移,对于后续的代码递归,循环有非常大的烦恼,所以我们采用STM32官方指定的固件库,在现有的固件库里根据自己的电路板针脚定义,少量的添加一些自定义函数及宏。这样就避免每次去寻找寄存器的地址。

一、创建一个keil工程

新建文件夹test3用于保存此次作业

在这里插入图片描述

在keil中创建此次工程命令为led、添加芯片**

在这里插入图片描述

** 由STM32标准库下载地址下载标准库,放入到STM32文件**中

在这里插入图片描述
在这里插入图片描述

STM32文件夹有如下内容

在这里插入图片描述

Library文件夹有如下内容

Start文件夹有如下内容

在这里插入图片描述

User文件夹有如下内容

在这里插入图片描述

并将其中的User、Library、Start文件夹复制到test3中

在这里插入图片描述

其中
User文件夹:放用户应用程序源代码
Library文件夹:放置库文件
Start文件夹:放置启动文件
Listing、DebugConfig和Objects文件是我们创建一个工程是编译自动生成的
Delay文件夹:包含相关时延函数
创建好led工程后把User、Start、Library、Delay(地址https://pan.baidu.com/s/1S9cQefUw2IZsdr4vgS3YlA?pwd=1111
这)四个文件夹添加进去

在这里插入图片描述

将test3文件夹下的文件分别添加到led工程下新对应的文件夹下面

在这里插入图片描述
添加完成后
在这里插入图片描述

点击魔术棒,选择C++ include path 添加文件夹的路径

在这里插入图片描述
添加完成后,编译程序(这里我是删除了其他的驱动程序的,只留下startup_stm32f10x_hd.s)
在这里插入图片描述
显示编译成功

主函数代码:

#include "stm32f10x.h"          // Device header
#include "Delay.h"
int main(void)
{
	//时钟配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启PA5口的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	//输入输出模式设置,输出速度设置
	GPIO_InitTypeDef GPIO_InitStructure, GPIO_InitStructureB, GPIO_InitStructureC;
	// A5
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;// 选择0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	//配置B9
	GPIO_InitStructureB.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructureB.GPIO_Pin = GPIO_Pin_9;// 选择9号引脚
	GPIO_InitStructureB.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	//配置C14
	GPIO_InitStructureC.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructureC.GPIO_Pin = GPIO_Pin_14;// 选择14号引脚
	GPIO_InitStructureC.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);// GPIOA外设的5号引脚配置为推挽输出、50MHz速度
	GPIO_Init(GPIOB, &GPIO_InitStructureB);
	GPIO_Init(GPIOC, &GPIO_InitStructureC);
	//GPIO_SetBits(GPIOA, GPIO_Pin_5);
	
	//GPIO_ResetBits(GPIOA, GPIO_Pin_5);//将端口设置为低电平
	while(1)
	{
		//A亮
		GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_SET);
		GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);//Bit_RESET电平0,Bit_SET电平1
		Delay_ms(1000);
		//B亮
		GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
		GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_RESET);
		Delay_ms(1000);
		//将上一个点亮的熄灭,C亮
		GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_SET);
		GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_RESET);
		Delay_ms(1000);
	}
	
}

时延函数主程序:

在这里插入代码片
#include "stm32f10x.h"          // Device header
#include "Delay.h"
int main(void)
{
	//时钟配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启PA5口的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	//输入输出模式设置,输出速度设置
	GPIO_InitTypeDef GPIO_InitStructure, GPIO_InitStructureB, GPIO_InitStructureC;
	// A5
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;// 选择0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	//配置B9
	GPIO_InitStructureB.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructureB.GPIO_Pin = GPIO_Pin_9;// 选择9号引脚
	GPIO_InitStructureB.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	//配置C14
	GPIO_InitStructureC.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructureC.GPIO_Pin = GPIO_Pin_14;// 选择14号引脚
	GPIO_InitStructureC.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);// GPIOA外设的5号引脚配置为推挽输出、50MHz速度
	GPIO_Init(GPIOB, &GPIO_InitStructureB);
	GPIO_Init(GPIOC, &GPIO_InitStructureC);
	//GPIO_SetBits(GPIOA, GPIO_Pin_5);
	
	//GPIO_ResetBits(GPIOA, GPIO_Pin_5);//将端口设置为低电平
	while(1)
	{
		//A亮
		GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_SET);
		GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);//Bit_RESET电平0,Bit_SET电平1
		Delay_ms(1000);
		//B亮
		GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
		GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_RESET);
		Delay_ms(1000);
		//将上一个点亮的熄灭,C亮
		GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_SET);
		GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_RESET);
		Delay_ms(1000);
	}
	
}

现在烧录到stm32开发板上,实物连接图如下
在这里插入图片描述
连接到电脑后,下载程序成功后,结果如下:

led

二、使用keil软件仿真逻辑分析仪功能观察管脚的时序波形

修改Debug

在这里插入图片描述
完成之后点击仿真、选择示波器,输入想查看的引脚(这里我是观察的A5、B9、C14)
在这里插入图片描述
在这里插入图片描述
可以直观的计算波形的宽度:移动光标的位置到某一个点,单击鼠标左键就会把这个点设置为起始点,然后移动光标到另一个位置就可以看到更多的信息,包括时间还有两点之间的时间差,也就是宽度。

三、总结

联系实验一发现基于外设库实现的led流水灯要比寄存器方式简单一些,寄存器方式速度比较慢、程序可读性差、维护也比较复杂,还要不停的查找地址但是它更直观占用的资源也少。固件库的话要简单一些,但是对于初学者来说不是很容易弄懂。连接开发板的时候一定要仔细检查是否连正确,我这里犯了一个非常低级的错误把灯连反了以至于程序烧录进去后一直不闪烁,后来检查发现是灯连反了,所以一定要自己检查。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值