如何使用寄存器和偏移地址
How do I use registers and offset addresses?
目前,我正在尝试编写一个GPIO驱动程序,并试图了解一些事情。在互联网上搜索后,我还没有找到关于基本地址、寄存器和偏移地址的几个问题的明确答案。
对于下面的问题,假设我有一个任意寄存器D1:F0和一个10h-13h(大小为32位)的偏移地址。位0始终为1并保留,位10:1为GPIO基址,位31:11始终为0。此寄存器的默认值为0000000 1h。使用此信息:
1) 关于D1:F0,函数号到根端口映射是什么?
2) D1:F0是否包含可在代码中使用的端口?
3) 偏移地址与问题1/问题2的关系如何?
4) 寄存器的默认值关闭了除第一个保留位(应为1)之外的所有位,对吗?
偏执狂检查问题:比特[4:1]的意思是比特1-4,对吧?
提前感谢各位!
注意:我需要指出的是,这篇文章中的所有数据、寄存器、内存地址和偏移量都是任意的,并不能反映我将要使用/可以访问的数据。这只是概念性的,只是为了说明一点。
经过研究,我发现了一些东西:
1) 对于D1:F0的示例,函数号到根端口映射是一种表示法,表示寄存器位于D设备1上,对于PCH和总线,F函数0。总线设备可以具有多种"功能",例如,可以由不同的外围设备使用。
2) 是和否。由于没有更好的术语,NRP表示法为您提供了总线设备到函数的逻辑映射,并屏蔽了寄存器的实际十六进制基址和偏移量。处理器/芯片集文档具有总线起始位置的物理地址,并将这些地址与NRP表示法相关联。
3) 偏移地址与D1:F0的示例NRP表示法无关D1:F0只是寄存器相对于总线的基地址的表示,而不是实际的寄存器地址。您可以将偏移量(或偏移范围)应用于寄存器的基址。
4) 正确。只是用了一个位字段来验证,并把它写在纸上进行验证。
额外问题:[Number1:Number2]关于比特的符号表示从左到右读取比特(高位到低位)的比特。因此,例如,对于总共12个比特,比特[15:4]意味着从比特4到比特15。
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 使用内存地址访问结构的属性值
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- 在C++的头文件中使用常量并在程序中询问其地址的任何潜在危险
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 当我使用需要计算数组单元格地址的模板时,奇怪的C++行为
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- 使用地址作为标量值
- 使用 IP 帮助程序的 Windows 中活动 UDP 连接的远程地址
- 使用 C++将 IP 地址附加到字符*
- 在 C/C++ 中,是否可以通过使用指针更改"important"内存地址的值来创建简单的恶意软件?
- 如何存储变量的地址并使用指针打印值
- 获取我的IP地址并使用c++将其转换为字节
- Ip地址解析使用Mac地址编程
- 检查是否有“私网IP地址”被使用
- 我可以在读/写地址时使用gdb中断吗
- 是否有例外的规则,如果地址可以使用 &它是左值?
- 我怎么能访问一个类的虚拟方法与她的地址/不使用方法的名称