SOC的GPIO配置
1 GPIO工作原理
Soc共集成40路双向GPIO,每一路GPIO的输入输出方向由方向寄存器来控制,管脚的输入输出电平值保存在相应的输入/输出值寄存器当中。外部信号输入至内部后经三级同步,再进行滤波,滤波宽度可通过相应的滤波宽度寄存器来选择配置,支持的滤波宽度范围为0~63个系统时钟周期。输入信号的脉冲宽度若能达到寄存器的设置值,则允许被采样,否则将被当做“毛刺”过滤。GPIO输出采用寄存器输出,通过写GPIO输出值寄存器直接将信号通过引脚向外部输出。GPIO模块的结构如图1所示:
图1 gpio结构
注意:数据手册上与实际使用上有冲突,手册上GPIO有60路可是实际使用过程中只有40路,40路GPIO分两组寄存器来进行配置,0-9路GPIO使用寄存器1的22-31位来配置,后30用寄存器2的0-29位来配置。
2 配置流程
GPIO的配置流程如下:
- 使能整个GPIO外设时钟,配置外设时钟寄存器(地址为0x40C00000)的24位为1。
- 配置引脚复用为GPIO,配置引脚复用寄存器(地址为0x40C00004)的第2位和第3位为0x0,使得中断复用引脚和外扩内存引脚都配置为GPIO功能。
- 配置GPIO模式寄存器GPIOEN器,使对应IO工作为GPIO口模式,如果GPIO编号小于10则配置GPIOEN1对应IO口的值为0x1,如果GPIO编号大于等于10则配置GPIOEN2对应IO口的值为0x1.
- 配置GPIO方向寄存器GPIODIR,配置其对应IO口为输入还是输出,对应位为1表示输出,对应位为0表示输入。
- 设置输出IO口的电平,配置GPIO输出电平寄存器GPIOODR的对应位为1表示输出高电平,对应位为0表示输出低电平。
- 获取输入IO口的电平值,获取GPIO输入电平寄存器GPIOIDR的对应位的数值,若为1表示获取到高电平,如为0表示获取到低电平。
3 数据结构封装
根据GPIO模块寄存器地址在内存分配图中的分布,将其地址定义为整型宏定义,将寄存器定义为各位各个功能位域的结构联合体。这样子将整型地址转换成寄存器的结构联合体指针,就能够通过寄存器位域去编写底层驱动了,图1表示宏定义寄存器的定义和类型转换,图2表示寄存器结构联合体定义。
图1
图2