×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-09-03 发布时间:
|

前言

平时开发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<

 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<

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的初始化代码一致。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STC89C52的电子密码锁设计与仿真