关于GPIO的设置

来源:互联网 发布:iphone7和8的区别知乎 编辑:程序博客网 时间:2024/05/29 07:00

总结关于GPIO的简单寄存器配置
大概有以下简单步骤
1.配置GPIO时钟
2.配置GPIO寄存器

/************************************************************************/
常用模式
/************************************************************************/

1.时钟使能 AHB1_ENR

2.然后配置GPIO寄存器

  1. MODER 模式寄存器
    输入 || 输出 || 复用 || 模拟
  2. OTPYER 输出类型寄存器
    推挽 || 开漏
  3. OSPEEDER 输出速度寄存器
    分为4个等级
  4. PUPDR 上下拉寄存器
    上拉 || 下拉 || 无 || 保持
  5. IDR 数据输入寄存器
    r
  6. ODR 数据输出寄存器
    r/w
  7. BSRR 置位复位寄存器
    IDR 和 ODR 寄存器的综合版
  8. LCKR 端口配置锁定寄存器
    没怎么用过
  9. AFRL 复用功能低寄存器
    低8位

  10. AFRH 复用功能高寄存器
    高8位

其实最主要的就是前几个寄存器 BSRR LCKR 几乎没怎么用过,IDR 和 ODR 完全可以替代BSRR
然后用不着锁存
很简单吧,只需要简单配置下就可以使用,看你到底是输出还是输入,选择相应的寄存器

/************************************************************************/
复用模式
/************************************************************************/
端口复用在HAL库中 hahaha完全不需要考虑直接点点点就行了,但是如果用标准库函数和寄存器
来操作这是一个很严重的问题,就是说,STM32有9组GPIO但是如果不执行端口复用的话每个IO口
就只能使用高低低平 根本实现不了你想要使用的功能
所以你逃避不了这个话题,好吧,其实关于F407端口复用已经实现简化了,没有103中的AFIO时钟
之类的概念
就我现在所知而言 关于GPIO端口复用只需要在GPIO里设置就行了,而且32407里面已经没了AFIO
这个概念,所以时钟也不需要设置了,
步骤如下
其实也就两个步骤
1.GPIO端口放弃高低电平设置,MODER寄存器改为复用
举个例子,比如是输入捕获,那么这个IO口就是输入模式,只需要把模式改为复用模式,其他同
输入设置,简单吧。
2.最后两个寄存器,AFRH 和 AFRL 复用功能高低寄存器,看你是那个引脚了,然后配置一下就行了

/************************************************************************/
位带操作
/************************************************************************/
关于位带操作,原子比较详细的介绍了这一点 所以 没必要去深究为什么是这样,学会用就行了
所谓存在即合理,下面是比较详细的代码,使用起来还是比较方便的,不用再去自己封装函数
直接用跟51一样
很重要,使用的前提是必须init过某个或者某几个IO口然后才能使用PAout(0)或者是PAin(1)
否则使用没反应的

//From ATK#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) #define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014#define GPIOB_ODR_Addr    (GPIOB_BASE+20) //0x40020414 #define GPIOC_ODR_Addr    (GPIOC_BASE+20) //0x40020814 #define GPIOD_ODR_Addr    (GPIOD_BASE+20) //0x40020C14 #define GPIOE_ODR_Addr    (GPIOE_BASE+20) //0x40021014 #define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414    #define GPIOG_ODR_Addr    (GPIOG_BASE+20) //0x40021814   #define GPIOH_ODR_Addr    (GPIOH_BASE+20) //0x40021C14    #define GPIOI_ODR_Addr    (GPIOI_BASE+20) //0x40022014     #define GPIOA_IDR_Addr    (GPIOA_BASE+16) //0x40020010 #define GPIOB_IDR_Addr    (GPIOB_BASE+16) //0x40020410 #define GPIOC_IDR_Addr    (GPIOC_BASE+16) //0x40020810 #define GPIOD_IDR_Addr    (GPIOD_BASE+16) //0x40020C10 #define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010 #define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410 #define GPIOG_IDR_Addr    (GPIOG_BASE+16) //0x40021810 #define GPIOH_IDR_Addr    (GPIOH_BASE+16) //0x40021C10 #define GPIOI_IDR_Addr    (GPIOI_BASE+16) //0x40022010 #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) #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n) #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n) #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)   #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  #define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  #define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)#define PHout(n)   BIT_ADDR(GPIOH_ODR_Addr,n)  #define PHin(n)    BIT_ADDR(GPIOH_IDR_Addr,n) #define PIout(n)   BIT_ADDR(GPIOI_ODR_Addr,n)  #define PIin(n)    BIT_ADDR(GPIOI_IDR_Addr,n)  
原创粉丝点击