平时开发STM32的时候,经常涉及到初始化引脚,便编写了一个快速初始化引脚函数,可分别在F1、F4使用,建议放在sys.c中
STM32开发平台
//以下宏定义等内容放在sys.h
#define PA RCC_APB2Periph_GPIOA
#define PB RCC_APB2Periph_GPIOB
#define PC RCC_APB2Periph_GPIOC
#define PD RCC_APB2Periph_GPIOD
#define PE RCC_APB2Periph_GPIOE
#define PF RCC_APB2Periph_GPIOF
#define PG RCC_APB2Periph_GPIOG
#define PP 0x10
#define IPD 0x28
#define IPU 0x48
void FAST_INIT(u32 port,u8 pin,u8 mode);
//以下内容放在sys.c
void FAST_INIT(u32 port,u8 pin,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(port, ENABLE); //使能端口时钟
GPIO_InitStructure.GPIO_Pin = 1<<pin;
GPIO_InitStructure.GPIO_Mode = mode;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
switch(port)
{
case PA:GPIO_Init(GPIOA, &GPIO_InitStructure);break;
case PB:GPIO_Init(GPIOB, &GPIO_InitStructure);break;
case PC:GPIO_Init(GPIOC, &GPIO_InitStructure);break;
case PD:GPIO_Init(GPIOD, &GPIO_InitStructure);break;
case PE:GPIO_Init(GPIOE, &GPIO_InitStructure);break;
case PF:GPIO_Init(GPIOF, &GPIO_InitStructure);break;
case PG:GPIO_Init(GPIOG, &GPIO_InitStructure);break;
}
}
F1使用举例:
比如初始化LED:
#include "led.h"
void LED_Init(void)
{
FAST_INIT(PB,5,PP);
FAST_INIT(PE,5,PP);
PBout(5)=1;
PEout(5)=1;
}
比如初始化key:
#include "stm32f10x.h"
#include "key.h"
//按键初始化函数
void KEY_Init(void) //IO初始化
{
FAST_INIT(PE,3,IPU);
FAST_INIT(PE,4,IPU);
FAST_INIT(PA,0,IPD);
}
//以下宏定义等内容放在sys.h
#define PA RCC_AHB1Periph_GPIOA
#define PB RCC_AHB1Periph_GPIOB
#define PC RCC_AHB1Periph_GPIOC
#define PD RCC_AHB1Periph_GPIOD
#define PE RCC_AHB1Periph_GPIOE
#define PF RCC_AHB1Periph_GPIOF
#define PG RCC_AHB1Periph_GPIOG
#define PP 0x10
#define IPD 0x28
#define IPU 0x48
#define NP 0x00
void FAST_INIT(u32 port,u8 pin,u8 mode);
//以下内容放在sys.c
void FAST_INIT(u32 port,u8 pin,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(port, ENABLE);
GPIO_InitStructure.GPIO_Pin = 1<<pin;
switch(mode)
{
case PP:
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
}break;
case IPU:
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
}break;
case IPD:
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//上拉
}break;
case NP:
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
}break;
}
switch(port)
{
case PA:GPIO_Init(GPIOA, &GPIO_InitStructure);break;
case PB:GPIO_Init(GPIOB, &GPIO_InitStructure);break;
case PC:GPIO_Init(GPIOC, &GPIO_InitStructure);break;
case PD:GPIO_Init(GPIOD, &GPIO_InitStructure);break;
case PE:GPIO_Init(GPIOE, &GPIO_InitStructure);break;
case PF:GPIO_Init(GPIOF, &GPIO_InitStructure);break;
case PG:GPIO_Init(GPIOG, &GPIO_InitStructure);break;
}
}
F4使用举例:
比如初始化LED:
#include "led.h"
void LED_Init(void)
{
FAST_INIT(PB,5,PP);
FAST_INIT(PE,5,PP);
PBout(5)=1;
PEout(5)=1;
}
比如初始化key:
#include "stm32f10x.h"
#include "key.h"
//按键初始化函数
void KEY_Init(void) //IO初始化
{
FAST_INIT(PE,3,IPU);
FAST_INIT(PE,4,IPU);
FAST_INIT(PA,0,IPD);
}
虽然程序用case实现的手法并不高端,但是,,,好用啊!并且很大的一个优点是,初始化经过如此二次封装后,大大增加了程序的可移植性。就比如上述两个平台中,大家可以发现LED、KEY的初始化代码一致。