历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-09-03 来源:eefocus

前言

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

推荐阅读

史海拾趣

Concord Semiconductor Corp公司的发展小趣事

随着业务规模的不断扩大,Concord Semiconductor Corp开始将市场拓展作为重要的发展战略。公司通过参加国际电子展会、举办技术研讨会等方式,积极宣传自己的产品和技术,提升品牌知名度。同时,公司还针对不同地区的市场需求,推出定制化产品和服务,进一步巩固了市场地位。

Bkc Semiconductors Inc公司的发展小趣事

随着技术的成熟和产品的不断完善,Bkc开始积极拓展市场。公司不仅加强了与国内外知名电子厂商的合作,还积极参与国际半导体展会和技术交流,不断提升品牌知名度。同时,Bkc还通过战略投资和并购等方式,进一步扩大了自身的业务规模和市场份额。

CYANLITE公司的发展小趣事

CYANLITE公司一直秉持着绿色环保的理念,致力于推广节能减排的照明产品。他们不仅在产品设计上注重节能和环保,还积极参与各种环保公益活动,向公众普及LED照明的优势。这种积极的环保态度使得CYANLITE公司在市场上树立了良好的形象,也吸引了越来越多的消费者选择他们的产品。同时,公司还积极与政府部门合作,推动LED照明在公共领域的普及和应用。

ABCircuits公司的发展小趣事

随着全球环保意识的提高,绿色电子产品逐渐成为市场的新宠。ABCircuits公司敏锐地捕捉到这一趋势,开始将绿色环保理念融入产品研发和生产中。公司积极采用环保材料和工艺,减少生产过程中的污染排放。同时,ABCircuits还推出了多款节能高效的电子产品,深受消费者喜爱。这种绿色环保的发展理念不仅为公司赢得了良好的社会声誉,也为公司的可持续发展奠定了坚实基础。

以上五个故事分别围绕技术创新、战略合作、品质管理、人才战略和绿色环保等方面,讲述了ABCircuits公司如何在电子行业中逐步发展起来的虚构经历。这些故事旨在展示一个成功企业在发展过程中可能面临的挑战和机遇,以及如何通过不断创新和努力来实现持续发展。请注意,这些故事纯属虚构,不代表任何真实公司的经历。

CAMBION公司的发展小趣事

在技术创新的基础上,CAMBION公司积极拓展市场。公司通过与各大电子设备制造商建立合作关系,将其产品广泛应用于智能手机、平板电脑、笔记本电脑等领域。同时,CAMBION还注重品牌建设,通过参加国际电子展、发布技术白皮书等方式提升品牌知名度和影响力。这些努力使得CAMBION的产品在市场上获得了良好的口碑和认可。

ET Enterprises Ltd公司的发展小趣事

随着技术的不断进步和市场需求的增长,ET Enterprises Ltd公司开始推出多种类型的光电倍增管产品,包括普通可见光型、紫外灵敏型、日盲型等。同时,公司也积极拓展国际市场,与全球各地的客户建立合作关系,进一步巩固了其在光电倍增管领域的领先地位。

问答坊 | AI 解惑

坛子里有没有朋友用过xilinx xupv2p开发板的??想请教一下!

如题,谢谢!希望我能从用过的朋友那里咨询一下关于这块开发板的问题。谢谢了!…

查看全部问答>

PIO0_1中断进不去?

下面是程序: #include \"..\\config.h\" #define LED         (1ul << 2)#define LED_INIT()  GPIO2DIR  |=  LED          &nb ...…

查看全部问答>

如何实现嵌入式系统的网上在线更新

最近要做一个基于Context-M3的无操作系统的项目,其中有一部分功能是要实现软件的在线更新。 我第一次做这方面的功能,没有什么经验,特来请教。 现在通信协议方面已经没有问题了,现在所面对的问题是: 如何将2进制文件写到Flash相应的地址上。 ...…

查看全部问答>

程序集“System.Web.Services"出错!

在做PDA应用程序时碰到: D:\\WebService2\\WebService2\\TestWebService\\Form1.cs(26,13): 错误 CS0012: 类型“System.Web.Services.WebService”在未被引用的程序集中定义。必须添加对程序集“System.Web.Services, Version=2.0.0.0, Culture=n ...…

查看全部问答>

EVC 对话框 焦点问题

BOOL CScanDlg::OnInitDialog() {CDialog::OnInitDialog();         GetDlgItem(IDC_EDIT1)->SetFocus(); } 请问代码有问题吗? 为什么 edit1 就是在运行后得不到焦点呢? 请问有什么办法才能使他得到焦点。…

查看全部问答>

如何查看PIC烧进去的程序的大小啊?

请问如何查看少进去的程序的大小,和运行时RAM的使用情况…

查看全部问答>

急救!!!!!!用VHDL语言编写出租车计费器程序

用VHDL语言编写出租车计费器程序 要求:按行驶里程收费。起步价8.00元(含3公里),5公里以内按1.80元/公里,5公里以后按2.20元/公里,5公里以内每0.5公里加价0.9元,5公里以后每0.5公里加价1.1元。车停止每3分钟算0.5公里。 希望高手帮忙!!! ...…

查看全部问答>

RAM不够用了,想换个大点的片子,但是找不到可直接替代的!

原来是用的 62256 28-DIP 本以为可以直接用62512和628128替换了,结果发现管脚不同:(     最好是128K x 8 28-DIP Static RAM管脚要和62256 的一样哦。附上62256的管脚图    找了很久了,有了解的朋友麻烦给说一下 那个型 ...…

查看全部问答>

我的DIY应急灯效果展示

    $(\'swf_dTD\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XM ...…

查看全部问答>