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. 延时函数
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
}
}