接着上一篇点亮LED的文章,我们现在准备更进一步,让LED闪烁,如果你了解过我上篇点亮LED文章,并且控制了LED的亮灭状态,可以略过本文章内容,本文章内容跟上篇一样,只是程序有所改变,有兴趣的读者可以参考。
控制LED需要使用到GPIO输入和输出IO口,GPIO是STM32控制管脚,GPIO的管脚与外部设备连接,能够实现与外部进行通信,控制,采集数据等。
GPIO框图
1.1硬件设置
LED的阴极连接到了STM32的GPIO管脚,只要我们控制GPIO电平的输出状态,赋予高或低电平,就能够控制LED的亮灭状态。如果你的开发板的LED灯连接方式不一样,修改工程相关管脚即可。
要想点亮LED需要了解GPIO模式配置,如下。
第一版闪烁LED程序
1、led.h头文件相关宏定义代码
#include "stm32f10x.h"
/* ---------------------------------------------
文件名称:led.h
描述:硬件相关模块封装 宏定义 方便移植
-----------------------------------------------------*/
#define GPIO_LED_PROT GPIOC
#define GPIO_LED_CLK RCC_APB2Periph_GPIOC
#define GPIO_LED_PIN GPIO_Pin_13
void GPIO_Cofing(void);
2、led.c 文件的代码
RCC_APB2PeriphClockCmd(GPIO_LED_CLK,ENABLE);
配置IO时必须要使能时钟,时钟犹如人的心脏。
#include "bsp-led.h"
void GPIO_Cofing(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //声明一个结构体
RCC_APB2PeriphClockCmd(GPIO_LED_CLK,ENABLE); //使能GPIOC时钟
GPIO_InitStruct.GPIO_Pin = GPIO_LED_PIN; //控制PC13管脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //设置管脚为通用推挽输出模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //设置管脚速率为50MHZ
GPIO_Init(GPIO_LED_PROT,&GPIO_InitStruct); //初始化结构体
}
主函数.main.c
#include "stm32f10x.h"
#include "bsp-led.h"
void DS_delay(uint32_t Count);
int main(void)
{
GPIO_Cofing();
while(1)
{
//寄存器GPIOx_BRR 相关寄存器配置请查看手册
//作用:置1 清除对应ODR为0 注意:低15位有效
GPIO_ResetBits(GPIO_LED_PROT, GPIO_LED_PIN);
DS_delay(0XFFFFFF); //延迟
//寄存器GPIOx_BSRR
//作用: 置1 设置对应ODR为1
GPIO_SetBits(GPIO_LED_PROT, GPIO_LED_PIN);
DS_delay(0XFFFFFF);
}
}
void DS_delay(uint32_t Count) //延迟函数
{
while(Count != 0) //空转
{
Count--;
}
}
第二版闪烁LED程序
1、led.h头文件相关宏定义代码
#include "stm32f10x.h"
/* ---------------------------------------------
文件名称:led.h
描述:硬件相关模块封装 宏定义 方便移植
-----------------------------------------------------*/
#define GPIO_LED_PROT GPIOC
#define GPIO_LED_CLK RCC_APB2Periph_GPIOC
#define GPIO_LED_PIN GPIO_Pin_13
#define METET_LED(p,i) (p->ODR ^= i) //反转LED
#define REVERES_LED METET_LED(GPIO_LED_PROT,GPIO_LED_PIN)
void GPIO_Cofing(void);
2、led.c 文件的代码
#include "bsp-led.h"
void GPIO_Cofing(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //声明一个结构体
RCC_APB2PeriphClockCmd(GPIO_LED_CLK,ENABLE); //使能GPIOC时钟
GPIO_InitStruct.GPIO_Pin = GPIO_LED_PIN; //控制PC13管脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //设置管脚为通用推挽输出模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //设置管脚速率为50MHZ
GPIO_Init(GPIO_LED_PROT,&GPIO_InitStruct); //初始化结构体
}
主函数.main.c
#include "stm32f10x.h"
#include "bsp-led.h"
void DS_delay(uint32_t Count);
int main(void)
{
GPIO_Cofing();
while(1)
{
REVERES_LED; //反转LED
DS_delay(0XFFFFFF); //延迟
}
}
void DS_delay(uint32_t Count) //延迟函数
{
while(Count != 0) //空转
{
Count--;
}
}
烧录程序之后就可以看到闪烁LED啦! 想要精准到秒或者毫秒级别可以使用系统滴答定时器Systick 或者 定时器TIMx 后面可能会讲到,因为还在校,时间很少,还要做其他东西,所以有时间的话会更新,
完!