基于固件库的stm32 LED流水灯

一、下载固件库

下载网址:STM32标准外设软件库
我们的芯片是STM32F103C8T6,于是选择F1
在这里插入图片描述
获取软件
在这里插入图片描述
接收许可,姓名不重要可乱填,但邮件地址必须真实,它会将固件库下载链接发到邮件里
在这里插入图片描述
在邮箱收到邮件后打开,点击下载
在这里插入图片描述

在这里插入图片描述

二、MDK Keil5 使用固件库创建STM32工程

开始前的配置(文件加好后可备份一下,以后每次使用库都会这样用)
1、新建工程文件夹CTRL+Shift+N
在这里插入图片描述
2、打开新建的工程文件夹,在文件夹下新建如下文件
在这里插入图片描述
3、CMSIS文件夹下存放的文件如下
在这里插入图片描述
其中startup中存放的文件为启动文件
在这里插入图片描述
可以在固件库的查找路径为:

en.stsw-stm32054_v3-6-0\STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS

4、DOC文件存放客户说明文件
5、Libraries文件夹存放库文件
将路径:en.stsw-stm32054_v3-6-0\STM32F10x_StdPeriph_Lib_V3.6.0\Libraries
下的inc和src两个文件夹复制到新建的Libraries文件夹中
在这里插入图片描述
6、Project文件夹用于存放我们自己建立的Keil5工程文件
7、User文件夹新建main.c文件
8、打开Keil5,新建工程,工程目录为刚才新建的Project文件夹
在这里插入图片描述
在这里插入图片描述
选择我们使用的芯片
在这里插入图片描述
接着弹出的框不用管,那是在提示用不用软件自带的库。可×掉
9、工程建好后,点盒子按钮,新建与刚才相同的文件夹名,并将其中的所有文件都通过AddFile加入到这里。

在这里插入图片描述

全部添加好后如图:
在这里插入图片描述

10、才需要点击魔法棒按钮进行配置
在这里插入图片描述
点C/C++,在Define那儿输入USE_STDPERIPH_DRIVER,目的是编译include “stm32f10x.h”
然后,将刚才新建的文件夹添加到include Paths
点击魔术棒,选C/C++如下配置
在这里插入图片描述

点击Debug,选ST-Link,再在Setting里找到FlashDownload勾选Reset and Run
在这里插入图片描述

至此配置完成,完成后将当前文件夹备份一份,因为每次用STM32F103C8T6都需要这样配置,复制后,以后就不用这么麻烦了。
在User文件目录下新建三个文件:main.c、led.c、led.h,并在Keil5中左边的目录下加入已存在的文件,将这三个文件加入进来

三、代码实现

1、main.c文件

#include "stm32f10x.h"                  // Device header
#include "led.h"
/*函数名:Delay
*功能描述:不精确的延时,延迟时间=nCount/7200,单位ms,72MHZ为STM32主频
*输入参数:nCount
*输出参数:无
*/
void Delay(__IO u32 nCount)
{
	for(;nCount !=0; nCount--);
}

int main(void)
{
	LED_Init();//初始化ABC所有端口
	while(1)
	{
		//A亮,低电平点亮
		GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//Bit_RESET电平0,Bit_SET电平1
		Delay(720000);
		//B亮
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
		GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_RESET);
		Delay(720000);
		//将上一个点亮的熄灭,C亮
		GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_SET);
		GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
		Delay(720000);	//延迟10ms
	}
}

2、led.c文件(用到的端口的初始化)

#include "led.h"
#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
	//定义了GPIO_InitTypeDef类型的结构体变量
	GPIO_InitTypeDef GPIO_InitStructure, GPIO_InitStructureB, GPIO_InitStructureC;
	//时钟配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启PA0口的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	//输入输出模式设置,输出速度设置
	// A0
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;// 选择0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	//配置B1
	GPIO_InitStructureB.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructureB.GPIO_Pin = GPIO_Pin_1;// 选择1号引脚
	GPIO_InitStructureB.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	//配置C13
	GPIO_InitStructureC.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructureC.GPIO_Pin = GPIO_Pin_13;// 选择13号引脚
	GPIO_InitStructureC.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);// GPIOA外设的0号引脚配置为推挽输出、50MHz速度
	GPIO_Init(GPIOB, &GPIO_InitStructureB);
	GPIO_Init(GPIOC, &GPIO_InitStructureC);
}

3、led.h文件

防止重复定义LED_Init

#ifdef __LED_H
#define __LED_H

#include "stm32f10x.h"                  // Device header
void LED_Init(void);//函数声明

#endif

四、Keil5仿真—示波器显示

1、如何调出示波器

Debug处选择“Use Simulator"
Dialog DLL处:DARMSTM.DLL
Parameter处(我的STM32芯片型号):pSTM32F103C8
硬件仿真填入:TARMSTM.DLL
在这里插入图片描述
然后点击仿真按钮开始仿真
打开逻辑分析仪窗口
在这里插入图片描述
点击View菜单,选择“Symbols Windows"选项,在弹出的窗口里”Special Function Register"里找到查看波形引脚
在这里插入图片描述
例如这里选择GPIOA_IDR,按住后将其拖入逻辑分析仪窗口
在这里插入图片描述
点击“Setup”,将“Display Type”选为“Bit",且用”And Mask“和”Shift Right"来过滤掉不需要显示的位
在这里插入图片描述
然后关闭全速运行即可看见指定引脚的波形
我用的端口为:A0,B1,C13
在这里插入图片描述

在这里插入图片描述

2、示波器结果

在这里插入图片描述

3、分析

我们程序写的是低电平点亮,所以每次有两个高电平一个低电平
在这里插入图片描述
一次波形变化,相差时间为:65.26719-65.19378s
相差73.40743ms
结论:时序状态正确,高低电平转换周期为73.40743ms

五、实物效果

LED流水灯

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值