基于外设库的LED流水灯

一、标准外设库下载
STM32官方下载地址
https://www.st.com/zh/embedded-software/stm32-standard-peripheral-libraries.html
二、Keil工程文件创建
创建工程
(1)新建文件夹LED1,并创建子目录CMSIS、MDK、USER、STDLIB
在这里插入图片描述

(2)将所需标准库文件进行复制粘贴CMSIS文件:
在这里插入图片描述

STDLIB文件:
在这里插入图片描述

USER文件:

(3)点击 Project → New uVision Project …
在这里插入图片描述

(4)选择在LED1文件夹下的MDK文件夹并命名为bigLED
在这里插入图片描述

(5)选择STM32F103C8芯片
在这里插入图片描述

(6)本实验在添加库文件窗口无需操作,取消即可
在这里插入图片描述

(7)右键Target 1,选择Manage Project Items
在这里插入图片描述

(8)在Manage Project Ltems中创建并添加USER、CMSIS、STDLIB的组(Groups)
在这里插入图片描述

(9)在所属组下添加文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2修改目标设置
(1)点击魔术棒
在这里插入图片描述

(2)在C/C++中添加Define(标准库没有对宏定义的声明);在IncludePaths中选择文件路径
在这里插入图片描述

(3)文件路径添加如下
在这里插入图片描述

三、代码
main.c
#include “stm32f10x.h”
#include "bsp_led.h"void Delay(uint32_t count){ for(;count != 0;count–);}int main(void){ // 来到这里的时候,系统的时钟已经被配置成72M。 LED_GPIO_Config(); //GPIO初始化 while(1) {//LED流水灯,保险起见,点亮其中一个灯时,将其余两个灯都关闭 GPIO_SetBits(LED_G_GPIO_PORT,LED_R_GPIO_PIN); //关灯 GPIO_SetBits(LED_G_GPIO_PORT,LED_B_GPIO_PIN); //关灯 GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); //开灯 Delay(0xFFFFFF); GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); //关灯 GPIO_SetBits(LED_G_GPIO_PORT,LED_R_GPIO_PIN); //关灯 GPIO_ResetBits(LED_G_GPIO_PORT,LED_B_GPIO_PIN); //开灯 Delay(0xFFFFFF); GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); //关灯 GPIO_SetBits(LED_G_GPIO_PORT,LED_B_GPIO_PIN); //关灯 GPIO_ResetBits(LED_G_GPIO_PORT,LED_R_GPIO_PIN); //开灯 Delay(0xFFFFFF);}

bsp_led.h
#ifndef _BSP_LED_H
#define _BSP_LED_H
#include “stm32f10x.h” //要包含固件库的.h文件
#define LED_G_GPIO_PIN GPIO_Pin_0 //定义绿灯管脚号
#define LED_B_GPIO_PIN GPIO_Pin_1 //定义蓝灯管脚号
#define LED_R_GPIO_PIN GPIO_Pin_5 //定义红灯管脚号
#define LED_G_GPIO_PORT GPIOB //定义用到的GPIO
#define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB//定义RCC时钟寄存器
void LED_GPIO_Config(void); //.c文件中的函数声明
#endif /_BSP_LED_H/

bsp_led.c
#include “bsp_led.h”
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //定义变量,方便赋值
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,ENABLE); //打开APB2时钟,GPIO挂载在APB2
//GPIO_PIN的部分用或将用到的管脚初始化为一个十六进制数据,原本是三个十六进制
GPIO_InitStruct.GPIO_Pin = (LED_G_GPIO_PIN|LED_B_GPIO_PIN|LED_R_GPIO_PIN); //设置需要用到的管脚,LED_G_GPIO_PIN看.h文件
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出模式为推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率为50MHz,LED_G_GPIO_CLK看.h文件
GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct); //加上&,方便取值 //初始化GPIO
}
编译通过
在这里插入图片描述

实况
1.接线
在这里插入图片描述

2.烧录
在这里插入图片描述

3.运行视频
https://live.csdn.net/v/335407
四、利用KEIL的软件仿真的逻辑分析仪功能观察GPIO的波形
1、环境配置
在这里插入图片描述
2、仿真
(1)点击Start/Stop Debug Session
在这里插入图片描述

(2)选择逻辑观察仪和引脚
在这里插入图片描述
在这里插入图片描述

(3)运行
在这里插入图片描述

回答:
LED灯的亮/灭周期主要由软件循环延时和硬件时钟频率共同决定 。
LED灯的亮/灭周期大致为:
循环延时(ms) / 硬件时钟频率(Hz)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值