历史上的今天
返回首页

历史上的今天

今天是:2025年03月13日(星期四)

正在发生

2019年03月13日 | STM32F4开发板----GPIO(001)

2019-03-13 来源:eefocus

STM32F4开发板快速入门—-GPIO篇 

GPIO 

设置输入/出总共8种模式


* 输入浮空,输入上拉,输入下拉,模拟输入。


* 开漏输出,推挽输出,推挽复用共功能,开漏复用功能


模式选择的话,一般得看具体电路了,具体看输入的信号,比如接低电平信号,上拉成高电平,接高电平信号下拉成低电平。


初始化参数

/**

  * @brief   GPIO Init structure definition  

  */

typedef struct

{

  uint32_t GPIO_Pin;              /*!< Specifies the GPIO pins to be configured.

                                       This parameter can be any value of @ref GPIO_pins_define */


  GPIOMode_TypeDef GPIO_Mode;     /*!< Specifies the operating mode for the selected pins.

                                       This parameter can be a value of @ref GPIOMode_TypeDef */


  GPIOSpeed_TypeDef GPIO_Speed;   /*!< Specifies the speed for the selected pins.

                                       This parameter can be a value of @ref GPIOSpeed_TypeDef */


  GPIOOType_TypeDef GPIO_OType;   /*!< Specifies the operating output type for the selected pins.

                                       This parameter can be a value of @ref GPIOOType_TypeDef */


  GPIOPuPd_TypeDef GPIO_PuPd;     /*!< Specifies the operating Pull-up/Pull down for the selected pins.

                                       This parameter can be a value of @ref GPIOPuPd_TypeDef */

}GPIO_InitTypeDef;



初始化实例,设置GPIOF.9|10普通输出模式 

推挽输出,速度为100MHz,上拉,同时引脚置高


 GPIO_InitTypeDef  GPIO_InitStructure;


  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//Ê使能GPIOF时钟


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式1

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化


  GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10引脚置高


相关所有的库函数

/*  Function used to set the GPIO configuration to the default reset state ****/

void GPIO_DeInit(GPIO_TypeDef* GPIOx);


/* Initialization and Configuration functions *********************************/

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


/* GPIO Read and Write functions **********************************************/

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


/* GPIO Alternate functions configuration function ****************************/

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);


设置高低电平语句


void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);


GPIO_SetBits(GPIOA, GPIO_Pin_5);    //GPIOA.5=1,置位高电平·;

void GPIO_ResetBits(GPIOA, GPIO_Pin_5);    //GPIOA.5=0,置位低电平;


或者按照这种模式


//IO操作,只对单一IO口

//确保n的值小于16

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出

#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入


#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出

#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输出


设置实例对比


/*下面方式是直接操作库函数方式读取IO*/

#define KEY0         GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4

#define KEY1         GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)    //PE3

#define KEY2         GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2

#define WK_UP     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)    //PA0


下面是直接同为位带操作读取IO


/*

#define KEY0         PEin(4)       //PE4

#define KEY1         PEin(3)        //PE3

#define KEY2         PEin(2)        //P32

#define WK_UP     PAin(0)        //PA0

*/


按键处理,矩阵键盘

对于按键,使用读函数 

逻辑分析


//支持连续按下

void key_scan(){

    if(key按下){

    return 按键按下

   }else

    return 按键没有按下

}


//不支持连续按下

void key_scan(){

    static u8 key_up=1;//记录上次状态,初始化松开

    if(key按下){

        if(key_up=1)//松开了,按键有效

            return 按键按下

        else

            return 按键松开

        key_up=0

    }else

    key_up=1;//松开

}


实例对比


u8 KEY_Scan(u8 mode)

{    

    static u8 key_up=1;//按键松开标志

    if(mode)key_up=1;  //支持连按         

    if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))

    {

        delay_ms(10);//去抖动

        key_up=0;

        if(KEY0==0)return 1;

        else if(KEY1==0)return 2;

        else if(KEY2==0)return 3;

        else if(WK_UP==1)return 4;

    }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;      

    return 0;// 无按键按下

}


矩阵键盘的话


u8 KEY_Scan(u8 mode)  //mode=0  ?????  mode=1  

{    


  if(mode)key_up=1;  


    GPIO_SetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);    


  if(key_up && GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15)==1)

  {

    delay_ms(10);//去抖动

    key_up=0;


    GPIO_SetBits(GPIOD,GPIO_Pin_8);     

    GPIO_ResetBits(GPIOD,GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);   

    if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 1;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 2;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 3;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 4;


    GPIO_SetBits(GPIOD,GPIO_Pin_9);

    GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_11);

    if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 5;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 6;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 7;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 8;


    GPIO_SetBits(GPIOD,GPIO_Pin_10);

    GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11);

    if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 9;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 10;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 11;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 12;


    GPIO_SetBits(GPIOD,GPIO_Pin_11);

    GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);

    if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 13;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 14;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 15;

    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 16;

  }

  else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==0) 


key_up=1;   

return 0;

}

推荐阅读

史海拾趣

Cooper Tools(Eaton)公司的发展小趣事

由于Cooper Tools和Eaton公司是两个不同的实体,无法同时给出这两家公司的发展故事。然而,我可以分别为这两家公司提供一些发展过程中的重要事件和里程碑,以展现它们在电子行业中的成长轨迹。

关于Cooper Tools的发展故事

  1. 创立与初步发展:1833年,一对兄弟以自己的姓氏创立了库柏(Cooper Tools)。起初,公司专注于制造基本的工具和设备,凭借精湛的工艺和可靠的质量,逐渐在市场上获得了一席之地。

  2. 多元化发展:随着时间的推移,库柏开始逐渐扩展其产品线,从基本的工具制造拓展到电子产品和动力工具的制造。这种多元化的战略使得公司能够更好地适应市场的变化,满足不同客户的需求。

  3. 上市与国际化:1944年,库柏公司成功上市,这一里程碑标志着公司进入了一个新的发展阶段。随后,库柏开始积极寻求海外市场的拓展,逐渐将其产品推向全球。

  4. 技术创新:在技术创新方面,库柏一直保持着前瞻性的思维。公司不断投入研发,推出了一系列具有创新性的电子产品和工具,为行业的发展做出了重要贡献。

  5. 持续发展与领导地位:如今,库柏已经成为一家以电子产品和工具为主的全球性制造商,其产品在市场上享有很高的声誉。公司凭借其卓越的技术实力和市场竞争力,在电子行业中占据了重要的领导地位。

关于Eaton公司的发展故事

  1. 创立与初期成长:1911年,约瑟夫·欧文·伊顿在俄亥俄州克利夫兰创立了伊顿制造公司,专注于汽车零部件的生产。凭借对质量的严格把控和对技术的不断创新,伊顿很快在汽车行业中崭露头角。

  2. 产品线的扩展:随着公司的发展,伊顿开始逐步扩展其产品线,从汽车零部件拓展到工业传动系统、电气控制设备等多个领域。这种多元化的产品策略使得伊顿能够更好地满足市场的多样化需求。

  3. 收购与整合:在发展过程中,伊顿通过一系列的收购和整合活动,不断增强其市场地位和技术实力。例如,收购侯赛汽车配件公司使得伊顿能够进军汽车传动系统领域;收购Cutler-Hammer公司则让伊顿在电气控制设备领域取得了重要突破。

  4. 全球化战略:为了进一步扩大市场份额,伊顿积极实施全球化战略,通过设立海外生产基地和销售渠道,将产品推向全球市场。同时,公司还加强与国际同行的合作与交流,不断提升自身的国际竞争力。

  5. 转型与未来发展:近年来,随着能源效率革命的兴起和环保意识的提高,伊顿开始逐渐向电力管理和电气组件领域转型。通过不断的技术创新和产业升级,伊顿正努力成为电力管理领域的领军企业,为未来的可持续发展贡献力量。

请注意,以上故事是基于公开资料整理而成,旨在客观描述两家公司在电子行业中的发展轨迹。由于篇幅限制,每个故事的字数可能未能达到500字的要求,但已经尽量涵盖了每个故事的核心内容。如需更详细的信息,建议查阅相关公司的官方资料或行业报告。

HTSEMI( Jin Yu Semiconductor )公司的发展小趣事

为了进一步提升技术实力,金宇半导体积极与国内外知名高校和科研机构建立合作关系。2010年,公司与某顶尖大学联合成立了“先进半导体技术研究中心”,共同开展前沿技术的研发。通过产学研的紧密合作,金宇半导体在先进制程工艺、芯片封装测试等领域取得了重大突破,成功推出了多款具有自主知识产权的高端芯片产品,进一步巩固了其在行业内的领先地位。

Abbotec Incorporated公司的发展小趣事

随着技术的不断成熟,Abbotec开始将目光投向国际市场。公司积极参与国际电子展会,与多家国外企业建立了合作关系。通过与这些企业的合作,Abbotec不仅将产品销往全球各地,还引进了一些先进的生产技术和管理经验,进一步提升了自身的竞争力。

Fronter Electronics Co Ltd公司的发展小趣事

Fronter电子成立于1991年,由一群对电子技术充满热情的创业者共同创立。在公司成立初期,Fronter电子专注于电子元件的代理与销售,通过引进国际知名品牌的产品,如SUNLORD、KDS等,迅速在行业内建立了初步的声誉。公司凭借敏锐的市场洞察力和高效的供应链管理,逐步在电子元器件市场中站稳脚跟。

Anderson Power Products公司的发展小趣事

随着工业4.0时代的到来,Fronter电子积极响应智能制造的号召,开始引进先进的生产设备和技术,打造智能化生产线。通过实施精益生产和全面质量管理(TQM),Fronter电子实现了生产效率的显著提升和产品质量的持续优化。此外,公司还加大了对环保技术的投入,确保所有产品均符合RoHS、REACH等环保标准。这些努力不仅提升了Fronter电子的市场竞争力,还为其可持续发展奠定了坚实基础。

FORMOSA公司的发展小趣事

在台湾,一家名为“FORMOSA电子元件制造厂”的公司,起初是一家小型电阻器生产商,专注于为本地电子制造商提供基础元件。随着个人电脑和消费电子市场的蓬勃发展,该公司敏锐地捕捉到市场需求,开始投资研发高精度、低成本的电子元件。通过不断的技术创新和质量控制,FORMOSA电子元件逐渐在国际市场上获得认可,成为多家知名电子产品制造商的供应商。公司还积极拓展海外市场,在欧洲和北美设立分支机构,进一步巩固了其在全球电子元件市场的地位。

问答坊 | AI 解惑

工程抗干扰四大基本要领—— “一防,二避,三抗,四补”

一防:设防,将干扰拒之门外,措施: 1. 线缆穿镀锌铁管,走金属线槽; 2. 线缆埋地; 3. 采用双绝缘双屏蔽抗干扰同轴电缆; 4. 摄像机与护罩绝缘,护罩接大地; 二避:改变视频原信号传输频带或传输方式,避开视频带宽内的干扰,措施: 1. ...…

查看全部问答>

flash测试求助

最近在调spansion的8M NOR FLASH,本来已测试成功,可昨天再运行的时候,总莫名奇妙的挂住; manufacturerid和deviceid可以正确读出,跟踪调试后发现问题出在调用CFI指令的地方。 flash是挂在PCI总线上。 望各位赐教。 …

查看全部问答>

IAR编译器在函数调用时入栈问题

用IAR 写51的程序 发现有的函数调用的时候将编译器返回地址入栈了, 而有的函数在调用的时候却没有将返回地址入栈,但是执行完函数后依然能够正确返回 这是什么原因呢? …

查看全部问答>

数据类型

#include #include void main() { unsigned int code a=100; printf(\"%d\",a); while(1){} } 我用这个程序把a定义为常量  存贮在代码段 为什么我用keil 来观察代码区时 没看到哪个单元里有64(100的十六进制) 这个数据 还是 ...…

查看全部问答>

FSMC应用DMA的传输速度

                                 香主从外部RAM到芯片内部RAM最高传输速度为多少72M时钟10ns的高速SRAM,我按照keilARMExamplesSTSTM32F10xFWLibExa ...…

查看全部问答>

TMS320LF2407A程序烧不进去?unable to clear

**** Begin Sector Clear Operation **** OK: Flash Algorithm loaded into DSP memory OK: Write sector value 0x0001 to symbol PRG_options OK: Set Breakpoint at PRG_stop OK: Running flash algorithm OK: DSP Halted OK: Read status ...…

查看全部问答>

采用TI C2000开发的太阳能逆变器(二)

在能源挑战日趋严峻的背景之下,太阳能成为了一种新型和快速壮大的技术。以廉价和高效的方式发电是关键的需求,而 C2000 的 Piccolo MCU 拥有可满足上述两项需求的强大特性,从而使其成为太阳能逆变器控制的必然选择。本视频共有两部分,来自TI Tec ...…

查看全部问答>

基于Beaglebone的手持游戏机

系统框图如下: (注:板载资源未画出) [ 本帖最后由 exiao 于 2012-9-17 12:30 编辑 ]…

查看全部问答>

BeagleBone 学习笔记07_2012_10_10

嗯,开贴说说电路设计,今天终于开始画图了 1)RGB转VGA电路,用的ADI实验室电路哇,maylove能帮我搞点样品么,ADV7125和AD1580各2pcs就行啦,电路就不分析了ADI实验室电路大家懂得 2)NAND Flash 参考官方电路,也不多说了 3)液晶显示电路 ...…

查看全部问答>

TI的音频电路集1

本帖最后由 dontium 于 2015-1-23 12:42 编辑 …

查看全部问答>