存储空间操作

最近一段时间,写了个验证芯片稳定性的程序,大致功能就是把芯片所有的寄存器、可以用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可用空间的计算,懂得都懂。

相关推荐
en.en..2 天前
第一篇:位域打包:看懂 I2C 地址左移的底层逻辑
stm32·嵌入式·位运算·i2c·底层驱动
youcans_2 天前
【嵌入式软件AI编程】21. 整理通用提示词模板
stm32·单片机·嵌入式·ai编程
番茄灭世神2 天前
PN学堂GD32课程第15篇——HardFault异常
c语言·单片机·嵌入式
LCG米2 天前
STM32串口接收卡死根因排查:ORE溢出标志陷阱、错误标志清除顺序与中断恢复实测
stm32·单片机·嵌入式硬件·串口·嵌入式
阿源-2 天前
从 INF、DSC、DEC 到 FDF:理解 EDK II 的 UEFI 编译与固件生成流程
嵌入式·uefi·edk2·固件
2035去旅行3 天前
SOC 里的 CPU 处理器 和 L1/L2 Cache
嵌入式·arm·soc
优信电子3 天前
STM32 驱动 SHT35 温湿度传感器:从 I²C 通信到 CRC 校验的完整实战
单片机·嵌入式
Hotpot3 天前
3 线程管理和调度
嵌入式
一直C3 天前
嵌入式 Linux 驱动开发学习笔记:设备树、pinctrl 与 GPIO 驱动开发
驱动开发·嵌入式·arm·dt
blueSatchel3 天前
framebuffer注册源码解读
linux·嵌入式