R40 gpio 寄存器地址操作【原创】
首先要学会看手册,下面拿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 寄存器地址操作【原创】相关推荐
- OpenBMC开发笔记系列——(六)如何通过ast2600的datasheet查看GPIO寄存器地址
打开ast2600的datasheet文档,找到GPIO相关章节 41 GPIO Controller (GPIO) 可以看到有关GPIO寄存器的介绍 Base Address of GPIO = 0 ...
- GPIO寄存器的地址怎么寻找?
由上图知,GPIOC的地址就是在这个PERIPH_BASE地址的基础上偏移得到得. 我们可以一步一步的计算一下GPIOC的地址是多少. 0x40000000 + 0x10000 + 0x1000 == ...
- A40i使用笔记:GPIO操作方式(用于测试设备io驱动性能)(传统方式、设备树方式、寄存器方式操作GPIO)
一.前言 前文介绍了文件io的驱动方式,可以用于led点灯灭灯或者一些简单的不需求时序控制的ic操作,但是用于功能类ic,如AD采集芯片等时序控制需求高的,就不行了,这时候就需求高速io去实现指定的芯 ...
- GPIO寄存器原理与操作
一.GPIO内部结构 输出数据:从芯片内部到芯片I/O端口 方式一:通过写操作直接控制位设置/清除寄存器而后到输出数据寄存器 方式二:通过读写操作直接到达输出数据寄存器 两种方式到达输出数据寄存器后到 ...
- 嵌入式学习笔记——使用寄存器编程操作GPIO
使用寄存器编程操作GPIO 前言 GPIO相关的寄存器 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I) 位操作 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) ...
- 4412 GPIO读 和 ioremap控制GPIO寄存器
一.配置GPIO读 在视频14的基础上做 1.利用拨码开关来实现GPIO输入 所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_G ...
- STM32(五)------GPIO位带操作
GPIO位带操作 介绍 位带简介 外设位带区 SRAM位带区 位带区和位带别名区地址转换 GPIO 位带操作 代码解析 GPIO 寄存器映射 GPIO位操作 主函数 介绍 位带简介 位操作就是可以单独 ...
- 【i.MX6ULL】驱动开发3——GPIO寄存器配置原理
前面的两篇Linux驱动文章,介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程. 本篇起,就要来操作Linux开发板的硬件,首先当然是通过经典的点亮LED灯程序 ...
- STM32学习--GPIO(寄存器)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.GPIO是什么? 二.引脚 GPIO的输入 输入框图 输入模式 作用 GPIO的输入 输入框图 输入模式 作用 GPIO ...
最新文章
- 【Springboot】日志
- Docker 1.3.2发布:修复重大安全问题
- [Scala]集合中List元素转Tuple元素的函数迭代写法
- STM32 基础系列教程 46 – RNG
- 【Cocosd2d实例教程四】Cocos2d实现人物原地走动
- Hyperledger Fabric 1.4 搭建区块链浏览器
- 百度健康打通医药电商服务
- Vue_注册登录(短信验证码登录)
- BeanShell异常处理
- ftp ---- 配置文件(默认配置文件解读)
- Open3d之网格(Mesh)操作
- JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)...
- kafka--Struct Streaming--console案例入门
- C++ 类的隐式转换之基本数据类型
- hmcl手机版_hmcl启动器app下载
- 【游戏引擎Easy2D】第一个引擎程序
- 计算机的大管家教学反思,四年级计算机 第一课 计算机的“大管家”—— Windows XP.doc...
- java 6面骰子_Java实现的简单掷骰子游戏示例
- android assets 编译,使用Android Studio编译assets文件未打包进apk
- Linux登录mysql密码正确被拒绝访问
热门文章
- lock 线程 java_Java多线程之Lock的应用
- 北美互联网公司“隐藏福利”大盘点:看完我彻底酸了...
- AI基础:机器学习和深度学习的练习数据
- 【人工智能】给初学者们讲解人工神经网络(ANN)
- 程序员,活得是本事:30 岁后的 人生建议
- iQOO Neo6现身安兔兔数据库:高导热稀土散热加入 跑分轻松破百万
- 每周到岗上班3天,2天可在家办公!携程3+2工作模式来了
- 90后过年,吃零下18度的年夜饭
- 腾讯正式下线PC版QQ秀 网友:我的时代落幕了
- iPhone 13凌晨发布,电池容量较iPhone 12最高有望提升20%(文末有福利)