首先要学会看手册,下面拿PC来做说明。

3.18.3.  Register List

Module Name  Base Address

PIO  0x01C20800

Register Name       Offset                               Description

Pn_CFG0             0x0000+N*0x24             Port n Configure Register 0 (N from 0 to 8)

Pn_CFG1             0x0004+N*0x24              Port n Configure Register 1 (N from 0 to 8)

Pn_CFG2     0x0008+N*0x24      Port n Configure Register 2 (N from 0 to 8)

Pn_CFG3     0x000C+N*0x24       Port n Configure Register 3 (N from 0 to 8)

Pn_DAT     0x0010+N*0x24      Port n Data Register (N from 0 to 8)

Pn_DRV0     0x0014+N*0x24      Port n Multi-Driving Register 0 (N from 0 to 8)

Pn_DRV1     0x0018+N*0x24      Port n Multi-Driving Register 1 (N from 0 to 8)

Pn_PUL0      0x001C+N*0x24      Port n Pull Register 0 (N from 0 to 8)

Pn_PUL1      0x0020+N*0x24      Port n Pull Register 1 (N from 0 to 8)

PIO_INT_CFG0  0x0200  PIO Interrupt Configure Register 0

PIO_INT_CFG1  0x0204  PIO Interrupt Configure Register 1

PIO_INT_CFG2  0x0208  PIO Interrupt Configure Register 2

PIO_INT_CFG3  0x020C  PIO Interrupt Configure Register 3

PIO_INT_CTL  0x0210  PIO Interrupt Control Register

PIO_INT_STA  0x0214  PIO Interrupt Status Register

PIO_INT_DEB  0x0218  PIO Interrupt Debounce Register

通过上面表格可以看出 gpio的基地址是0x01C20800,后面所有的IO地址都是在次基础上计算得出,Pn_CFG0 表示功能分配,控制8个管脚,该8个管脚为一组,用4字节存储,共32位,每4位表示一个管脚的功能定义。Pn_DAT  表示数据,Pn_DRV0  表示驱动能力,Pn_PUL0  表示内部上拉下拉。

下面看PC

PC Configure Register 0(Default Value: 0x7777_7777)

寄存器0的默认值都为7,也就是8个脚的功能配置都是7,7是什么含义需要看具体的解析,下面会分析。如果PC的管脚多,就需要多个寄存器,因为PC有25个脚,所以需要4个寄存器,register0-3。

Offset: 0x0048                         Register Name: PC_CFG0

Bit              Read/Write                      Default/Hex                     Description

31                      /                                       /                                       /

30:28              R/W                              0x7                          PC7_SELECT

000: Input  001: Output

010: NRB1  011: SDC2_CLK

100: Reserved 101: Reserved

110: Reserved 111: IO Disable

offset :0x0048,表示偏移量,是针对上面基地址的。

这个是PC7的功能配置寄存器, 因为每个脚的功能选择都是4位来存储,由于只有7种功能,所以只用后三位即可,第31位不用配,30-28三位根据填写,后面是具体描述,如果配置成输出,该4位的值位0001,看默认值是7,那就是使用了IO Disable功能。  其它功能脚的定义类似。

下面看看内部上拉下拉的配置

3.18.4.27. PC Pull Register 1(Default Value: 0x0000_4016)

Offset: 0x0068                                Register Name: PC_PULL1

Bit                          Read/Write                        Default/Hex                                  Description

31:18                         /                                             /                                                      /

[2i+1:2i]                  R/W                              0x4016                                             PC_PULL

(i=0~8)                                                                                                                  PC[n] Pull-up/down Select (n = 16~24)

00: Pull-up/down disable  01: Pull-up

10: Pull-down 11: Reserved

内部上拉下拉默认值为0x00004016 ,它有两位表示上拉下来状态,因为pc有25个脚,所以 PC Pull Register 0表示 0-15脚的状态。 而现在Register 1则表示剩下的9个脚,用4字节32位的后18位即可,所以31:18这14位为空,用 / 表示。

从低位往高位数,每两位表示一个PC脚的上拉下拉状态,,具体值的说明右边以给出。可以进一步分析刚才那个默认值,对应的具体的管脚的内部pull状态。

分析一下下面代码

#define SUNXI_PIO_BASE 0x01c20800

void spi_gpio_cfg(int spi_no)

{

uint reg_val = 0;

uint reg_addr;

// PIO SETTING,PortC0:2 SPI0_MOSI SPI0_MISO SPIO_CLK

reg_addr = SUNXI_PIO_BASE + 0x48;        //找到PC功能配置的地址

reg_val = readl(reg_addr);                             //将该PC_CFG0对应的4字节读出来

reg_val &= ~(0xfff);                                          //因为4位表示一个脚,这里是清空pc0,pc1,pc2

reg_val |= 0x333;                                            //将pc0 ,pc1,pc2, 配置成功能3

writel(reg_val, reg_addr);                              //将修改后的值写

// PIO SETTING,PortC23 SPI0_CS0

reg_addr = SUNXI_PIO_BASE + 0x50;       //偏移0x50是PC_CFG2,这里8个脚是pc16-23

reg_val = readl(reg_addr);                           //同上,取出PC_CFG2的数据

reg_val &= ~(0xf<<28);                                 //左移28位,清空改组第八个脚即pc23

reg_val |= 0x3<<28;                                       //将pc23的功能配置为3

writel(reg_val, reg_addr);                                   //写入

// PIO SETTING,PortC SPI0 pull reg

reg_val = readl(SUNXI_PIO_BASE + 0x68);     //偏移0x68是PC_PULL1,也就是pc16-24 的pull功能,,取出数据

reg_val &= ~(0x03 << 14);                                   //左移14位,清空 pc23 的pull寄存器

reg_val |= (0x01 << 14);                                        //左移14位,将pc23 的pull寄存器设置1,即内部上拉

writel(reg_val, (SUNXI_PIO_BASE + 0x68));     //写入

SUNXI_DEBUG("Reg pull reg_val=0x%x,read=0x%x\n",reg_val,readl((0x1c20800 + 0x68)));

}

通过上面的代码分析,基本搞定寄存器地址与内容的联系。

R40 gpio 寄存器地址操作【原创】相关推荐

  1. OpenBMC开发笔记系列——(六)如何通过ast2600的datasheet查看GPIO寄存器地址

    打开ast2600的datasheet文档,找到GPIO相关章节 41 GPIO Controller (GPIO) 可以看到有关GPIO寄存器的介绍 Base Address of GPIO = 0 ...

  2. GPIO寄存器的地址怎么寻找?

    由上图知,GPIOC的地址就是在这个PERIPH_BASE地址的基础上偏移得到得. 我们可以一步一步的计算一下GPIOC的地址是多少. 0x40000000 + 0x10000 + 0x1000 == ...

  3. A40i使用笔记:GPIO操作方式(用于测试设备io驱动性能)(传统方式、设备树方式、寄存器方式操作GPIO)

    一.前言 前文介绍了文件io的驱动方式,可以用于led点灯灭灯或者一些简单的不需求时序控制的ic操作,但是用于功能类ic,如AD采集芯片等时序控制需求高的,就不行了,这时候就需求高速io去实现指定的芯 ...

  4. GPIO寄存器原理与操作

    一.GPIO内部结构 输出数据:从芯片内部到芯片I/O端口 方式一:通过写操作直接控制位设置/清除寄存器而后到输出数据寄存器 方式二:通过读写操作直接到达输出数据寄存器 两种方式到达输出数据寄存器后到 ...

  5. 嵌入式学习笔记——使用寄存器编程操作GPIO

    使用寄存器编程操作GPIO 前言 GPIO相关的寄存器 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I) 位操作 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) ...

  6. 4412 GPIO读 和 ioremap控制GPIO寄存器

    一.配置GPIO读 在视频14的基础上做 1.利用拨码开关来实现GPIO输入 所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_G ...

  7. STM32(五)------GPIO位带操作

    GPIO位带操作 介绍 位带简介 外设位带区 SRAM位带区 位带区和位带别名区地址转换 GPIO 位带操作 代码解析 GPIO 寄存器映射 GPIO位操作 主函数 介绍 位带简介 位操作就是可以单独 ...

  8. 【i.MX6ULL】驱动开发3——GPIO寄存器配置原理

    前面的两篇Linux驱动文章,介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程. 本篇起,就要来操作Linux开发板的硬件,首先当然是通过经典的点亮LED灯程序 ...

  9. STM32学习--GPIO(寄存器)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.GPIO是什么? 二.引脚 GPIO的输入 输入框图 输入模式 作用 GPIO的输入 输入框图 输入模式 作用 GPIO ...

最新文章

  1. 【Springboot】日志
  2. Docker 1.3.2发布:修复重大安全问题
  3. [Scala]集合中List元素转Tuple元素的函数迭代写法
  4. STM32 基础系列教程 46 – RNG
  5. 【Cocosd2d实例教程四】Cocos2d实现人物原地走动
  6. Hyperledger Fabric 1.4 搭建区块链浏览器
  7. 百度健康打通医药电商服务
  8. Vue_注册登录(短信验证码登录)
  9. BeanShell异常处理
  10. ftp ---- 配置文件(默认配置文件解读)
  11. Open3d之网格(Mesh)操作
  12. JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)...
  13. kafka--Struct Streaming--console案例入门
  14. C++ 类的隐式转换之基本数据类型
  15. hmcl手机版_hmcl启动器app下载
  16. 【游戏引擎Easy2D】第一个引擎程序
  17. 计算机的大管家教学反思,四年级计算机 第一课 计算机的“大管家”—— Windows XP.doc...
  18. java 6面骰子_Java实现的简单掷骰子游戏示例
  19. android assets 编译,使用Android Studio编译assets文件未打包进apk
  20. Linux登录mysql密码正确被拒绝访问

热门文章

  1. lock 线程 java_Java多线程之Lock的应用
  2. 北美互联网公司“隐藏福利”大盘点:看完我彻底酸了...
  3. AI基础:机器学习和深度学习的练习数据
  4. 【人工智能】给初学者们讲解人工神经网络(ANN)
  5. 程序员,活得是本事:30 岁后的 人生建议
  6. iQOO Neo6现身安兔兔数据库:高导热稀土散热加入 跑分轻松破百万
  7. 每周到岗上班3天,2天可在家办公!携程3+2工作模式来了
  8. 90后过年,吃零下18度的年夜饭
  9. 腾讯正式下线PC版QQ秀 网友:我的时代落幕了
  10. iPhone 13凌晨发布,电池容量较iPhone 12最高有望提升20%(文末有福利)