历史上的今天
返回首页

历史上的今天

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

正在发生

2019年09月03日 | STM32库函数之GPIO初始化代码分析

2019-09-03 来源:eefocus

          首先我们先看GPIO的寄存器有哪些


         1. 端口低配置寄存器    复位值:0x4444 4444  


         2.端口高配置寄存器    复位值:0x4444 4444


         3.端口输入数据寄存器    复位值:0x0000 XXXX


         4.端口输出数据寄存器      复位值: 0x0000 0000


         5.端口位设置/清除寄存器     复位值: 0x0000 0000


         6:端口位清除寄存器        复位值:0x0000 0000   


         7:端口配置锁定寄存器     复位值: 0x0000 0000


       偏移地址从0x00一次加四到0x18


        因为是32位寄存器,四个字节,


       共七个寄存器


    typedef struct

{

  __IO uint32_t CRL;

  __IO uint32_t CRH;

  __IO uint32_t IDR;

  __IO uint32_t ODR;

  __IO uint32_t BSRR;

  __IO uint32_t BRR;

  __IO uint32_t LCKR;

} GPIO_TypeDef;


#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)


#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)


#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)


#define PERIPH_BASE           ((uint32_t)0x40000000)




    通过这样的一段代码就可以将结构体中的七个变量分别指向GPIOC对应的7个寄存器的地址


      把GPIOC中的C改为ABCDEFG,就是对应GPIO的端口




再看看GPIO的初始化的代码


 GPIO_InitTypeDef  GPIO_InitStructure;

            

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);


  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;


  GPIO_Init(GPIOC,&GPIO_InitStructure);




GPIO初始化函数原型是


    void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)


 GPIOx用GPIOA,B,C等替代


主要的是GPIO_InitTypeDef这个结构体


typedef struct

{

  uint16_t GPIO_Pin;         

                                     


  GPIOSpeed_TypeDef GPIO_Speed;  

                                     


  GPIOMode_TypeDef GPIO_Mode;  

                                    

}GPIO_InitTypeDef;




#define GPIO_Pin_0                 ((uint16_t)0x0001)  

#define GPIO_Pin_1                 ((uint16_t)0x0002) 

#define GPIO_Pin_2                 ((uint16_t)0x0004)

#define GPIO_Pin_3                 ((uint16_t)0x0008)  

#define GPIO_Pin_4                 ((uint16_t)0x0010)  

#define GPIO_Pin_5                 ((uint16_t)0x0020)  

#define GPIO_Pin_6                 ((uint16_t)0x0040)

#define GPIO_Pin_7                 ((uint16_t)0x0080)  

#define GPIO_Pin_8                 ((uint16_t)0x0100)  

#define GPIO_Pin_9                 ((uint16_t)0x0200)

#define GPIO_Pin_10                ((uint16_t)0x0400)  

#define GPIO_Pin_11                ((uint16_t)0x0800)  

#define GPIO_Pin_12                ((uint16_t)0x1000)  

#define GPIO_Pin_13                ((uint16_t)0x2000)  

#define GPIO_Pin_14                ((uint16_t)0x4000)  

#define GPIO_Pin_15                ((uint16_t)0x8000)



typedef enum

  GPIO_Speed_10MHz = 1,

  GPIO_Speed_2MHz, 

  GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;


这里说明一下枚举当第一个参数设置后,后面的参数的值会依次递增


typedef enum

{ GPIO_Mode_AIN = 0x0,

  GPIO_Mode_IN_FLOATING = 0x04,

  GPIO_Mode_IPD = 0x28,

  GPIO_Mode_IPU = 0x48,

  GPIO_Mode_Out_OD = 0x14,

  GPIO_Mode_Out_PP = 0x10,

  GPIO_Mode_AF_OD = 0x1C,

  GPIO_Mode_AF_PP = 0x18

}GPIOMode_TypeDef;




   不难看出,这些程序最终的目标是给参数一个数值,而参数需要得到这个数值后,通过判断这个参数,把这个数值写到对应的寄存器中,这也就是


GPIO_Init(GPIOC,&GPIO_InitStructure);所做的工作,当然这些数值需要进行一些判断,转化的过程,这个具体的过程在


GPIO初始化函数中具体实现。


  总结一下初始代码的实现需要的参数是端口,速率,模式;


   端口  void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)中的GPIO_TypeDef *  GPIOX以及结构体


GPIO_InitStruct中的GPIO_Pin_x,x,0,1,2...


   速率  结构体GPIO_InitStructure中的  GPIO_Speed_10MHz GPIO_Speed_2MHz  GPIO_Speed_50MHz;


   模式  结构体GPIO_InitStructure中的 模拟输入模式 浮空输入模式   上拉/下拉输入模式 

       通用推挽输出模式  通用开漏输出模式 复用功能推挽输出模式 复用功能开漏输出模式 即


GPIO_Mode_AIN = 0x0, 模拟输入

  GPIO_Mode_IN_FLOATING = 0x04,  浮空输入

  GPIO_Mode_IPD = 0x28,下拉

  GPIO_Mode_IPU = 0x48,上拉

  GPIO_Mode_Out_OD = 0x14, 推挽输出

  GPIO_Mode_Out_PP = 0x10,  开漏输出

  GPIO_Mode_AF_OD = 0x1C,   复用推挽

  GPIO_Mode_AF_PP = 0x18    复用开漏


推荐阅读

史海拾趣

Alps Alpine Co Ltd公司的发展小趣事

Alps Alpine Co., Ltd.是一家总部位于日本的跨国电子制造公司,专注于设计和制造汽车电子、消费电子和工业电子产品。以下是关于Alps Alpine公司发展的五个相关故事:

  1. 公司合并:Alps Electric Co., Ltd.和Alpine Electronics, Inc.于2019年进行了合并,正式成立了Alps Alpine Co., Ltd. 这一合并为两家公司带来了更强大的整合资源和技术实力,使得Alps Alpine能够在全球范围内提供更多样化的电子解决方案。

  2. 汽车电子领域的发展:Alps Alpine在汽车电子领域拥有丰富的经验和技术积累。公司致力于开发汽车内部电子系统,包括车载娱乐系统、导航系统、车载通信系统、驾驶辅助系统等。随着汽车智能化和互联网化的发展,Alps Alpine不断推出创新产品,满足汽车制造商和消费者对智能驾驶体验的需求。

  3. 消费电子产品的多样化:除了汽车电子,Alps Alpine还在消费电子领域拥有广泛的产品线。公司的产品涵盖了手机、平板电脑、摄像机、音响设备等多个终端设备,并不断推出新品,以满足消费者对功能性和设计性的需求。

  4. 工业电子市场的拓展:Alps Alpine在工业电子领域也取得了长足的发展。公司的产品被广泛应用于工业自动化、机器人技术、医疗设备、能源管理等领域,为各行各业提供高性能、可靠的电子解决方案。

  5. 技术创新与研发投入:作为一家技术驱动的企业,Alps Alpine不断加大对研发的投入,致力于技术创新和产品优化。公司拥有强大的研发团队和先进的研发设施,在各个领域持续推动技术进步,提升产品竞争力。

以上是关于Alps Alpine Co., Ltd.发展的五个相关故事,这些故事展示了公司在合并整合、汽车电子、消费电子、工业电子和技术创新方面的发展历程,以及其在电子行业中的重要地位和影响力。

Ho Chien Electronics Group Inc公司的发展小趣事

Ho Chien Electronics Group Inc公司发展故事

故事一:创立与全球化布局

Ho Chien Electronics Group Inc.(以下简称“Ho Chien”)创立于1974年,其全球总部位于美国波士顿。自成立以来,Ho Chien迅速在全球范围内扩展其业务,先后在中国、新加坡、德国、巴西、加拿大和墨西哥等地设立了超过40个分部。这一布局不仅加强了公司的市场渗透力,还为其提供了丰富的资源支持,助力其在电子行业细分市场中稳步前行。Ho Chien特别专注于互连与机电产品领域,通过为原始设备制造商和合约制造商提供高质量的产品和服务,逐步在行业内建立了良好的声誉。

故事二:亚太市场的拓展

2012年12月,Ho Chien正式启动其亚太业务,并将亚太区总部设在香港。为了更好地服务亚太地区的客户,Ho Chien不仅设立了销售部,还构建了区域配送中心和增值服务中心。经过数年的努力,Ho Chien亚太区已开设24个分部和3处仓库,极大地提升了其在该地区的运营效率和服务质量。这一举措不仅加深了Ho Chien在亚太市场的影响力,还为其未来的全球扩张奠定了坚实的基础。

故事三:产品线的丰富与拓展

Ho Chien致力于为电子行业各细分市场的客户提供全面支持,其产品线涵盖了25个不同元器件类别。主要分销产品包括互连器件、继电器、风扇、开关、散热解决方案、套管和线束产品、晶体与振荡器、紧固件与五金件以及传感器等。随着市场的不断变化和技术的飞速发展,Ho Chien不断调整和优化其产品线,以满足客户日益增长的需求。这一策略不仅帮助Ho Chien保持了其在行业内的竞争力,还为其带来了稳定的收入来源。

故事四:创新与研发

作为电子行业的领军企业之一,Ho Chien深知创新对于公司发展的重要性。因此,公司不断加大在研发方面的投入,致力于新技术、新产品的开发和应用。通过引进先进的研发设备和优秀人才,Ho Chien在多个领域取得了重大突破,并成功推出了一系列具有自主知识产权的产品。这些创新成果不仅提升了Ho Chien的品牌价值,还为其在全球市场上的拓展提供了有力支持。

故事五:人才培养与企业文化

在快速发展的过程中,Ho Chien深刻认识到人才对于公司持续发展的关键作用。因此,公司始终坚持“以员工为中心”的管理思想,努力为员工创造宽松的工作氛围和良好的发展机会。Ho Chien不仅提供优厚的福利待遇和丰富的培训资源,还鼓励员工积极发挥自己的才华和潜能。在这种企业文化的影响下,Ho Chien汇聚了一大批优秀的专业人才和管理精英,为公司的快速发展提供了强有力的智力支持。同时,这种积极向上的企业文化也进一步提升了Ho Chien的品牌形象和社会影响力。

乐鑫(espressif)公司的发展小趣事

面对物联网行业的快速发展和变化,乐鑫科技始终保持前瞻性的战略眼光。公司积极布局未来市场,加大在人工智能、云计算等领域的研发投入,以满足客户对更智能化、更高效的物联网应用的需求。同时,乐鑫科技还注重培养和引进优秀人才,为公司未来的发展提供有力的人才保障。

请注意,以上内容仅为概述性质的故事框架,具体细节和数据可能需要根据实际情况进行调整和补充。

Andigilog公司的发展小趣事

品质是Akros公司的生命线。公司始终坚持严格的质量控制体系,从原材料采购到产品出厂的每一个环节都进行严格把关。为了确保产品的品质稳定可靠,Akros还引进了先进的生产设备和检测仪器。同时,公司还注重持续改进,通过不断优化生产流程和提升员工技能水平,不断提高产品的品质和效率。

ETL semiconductor公司的发展小趣事

英特尔(Intel)的成立与发展与微处理器的发明密不可分。在20世纪70年代初,英特尔的工程师们开始研发一种能够将计算机的中央处理器(CPU)集成到单一芯片上的技术。经过数年的努力,他们成功推出了世界上第一款微处理器——Intel 4004。这一创新不仅改变了计算机行业,也为英特尔的崛起奠定了坚实基础。

DCCOM [ DC COMPONENTS ]公司的发展小趣事

为了进一步扩大市场份额,DCCOM公司积极寻求与国内外知名企业的合作。通过与这些企业的合作,DCCOM不仅获得了更多的客户资源,还学习到了先进的管理经验和技术知识。这种合作模式使得DCCOM在激烈的市场竞争中保持了强劲的增长势头。

问答坊 | AI 解惑

用VisualAudio设计高效实时音频系统的设计

VisualAudio设计和开发环境是设计和开发音频系统的新软件,它的实时架构特别适合音频产品的开发.本文简短介绍VisualAudio,然后描述它的构架,音频模块和在音频产品上的应用…

查看全部问答>

深入理解SD卡原理和其内部结构总结

在其他地方看到个深入理解SD卡原理和其内部结构总结,很不错,拿来与大家分享下!…

查看全部问答>

万年历

  基于51单片机设计的万年历,含源程序…

查看全部问答>

PXA270核心板方案:

PXA270核心板方案:   CPU:PXA270   SDRAM:128M   FLASH:32M   接口:USB、SDCARD、SERIAL等   LCD+TOUCH:3.5‘   支持WIFI 方案可提供:SCH + PCB + BOOM + WINCE ...…

查看全部问答>

CoCreateInstance返回:没有注册类别(wince6.0 emulator sdk 中使用msxml)

大家好!我想在Wince的模拟器上使用msxml发送xml文件,代码如下: MSXML2::IXMLHTTPRequest* pIXMLHTTPRequest = NULL; CoInitialize(NULL);    HRESULT hr; hr = CoCreateInstance (__uuidof(MSXML2::XMLHTTPRequest),  NU ...…

查看全部问答>

用仿真器下载程序后,写保护了,现在下载不下去了?

用仿真器下载程序后,写保护了,现在下载不下去了. 请问有解决的办法吗? 还是一定要换一块单片机了? 刚刚学,谢谢! …

查看全部问答>

有在arm+linux上做过摄像头的吗

我想问下,驱动什么的都弄好了,板上只有一个usb口,我外接了一个四口的USB HUB,接四个摄像头 再在dev文件夹中新建设备文件video0,video1,video2,video3,这四个摄像头能否同时使用啊 我现在只能做到四个来回的切换,想实现一个窗口中同时显示四 ...…

查看全部问答>

【急问】拉丁文(西班牙语)是否支持7bit编码方式?

请问:拉丁文(西班牙语)是否支持7bit编码方式? 在给客户做一个短信终端,客户要求已7bit编码方式实现拉丁文的短信内容 多谢!…

查看全部问答>

徐家骏:从应届毕业生到年薪千万

徐家骏:从应届毕业生到年薪千万2009-03-02 14:48从一个应届毕业生,到年薪千万的华为副总裁,再到离开华为转战百度,徐家骏(博客)的十年从业经历和经验对于今年的应届毕业生来说绝对可资借 鉴,我们从中也可以一窥华为公司的运作过程和徐的职 ...…

查看全部问答>

手机扩展坞

数码产品给我们带来了便捷的生活,但是需要拷贝资料的时候,人们总是会头疼,因为各种的数据线会让人们心烦意乱。这是安卓智能手机或者平板电脑用到的外接读卡器,可以用来连接键盘、鼠标、SD卡、U盘等等,读取里面的数据,包括外置硬盘中的信息, ...…

查看全部问答>