STM32快速初始化引脚 一行代码完成引脚初始化

前言

平时开发STM32的时候,经常涉及到初始化引脚,便编写了一个快速初始化引脚函数,可分别在F1、F4使用,建议放在sys.c中

硬件准备

STM32开发平台

程序设计

对于STM32F1平台:

//以下宏定义等内容放在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);
}

对于STM32F4平台:

//以下宏定义等内容放在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的初始化代码一致。

你可能感兴趣的:(STM32技巧)