历史上的今天

今天是:2024年09月03日(星期二)

正在发生

2019年09月03日 | STM32快速初始化引脚 一行代码完成引脚初始化

发布者:静默思考 来源: eefocus关键字: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< 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的初始化代码一致。

关键字:STM32  快速初始化  引脚初始化 引用地址:STM32快速初始化引脚 一行代码完成引脚初始化

上一篇:STM32F103_GPIO输入输出快速初始化
下一篇:STM32库函数之GPIO初始化代码分析

推荐阅读

   上周,第二大芯片代工厂 GlobalFoundries 宣布终止 7 纳米制造工艺研发,专注于现有的 14 纳米/12 纳米工艺(14LPP/12LP)。CTO Gary Patton 坚称该公司做出这一决定不是因为技术问题,而是在谨慎考虑了 7 纳米工艺的商业机会和财务问题后做出的。这一决定促使 AMD 将所有 7 纳米 CPU 和 GPU 订单全部交给台积电。Gary Patton...
(图片来源:西门子PLM Software)据外媒报道,西门子PLM Software发布了最新版本的Simcenter Madymo软件,该软件在速度和精度方面显著提升。Simcenter Madymo用于乘员安全建模,可以使用Simcenter Active Human软件模拟汽车碰撞对人体的影响。与旧版本相比,最新版本求解器运行时间减少了28%。Simcenter Madymo中的典型碰撞分析大约需要15-20分钟...
我们知道,人工智能的目标之一就是让模拟人类的视觉、听觉、触觉等感知能力,尝试去看、听、读,理解图像、文字、语音等,在此基础上,再让人工智能具有思维能力、行动能力,最终成为跟人类一样的存在。 现在,人工智能机器人的感知能力已经实现了明显的进展。围绕,机器人可以实现一系列像图像识别、目标检测和文字识别等功能得到广泛应用;围绕自然语...
STM8的IO口控制,说好听点是灵活多变,可以各种定制,可是用起来那真是烦,要定义的好多!void io_init() { PA_DDR |= (1<<3); PA_CR1 |= (1<<3); PA_CR2 &= ~(1<<3);//PA3设置为推挽输出 PD_DDR |= (1<<5); PD_CR1 |= (1<<5); PD_CR2 &= ~(1<<5); //PD5设置为推挽输出 PD_DDR &= ~(1<<6); //PD6设置为悬浮输入 ...

史海拾趣

问答坊 | AI 解惑

msp430f21x2系列常用寄存器汇总

自己总结,特别适合打印出来查阅哦。…

查看全部问答∨

发一个电风扇控制电路仿真

本人在做课程设计时做的电风扇控制电路Proteus仿真。其中电风扇电机绕组用灯泡代替。…

查看全部问答∨

PDA 死机问题

PDA加上WIFI模块后,就有死机的情况,但几率比较小;去掉WIFI模块后PDA不会死机;请问那位道友遇到过同样的问题?…

查看全部问答∨

BINFS 是否只有EBOOT 的板子才能实现?

现在想做个MULTI-bin  一步一步的来,先来实现BINFS,但是查来一些资料,看了ms的帮助文档,还是一头雾水。 现在我的板子上是自己写的usbboot。看很多资料都是说什么EBOOT,问下,有是不是要实现BINFS必须要eboot? 有没有哪为大虾不是在 ...…

查看全部问答∨

申请 EZ430-RF2500开发板

使用RF2500开发板,完成QQ消息提醒器的设计 [ 本帖最后由 tagetage 于 2010-10-14 10:54 编辑 ]…

查看全部问答∨

STM32101CB仿真,程序目标代码大于64K时,不能下载

使用J-LINK,程序目标代码大于64K时,不能下载 为什么?…

查看全部问答∨

什么软件可以烧写2801的flash??????急求~~~

可以烧写2812 支持类型可以参考CCS\\\\plugins\\\\Flash28xx\\\\Algorithms\\\\的文件…

查看全部问答∨

msp430烧熔丝有几种方法

使用430也有一段时间了,但是关于430的烧熔丝、BSL功能和从JTAG口都flash内容一直没时间接触过,请问大家几个问题: 1. msp430烧熔丝有几种方法?要使用那些对应的工具? 2. 在熔丝不坏的情况下,有几种读flash的方法?BSL功能怎么玩? 3. 现在4 ...…

查看全部问答∨

GPIOPinWrite函数问题

代码如下   voidGPIOPinWrite(unsigned long ulPort, unsigned char ucPins, unsigned char ucVal){    //    // Check the arguments.    //    ASSERT(GPIOBaseValid(ulPort ...…

查看全部问答∨

【晒心得】用CC2541SensorTag 测测温湿度

其实包裹打开那天我就装好了,但没装电池,今天有点时间打开把电池装上,又扫了下二维码,装了个TI的手机端软件. 我的经验是电池装上复位一下,就别再动复位啦. 以下是图片 可见温度24湿度56…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved