STM32F103标准库开发:LED跑马灯实验

LED跑马灯实验程序源码链接
STM32F103标准库开发—目录


一、硬件电路分析

具体LED原理图如下图所示:
在这里插入图片描述
由LED原理图可知:
当单片机的引脚,PB14和PB15输出低电平的时候,LED1和LED2
当单片机的引脚,PB14和PB15输出高电平的时候,LED1和LED2

二、LED灯GPIO配置

1. GPIO初始化配置

使能GPIO时钟

APB2外设时钟启用和禁用函数

/**
  *@功能:启用和禁用APB2外设时钟
  *@参数1:指定外围设备
  *@参数2:指定外围设备状态
  *@返回值:无
  */
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

APB2外设如下:

#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)

本次配置如下:

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // 使能PB端口时钟 

GPIO初始化配置信息

工作模式可以参考:STM32F103:GPIO八种工作原理详解

GPIO初始化函数如下

/**
  *@功能:初始化GPIO外设
  *@参数1:指定GPIO外设(GPIOA~GPIOG)
  *@参数2:指定GPIO外设的配置信息
  *@返回值:无
  */
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

GPIO_InitTypeDef----GPIO初始化配置信息:

typedef struct
{
  	uint16_t GPIO_Pin;             //指定要配置的GPIO引脚
  	GPIOSpeed_TypeDef GPIO_Speed;  //指定所选引脚的速度
  	GPIOMode_TypeDef GPIO_Mode;    //指定所选引脚的工作模式

}GPIO_InitTypeDef;

GPIO_Pin----指定要配置的GPIO引脚:

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */

GPIO_Speed----指定所选引脚的速度:

typedef enum
{ 
  	GPIO_Speed_10MHz = 1,
  	GPIO_Speed_2MHz, 
  	GPIO_Speed_50MHz
  
}GPIOSpeed_TypeDef;

GPIO_Mode----指定所选引脚的工作模式:

typedef enum
{ 
	GPIO_Mode_AIN = 0x0,			//模拟输入模式
  	GPIO_Mode_IN_FLOATING = 0x04,	//浮空输入模式
  	GPIO_Mode_IPD = 0x28,			//下拉输入模式
  	GPIO_Mode_IPU = 0x48,			//上拉输入模式
  	GPIO_Mode_Out_OD = 0x14,		//开漏输出模式
  	GPIO_Mode_Out_PP = 0x10,		//推挽输出模式
  	GPIO_Mode_AF_OD = 0x1C,			//复用开漏输出模式
  	GPIO_Mode_AF_PP = 0x18			//复用推挽输出模式
  	
}GPIOMode_TypeDef;

本次配置如下:

  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;	// PB14,PB15
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//50mHz速度
	
  GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB端口

2. GPIO输出控制配置

GPIO引脚置高函数

/**
  *@功能:GPIO引脚置高
  *@参数1:指定GPIO外设
  *@参数2:指定GPIO外设的引脚端口号
  *@返回值:无
  */
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

GPIO引脚置低函数

/**
  *@功能:GPIO引脚置低
  *@参数1:指定GPIO外设
  *@参数2:指定GPIO外设的引脚端口号
  *@返回值:无
  */
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

本次配置如下:

GPIO_SetBits(GPIOB,GPIO_Pin_14);	//PB14置高
GPIO_ResetBits(GPIOB,GPIO_Pin_14);	//PB14置低

3. 具体程序

LED.c文件

#include "led.h"

/***************  配置LED用到的I/O口 *******************/
void LED_GPIO_Config(void)	
{
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // 使能PB端口时钟 
	
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;	// PB14,PB15
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//50mHz速度
	
  GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB端口
}

LED.h文件

#ifndef __LED_H
#define	__LED_H  

#include "stm32f10x.h"

#define LED1(a)		if (a)	\
					GPIO_ResetBits(GPIOB,GPIO_Pin_14);\
					else	\
					GPIO_SetBits(GPIOB,GPIO_Pin_14)
									
#define LED2(a)		if (a)	\
					GPIO_ResetBits(GPIOB,GPIO_Pin_15);\
					else	\
					GPIO_SetBits(GPIOB,GPIO_Pin_15)				

void LED_GPIO_Config(void);	//LED初始化配置

#endif 

三、LED跑马灯

1. 延时函数

精准延时delay文件链接

2. LED跑马灯实现

#include <stdio.h>
#include "led.h"
#include "delay.h"

int main (void)
{
	SystemCoreClockUpdate(); 	//设置系统时钟为72M
	LED_GPIO_Config();			//LED初始化配置

	while(1)
	{
		LED1(1);			//LED1亮
		LED2(0);			//LED2灭
		delay_ms(200);		//延时200ms
		LED1(0);			//LED1灭
		LED2(1);			//LED2亮
		delay_ms(200);		//延时200ms
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根号五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值