存储空间操作

最近一段时间,写了个验证芯片稳定性的程序,大致功能就是把芯片所有的寄存器、可以用RAM,在芯片上电时,进行初始化。之后,在主循环里面不断的读取寄存器数据。并做电磁兼容性实验,观察寄存器、RAM存储的数据有没有变化。寄存器操作选用了最笨最直接的方法,直接对着芯片手册,看寄存器列表,把所有有意义的位,都设置为与默认值相反的数据。但实际操作过程中,发现有些数据没有写成功,下面就对这些进行说明。

1.只读只写寄存器

首先,来看一张寄存器内容截图。

从这里可以看到端口设置寄存器、端口复位寄存器、端口翻转寄存器,属于只写寄存器,无法进行读操作,或者读寄存器时,返回内容恒为0。其次,端口数据(PTDAT)寄存器,该寄存器的数值,取决于引脚类型,所以直接想当然的写0xFFFF,寄存器的内容不一定是该数值。PTDAT寄存器数据的操作遵循如下规则。
1)芯片引脚选择 GPIO 功能或复用数字功能
若方向寄存器配置为输出,PTDAT 读取值为寄存器设置值,不随外部 PIN 脚电平变化而变化;
若方向寄存器配置为输入,PTDAT 读取值为 pad 状态值,反映外部 PIN 脚电平变化;
2)芯片引脚选择复用模拟功能,PTDAT 相应 bit 位值,固定为 0

2.状态寄存器

外部中断标志寄存器,即使没有使能中断,但中断触发条件达到,中断标志位依然会置位。所以,中断标志寄存器不能作为芯片是否稳定的判断条件。

3.发送数据寄存器

串口数据缓冲寄存器(SBUF),写数据后,串口发送完成,SBUF寄存器数据清零,不能作为判断依据。

4.有条件读写寄存器

以RTC指示寄存器为例,读取和设置都需要先配置其他寄存器,且最好按照SECR、MINR、HOURR、DAYR、MONTHR、YEARR、WEER。

此外,寄存器的数值可能也有限制,以SECR寄存器为例,只能写入0-59范围内的数据。

有些寄存器写入前,需要关闭写保护,否则写入操作无效。

部分寄存器的读写还需要先使能相应模块,否则模块配置无法起作用。

5.RAM操作

RAM操作要先确定RAM空间大小,排除不可用部分。查看程序的.map文件,发现栈和静态变量占据了一部分,排除这部分空间,就是可以用的空间。针对这部分的空间操作,我才用直接地址读写,这算是一种笨方法吧,请留意前面提到的静态变量,它们也都存储在RAM里面。用户可以通过操作静态变量数组,进行RAM空间操作。

留一个小陷阱,那就是RAM可用空间的计算,懂得都懂。

相关推荐
济6175 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
嵌入小生0075 天前
线程间通信---嵌入式(Linux)
linux·c语言·vscode·嵌入式·互斥锁·线程间通信·信号量
济6175 天前
ARM Linux 驱动开发篇---GPIO子系统详解-- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
charlie1145141915 天前
嵌入式C++教程——Lambda捕获与性能影响
开发语言·c++·笔记·嵌入式·现代c++·工程实践
嵌入小生0076 天前
线程(2)/ 线程属性 /相关函数接口--- 嵌入式(Linux)
linux·嵌入式·线程·软件编程·僵尸线程·马年开工第一学·线程属性
序安InToo6 天前
第4课|程序结构与编译流程
后端·操作系统·嵌入式
济6176 天前
ARM Linux 驱动开发篇--- pinctrl 子系统详解-- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
济6176 天前
FreeRTOS基础知识---为什么使用FreeRTOS以及其核心功能
嵌入式·freertos
乔碧萝成都分萝7 天前
二十六、IIO子系统 + SPI子系统 + ICM20608
linux·驱动开发·嵌入式
序安InToo7 天前
第3课|第一个Ada程序:Hello World深入解析
后端·操作系统·嵌入式