在学习STM32的过程中,有相当一部分时间花在了学习相关驱动函数上,今天就来梳理一下与LED点灯相关的一些函数及软件操作
首先来了解一下我们今天用到的主要的函数是什么,代码如下:
void LED_Init(void)
{
GPIO_InitTypeDef GPIOInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
只看代码的话理解起来会十分困难,接下来我们通过原理图来具体分析相关的函数到底有什么意义。
看下面这张原理图:
我们可以清楚的发现PD2引脚和PA8引脚分别控制着LED1和LED0,下面来看看相应LED模块的原理图
可以发现两个发光LED二极管正极连接着3.3V的VCC电源,所以正极的输入信号为1。而负极连接着LED0和LED1两个引脚,当LED1引脚为信号0(也就是为低电平)时,有顺着LED的电平差,此时电流就可以顺利流过LED2,LED0同理。那既然我们知道原理了,能不能像51单片机一样直接控制引脚的电平呢?直觉告诉我们好像是不能的哈。那该怎么做呢,这就要说到本文章的重要主角了:“引脚驱动函数”
在开始介绍引脚驱动函数之前,我们先来了解一个51单片机有而STM32没有的机制:51单片机会自动设置相应引脚的输出频率,输出方式等参数,而STM32需要通过代码调试。这就需要我们在使用相应STM32GPIO引脚时加入时钟函数。下面来了解一下这个函数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);
这个函数的作用是将GPIOx(x=A,B,C,D)的一组引脚的时钟使能的。后面两个参数是:选择哪一组的GPIO口,是否使能这组GPIO口。
接下来我们通过结构体继续理解初始化相应GPIO口的各项属性:
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
这一项是配置相应GPIO口的模式一共有八种模式,在这里再复习一下:上拉输入,下拉输入,浮空输入,模拟输入,推挽输出,开漏输出,复用推挽,复用开漏。
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
这个函数是配置到底是对(某一组中的)哪个GPIO口进行配置
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
此项函数是用来配置相应IO口的传输频率的,一共有3种速度可选:2MHz,10MHz,50MHz。
GPIO_Init(GPIOA,&GPIO_InitStructure);
这个函数是用来初始化相应IO口的,前面的入口参数选择哪一组GPIO口,后面的入口参数选择结构体地址。
GPIO_SetBits(GPIOA,GPIO_Pin_8);
最后一个函数的功能就像他的名字一样,可以设置某一组GPIO口的某个引脚输出高电平。如果能输出高电平,那就一定有函数可以输出低电平GPIO_ResetBits(GPIOA,GPIO_Pin_8);这个函数就是用来输出低电平的,用法和上面的函数一样,就是名字换了。
这样一来我们就把LED_Init函数配置好了,需要的时候直接把它扔进主函数就可以了。
最后我们来提一嘴一个非常重要的函数
#ifndef<标识>
#define<标识>
.//这里正常写入代码
.//
.//
.//
.//
.//
#endif
这个函数在头文件数量繁多的程序中非常重要,有了它,在函数编译的时候就能避免重复定义头文件,减少程序报错。(接下篇)