历史上的今天

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

正在发生

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

发布者:JoyfulExplorer 来源: eefocus关键字:STM32  库函数  GPIO  初始化 手机看文章 扫描二维码
随时随地手机看文章

          首先我们先看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    复用开漏


关键字:STM32  库函数  GPIO  初始化 引用地址:STM32库函数之GPIO初始化代码分析

上一篇:STM32快速初始化引脚 一行代码完成引脚初始化
下一篇:STM32中的GPIO结构

推荐阅读

联想Yoga C630 WOS(Windows on Snapdragon)是首款搭载全新高通骁龙850移动计算平台的始终在线、始终连接的PC。这款二合一笔记本融合了Windows 10操作系统、增强的性能、精巧轻薄的设计、超过25小时的电池续航以及集成的千兆级LTE连接,这也使它成为一款可以满足极致移动生产力与娱乐的设备。 Yoga C630 WOS旨在满足用户对生产力与娱乐的全部需求...
2019中国战略性新兴产业领军企业100强榜单在济南正式发布。华为公司以7212亿元登顶第一!! 中国移动通信集团有限公司与北京京东世纪贸易有限公司分列二、三位,战新总收入分别为5364亿元和4620亿元。 榜单显示,新一代信息技术、新材料成为入围主力产业,两个领域分别有30家、23家企业入围。中国企业联合会、中国企业家协会发布2019中国战略性新兴产业领...
Qualcomm Technologies, Inc.在柏林国际消费电子展(IFA)上宣布推出公司最先进、最高效的计算平台——Qualcomm®骁龙™8cx第二代5G计算平台。用户将能够享受到卓越性能、多天电池续航、5G连接、企业级安全性能、AI加速以及先进的拍摄和音频技术带来的出色体验。上述特性将为数字化转型,以及远程办公和远程学习所需的移动性提供支持。骁龙8cx第二代5G计...
9月1日,深圳市坪山区委书记杨军率队调研深圳荣耀智能机器有限公司、中芯国际等辖区重点企业,参观企业车间生产线、听取企业相关负责人情况介绍。在荣耀智能制造产业园,杨军指出,坪山区将按照市委市政府部署要求,以最好的营商环境、最优质的企业服务、最快的反应速度,全力保障荣耀终端项目在坪山发展壮大。希望荣耀加大自主创新力度,推动关键核心技术...

史海拾趣

问答坊 | AI 解惑

求助

我是一个新手,请教一下Quartus.II.v6.0怎么安装?…

查看全部问答∨

求助

求助关于有源滤波的电路图,截止频率在10M以上的.多谢!急需…

查看全部问答∨

散热风扇的电路原理图

来源:ouravr qilin3 花了80块左右,从一个产品中抄出来的电路。效果很好。贴上来大家一起讨论下原理。 这个电路正常使用完全没问题,随着温度的升高,风扇转速越快,加在风扇上的电压越大,风扇满速时压降只有0.1-0.2V左右。 难以置信的小。 ...…

查看全部问答∨

诸如dm9000网卡芯片,怎么设置寄存器可以收到自己发送的数据包?

曾今也看过网络编程,发现只要往127.0.0.1发送,就能够本机收到,或者直接发数据包给自己的IP地址,也是能够接收。我自己做了一块网卡,然后自己也开发了简单的TCP/IP协议栈,数据包的收发已经做完了,两台网络上的机器对法都能收到。二现在我想给 ...…

查看全部问答∨

‘*’和‘#’有对应的虚拟键码么?

在做输入法,windows CE5.0环境下,4X5键盘输入,请教‘*’和‘#’有对应的虚拟键码么?因为输入法要按‘*’来切换输入法。…

查看全部问答∨

wince 驱动开发教程!!!

谁有这方面的教程,,网上好像太少了,就一个幻灯片教程,在n多个网站上传,没其它的了吗?…

查看全部问答∨

stm8问题

请教一下  我在使用stm8s103k3芯片的时候定义了一个数组后提示:   #error clnk Debug adiogram.lkf:1 segment .bss size overflow (1)  我看了一下内存我才用300字节 ...…

查看全部问答∨

大家一起来研究最新的6854驱动库吧!

最近上luminary的官方网站才发现更新了最新的驱动库!驱动库里面的资源相当之丰富!但是还是有一些东西不知道是做什么用的!感慨TI的技术支持太强大了!我觉得驱动库里面的例程都是非常有价值的例程值得好好去研究!   除此之外,驱动库 ...…

查看全部问答∨

全国大学生电子竞赛 NEC单片机UPD78F1166 用户指南

本帖最后由 paulhyde 于 2014-9-15 09:13 编辑 很多人说找不到瑞萨(原NEC)的用户指南,共966页,5.40MB 包含以下单片机78K0R/KG316-bit Single-Chip MicrocontrollersμPD78F1162, 78F1162A, 78F1162A(A)μPD78F1163, 78F1163A, 78F1163A(A)μP ...…

查看全部问答∨

提问+ 滤波器用途

本帖最后由 dontium 于 2015-1-23 11:43 编辑 有源滤波器和无源滤波器相比有什么优点呢?两者分别用在什么地方?有什么限制吗(比如说某个电路可能用有源的滤波会好点)? …

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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