本篇博文最后修改时间:2016年12月29日,01:24。
一、简介
本文介绍如何使用STM32控制LED,含亮、灭、定时亮、亮度取反四种模式。
本文IO口使用PB12。
二、实验平台
库版本:STM32F10x_StdPeriph_Lib_V3.5.0
编译软件:MDK4.53
硬件平台:STM32开发板
仿真器:JLINK
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、实验前提
在进行本文步骤前,请先阅读并实现以下博文:
1、《STM32之系统滴答定时器》:http://blog.csdn.net/feilusia/article/details/52835711
五、
实验步骤
2) 编写驱动头文件 GUA_Led.h(存放在“ …… \HARDWARE ”)
3) 工程中添加GUA_Led.c
2) 添加驱动初始化代码(main.c的main函数中)
3) 添加测试代码
②调用测试代码 ( main.c的main函数中 )
六、实验结果
1、编写并添加LED驱动
1)编写驱动GUA_Led.c(存放在“……\HARDWARE”)
//******************************************************************************
//name: GUA_Led.c
//introduce: Led驱动
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.29
//******************************************************************************
#include "stm32f10x.h"
#include "GUA_Led.h"
#include "GUA_SysTick.h"
/*********************内部函数************************/
static void GUA_Led_PowerOnOff_Init(void);
//******************************************************************************
//name: GUA_Led_PowerOnOff_Init
//introduce: 电源指示灯初始化
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.29
//******************************************************************************
static void GUA_Led_PowerOnOff_Init(void)
{
//IO结构体
GPIO_InitTypeDef GPIO_InitStructure;
//时钟使能
RCC_APB2PeriphClockCmd(GUA_LED_POWERONOFF_RCC, ENABLE);
//开关机led的IO配置
GPIO_InitStructure.GPIO_Pin = GUA_LED_POWERONOFF_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GUA_LED_POWERONOFF_PORT, &GPIO_InitStructure);
}
//******************************************************************************
//name: GUA_Led_Set
//introduce: 香瓜点灯驱动
//parameter: nGUA_Led_Port:IO端口
// nGUA_Led_Pin:IO引脚
// nGUA_Led_Mode:IO模式
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.29
//******************************************************************************
void GUA_Led_Set(GPIO_TypeDef* nGUA_Led_Port, GUA_U16 nGUA_Led_Pin, GUA_U8 nGUA_Led_Mode)
{
switch(nGUA_Led_Mode)
{
//灭
case GUA_LED_MODE_OFF:
{
GPIO_WriteBit(nGUA_Led_Port, nGUA_Led_Pin, GUA_LED_OFF);
break;
}
//亮
case GUA_LED_MODE_ON:
{
GPIO_WriteBit(nGUA_Led_Port, nGUA_Led_Pin, GUA_LED_ON);
break;
}
//先亮后灭
case GUA_LED_MODE_FLASH:
{
GPIO_WriteBit(nGUA_Led_Port, nGUA_Led_Pin, GUA_LED_ON);
GUA_Delay_Us(1000000);
GPIO_WriteBit(nGUA_Led_Port, nGUA_Led_Pin, GUA_LED_OFF);
break;
}
//取反
case GUA_LED_MODE_TOGGLE:
{
//如何当前亮,则灭
if(GPIO_ReadInputDataBit(nGUA_Led_Port, nGUA_Led_Pin) == GUA_LED_ON)
{
GPIO_WriteBit(nGUA_Led_Port, nGUA_Led_Pin, GUA_LED_OFF);
}
//如何当前灭,则亮
else
{
GPIO_WriteBit(nGUA_Led_Port, nGUA_Led_Pin, GUA_LED_ON);
}
break;
}
//其他
default:break;
}
}
//******************************************************************************
//name: GUA_Led_Init
//introduce: LED初始化
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.29
//******************************************************************************
void GUA_Led_Init(void)
{
//电源指示灯初始化
GUA_Led_PowerOnOff_Init();
}
2) 编写驱动头文件 GUA_Led.h(存放在“ …… \HARDWARE ”)
//******************************************************************************
//name: GUA_Led.h
//introduce: Led驱动
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.29
//******************************************************************************
#ifndef _GUA_LED_H_
#define _GUA_LED_H_
/*********************头文件************************/
#include "stm32f10x.h"
/*********************宏定义************************/
#ifndef GUA_U8
typedef unsigned char GUA_U8;
#endif
#ifndef GUA_8
typedef signed char GUA_8;
#endif
#ifndef GUA_U16
typedef unsigned short GUA_U16;
#endif
#ifndef GUA_16
typedef signed short GUA_16;
#endif
#ifndef GUA_U32
typedef unsigned long GUA_U32;
#endif
#ifndef GUA_32
typedef signed long GUA_32;
#endif
#ifndef GUA_U64
typedef unsigned long long GUA_U64;
#endif
#ifndef GUA_64
typedef signed long long GUA_64;
#endif
//电源指示灯引脚
#define GUA_LED_POWERONOFF_PORT GPIOB
#define GUA_LED_POWERONOFF_PIN GPIO_Pin_12
#define GUA_LED_POWERONOFF_RCC RCC_APB2Periph_GPIOB
//Modes
#define GUA_LED_MODE_OFF 0x00
#define GUA_LED_MODE_ON 0x01
#define GUA_LED_MODE_FLASH 0x02
#define GUA_LED_MODE_TOGGLE 0x04
//LED亮灭
#define GUA_LED_ON Bit_SET
#define GUA_LED_OFF Bit_RESET
/*********************外部函数************************/
void GUA_Led_Set(GPIO_TypeDef* nGUA_Led_Port, GUA_U16 nGUA_Led_Pin, GUA_U8 nGUA_Led_Mode);
extern void GUA_Led_Init(void);
#endif
3) 工程中添加GUA_Led.c
4)在MDK设置中添加驱动源文件路径
2、在应用层中调用
1)添加驱动头文件(main.c中)
#include "GUA_Led.h"
2) 添加驱动初始化代码(main.c的main函数中)
//LED初始化
GUA_Led_Init();
3) 添加测试代码
①写测试代码(main.c中)
//******************************************************************************
//name: GUA_Test
//introduce: 测试代码
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.10.21
//******************************************************************************
static void GUA_Test(void)
{
while(1)
{
GUA_Led_Set(GUA_LED_POWERONOFF, GUA_LED_POWERONOFF_PIN, GUA_LED_MODE_ON); //亮
GUA_Led_Set(GUA_LED_POWERONOFF, GUA_LED_POWERONOFF_PIN, GUA_LED_MODE_OFF); //灭
GUA_Led_Set(GUA_LED_POWERONOFF, GUA_LED_POWERONOFF_PIN, GUA_LED_MODE_FLASH); //亮1S
GUA_Led_Set(GUA_LED_POWERONOFF, GUA_LED_POWERONOFF_PIN, GUA_LED_MODE_TOGGLE); //取反
GUA_Led_Set(GUA_LED_POWERONOFF, GUA_LED_POWERONOFF_PIN, GUA_LED_MODE_TOGGLE); //取反
GUA_Led_Set(GUA_LED_POWERONOFF, GUA_LED_POWERONOFF_PIN, GUA_LED_MODE_TOGGLE); //取反
}
}
②调用测试代码 ( main.c的main函数中 )
//测试代码
GUA_Test();
六、实验结果
仿真并单步执行测试代码,可观察到PB12的led的亮灭情况与测试代码的注释一样(如果没有接led,可以用万用表测试电平)。
因此实验成功。