关于GPIO的设置
来源:互联网 发布:iphone7和8的区别知乎 编辑:程序博客网 时间:2024/05/29 07:00
总结关于GPIO的简单寄存器配置
大概有以下简单步骤
1.配置GPIO时钟
2.配置GPIO寄存器
/************************************************************************/
常用模式
/************************************************************************/
1.时钟使能 AHB1_ENR
2.然后配置GPIO寄存器
- MODER 模式寄存器
输入 || 输出 || 复用 || 模拟 - OTPYER 输出类型寄存器
推挽 || 开漏 - OSPEEDER 输出速度寄存器
分为4个等级 - PUPDR 上下拉寄存器
上拉 || 下拉 || 无 || 保持 - IDR 数据输入寄存器
r - ODR 数据输出寄存器
r/w - BSRR 置位复位寄存器
IDR 和 ODR 寄存器的综合版 - LCKR 端口配置锁定寄存器
没怎么用过 AFRL 复用功能低寄存器
低8位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)
- 关于GPIO的设置
- 关于DSP的GPIO的输入输出设置
- ARM的GPIO设置
- GPIO口的设置
- RK3288的gpio设置
- 关于GPIO的故事
- 关于GPIO的学习
- Omap3530 的GPIO中断设置
- Omap3530 的GPIO中断设置
- 设置AM3715 GPIO的方法
- 关于stm32的GPIO复用
- 关于imx6的gpio 问题
- STM32关于GPIO的问题
- 关于STM32 PB3 PB4 如何设置成普通GPIO的配置
- 关于STM32 PB3 PB4 如何设置成普通GPIO的配置
- 关于STM32 PB3 PB4 如何设置成普通GPIO的配置
- 关于STM32中的GPIO位设置的相关纪要与总结
- GPIO设置
- 51 nod 1087 1 10 100 1000 (set)
- 编写程序数一下 1到 100 的所有整数中出现多少次数字9
- 动态规划——序列对准
- mybatis中的#和$的区别?
- with as 固化的结果集是否可以使用原表的索引?
- 关于GPIO的设置
- c++------------之---【虚析构函数应用】
- BufferedInputStream和BufferOutputStream的用法。
- jdk动态代理与CGLib的区别
- QPainterPath(组合路径,路径运动)
- Qt -- Qt5.5.1实现通用串口程序
- java学习笔记(二)
- golang 定时刷新配置文件
- Java中使用装饰器的场合