STM32库函数之GPIO初始化代码分析

来源:互联网 发布:好看的耽美文知乎 编辑:程序博客网 时间:2024/06/10 04:10


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


 









  


 


0 0
原创粉丝点击