stm32_LED闪烁
1、程序总体框架:
先是介绍程序的总体框架,随后会有每一步的详解:
框架如下:
/*main.c文件***********************************************************/
#include "led.h"
int main(void)
{
LED_Init();
while(1)
{
led_display();
}
}
/*led.c文件*************************************************************/
#include "led.h"
/*延时函数*/void delay(u32 i){ while(i--);}
/*LED初始化函数*/
void LED_Init()
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
/*LED驱动函数*/
void led_display()
{
GPIO_SetBits(GPIOD,GPIO_Pin_All);
delay(6000000);
GPIO_ResetBits(GPIOD,GPIO_Pin_All);
delay(6000000);
}
/*led.h文件***********************************************************/
#ifndef _led_H
#define _led_H
#include <stm32f10x.h>
void LED_Init(void);
void led_display(void);
#endif
框架详解:
在led.h文件中有led.c文件中的函数声明,放在这个文件中的目的是为了方便在其他文件中调用led.c文件中的函数
2、配置系统时钟:
在stm32中配置时钟是很重要的,配置系统时钟为72Mhz只需要通过一个库函数就可以,代码如下:
SystemInit(); //配置系统时钟为72Mhz
3、打开相应的管脚的时钟:
配置好了系统的时钟之后,要使用什么外设还要打开相应的外设的时钟,如果不打开就没办法使用,这是stm32的一种节能的策略,如果不打开时钟,外设就不工作,从而降低功耗。
我在这里使用的是PD端口的13管脚,所以要打开端口D的时钟。
代码如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //打开端口D的时钟
4、配置端口:
打开了相应的端口之后就可以进行配置了,我在这里只是使用了PD13管脚,所以只配置PD13。
代码如下:
GPIO_InitTypeDef GPIO_InitStructure; //声明相应的结构体变量
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; //选中13管脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //管脚模式为推挽输出,推挽输出模式可以驱动led
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //管脚速度为50Mhz
GPIO_Init(GPIOD,&GPIO_InitStructure); //向初始化函数中传入参数,第一个参数确定了D端口,第二个参数为前面定义的结构体变量,确定了端口的配置信息
代码解析:
这段代码先是定义了一个结构体变量
紧跟着的三条语句是对结构体变量中的三个成员变量进行赋值
最后一个语句调用了GPIO的初始化函数,此函数需要传入两个参数,可以在stm32的库函数使用手册中进行查询;第一个参数即GPIOD,确定了要初始化的端口是PD端口;第二个参数即&GPIO_InitStructure是取结构体变量GPIO_InitStructure的地址,这个结构体变量中的三个成员确定了需要对端口进行什么样的配置
5、LED驱动函数:
到这里GPIO就已经配置完成了,接下来就要配置一个led的驱动函数。
代码如下:
GPIO_SetBits(GPIOD,GPIO_Pin_All); //点亮led
delay(6000000); //延时
GPIO_ResetBits(GPIOD,GPIO_Pin_All); //熄灭led
delay(6000000); //延时
代码解析:
GPIO_SetBits()以及GPIO_ResetBits()这两个函数可以在stm32的库函数使用手册中查到,具体的作用分别是将相应的端口配置成为高电平和低电平,以此来驱动LED,至于延时函数这是一个自己定义的函数,在下一步中会有代码以及解释
6、延时函数:
此函数是自己定义的函数,作用是进行粗略的延时。
代码如下:
void delay(u32 i)
{
while(i--);
}
代码解析:
可以看出此函数将传入的参数i进行不断自减处理,从而起到占用CPU时间的作用,进行粗略的延时