存储空间操作

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

相关推荐
charlie11451419111 小时前
现代嵌入式C++教程:C++98——从C向C++的演化(2)
c语言·开发语言·c++·学习·嵌入式·教程·现代c++
月光技术杂谈19 小时前
Linux发展到6.0了,其在嵌入式应用中,实时性方面有没有一些改进?
linux·嵌入式·实时性
切糕师学AI3 天前
Azure RTOS ThreadX 简介
microsoft·嵌入式·azure·rtos
飞凌嵌入式3 天前
AIoT出海背景下,嵌入式主控的国际认证之路与价值思考
大数据·人工智能·嵌入式硬件·区块链·嵌入式
小柯博客3 天前
从零开始打造 OpenSTLinux 6.6 Yocto 系统 - STM32MP2(基于STM32CubeMX)(九)
c语言·stm32·单片机·嵌入式硬件·物联网·嵌入式·yocto
大聪明-PLUS3 天前
优雅的操作系统开发:用现代 C++ 编写操作系统内核(不使用宏)。第一部分——HAL 为王。
linux·嵌入式·arm·smarc
Jason_zhao_MR4 天前
米尔RK3506核心板SDK重磅升级,解锁三核A7实时控制新架构
linux·嵌入式硬件·物联网·架构·嵌入式·嵌入式实时数据库
Shawn_CH4 天前
Linux 休眠时内核线程冻结机制说明
嵌入式
Shawn_CH4 天前
Linux 内核线程冻结情况分析
嵌入式
才鲸嵌入式4 天前
香山CPU(国产开源)的 SoC SDK底层程序编写,以及其它开源SoC芯片介绍
c语言·单片机·嵌入式·arm·cpu·verilog·fpga