在学习STM32F单片机时,我们常常困惑什么时候才能叫入门,采用什么样的教材入门,或者采用什么的编程软件。在学习类的教材中,以神州,原点教材布局很多,但是相信很多人看到这类教材也是一头雾水,需要你花费巨大的精力从寄存器的最底层去学习和了解,学习时间还是相对漫长。在采用的编程软件中,KEIL和IAR各有优势吧,在这里我选用的是KEIL。
在开始学习编程时,我采用的是库函数开发指南。在安装完成KEIL软件和添加项目工程时,就开始学习库函数编程。
在编写一个GPIO口控制时,首先我们要知道我们要实现的功能,连接的IO口和怎么配置GPIO口。最常见的以LED举例来说。比如我采用PB13引脚连接LED灯的负极,按照硬件的逻辑需要置位该引脚为低电平,LED才点亮。置位高电平,LED灯熄灭。按照库函数编程的规则,我需要创建一个LED.C和一个LED.H文件,当然,也可以省事,两个不需要创建,创建的好处,方便以后直接移植修改和便于阅读理解。只有main函数中包含LED.H文件,这个头文件才会被调用,LED.C文件需要被添加进来。
在图示中配置为引脚配置为LED灯控制引脚,在这里GPIO口配置为输出。GPIO口可以灵活配置为输入和输出。输入模式一般为四种,一般为模拟输入,浮空输入,上拉输入和下拉输入模式,也有人认为输入为模拟输入,浮空输入,弱上拉输入,强上拉输入,弱下拉输入和强下拉输入。输出一般开漏输出,推挽输出,复用开漏输出,复用推挽输出。针对输出几种模式这么来理解,开漏输出和推挽输出的最大差别在于开漏输出无法输出高电平,一般需要IO口外部默认为上拉,才能输出高电平。其电平状态要不就是0.要不就是悬空状态(在没有配置外部上拉的情况下)。推挽输出可以输出高电平和低电平。
对于输出模式的开漏输出,推挽输出,复用开漏输出,复用推挽输出怎么理解复用这二字呢。一个GPIO口若是纯作为GPIO口,则无需考虑复用二字,若是GPIO口配置为串口,I2C,ADC,SPI等等,则是必须要考虑复用二字。
在对GPIO口进行配置时,我们可以在LED.C文件中对GPIO口进行初始化配置,如下例所示:
void LED_GPIO_Config(void)
{
//定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitTypeDef GPIO_InitStructure;
//开启GPIO口的外部时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//配置GPIO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ;
//配置为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//配置引脚速率50MHz*
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用库函数,初始化GPIOB;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//开启LED灯
GPIO_ResetBits(GPIOB, GPIO_Pin_13 );
}
在LED.H文件中,我们需要包含#include "stm32f10x.h"和void LED_GPIO_Config(void);即可。当然也可以写一些内联函数,主要是关于GPIO口高低电平的配置。在头文件中,切记只能出现include,DEFINE,VOID等函数,不能出现类似于U8,U32等函数。
随后我们在main函数中可以通过SET或RESET对GPIO口进行高低电平配置。当然也可以在LED.H头文件写一些内联函数,如1,0或者ON,OFF定义高低电平,然后在main函数中直接调用。