当前位置: 首页 > 科技观察

一篇文章教你如何用C语言访问内存

时间:2023-03-14 09:23:25 科技观察

在单片机中,我们经常需要访问指定的寄存器或者去指定的RAM地址。本文为简要说明。下面提到的内存可以指:寄存器、RAM等。01宏定义:定义一个宏,将地址值转换成C指针,然后取指针指向的内容,这样就可以访问存储了。代码如下:#defineSDA_DIR_REG*(__IOuint32_t*)SDA_MOD_OFFSET分析:(__IOuint32_t*)SDA_MOD_OFFSE是强制类型转换为指针*(__IOuint32_t*)SDA_MOD_OFFSET获取该指针中的内容。这是一个非常简单实用的方法,对于访问某个寄存器非常有用。例如:*(__IOuint16_t*)(((uint32_t)0x60020000))(((uint32_t)0x60020000))是一个32位的IO地址(物理地址,在硬件上设置,不能修改)*(__IOuint16_t*)是aread得到这个地址的参数值,它的值是一个16位的参数。其实就是读取0x60020000寄存器的参数,也可以说是IO口当前的状态。02结构体:将内存定义为一个数据结构,然后定义一个指向该结构体的指针。符合CMSIS的设备驱动库就是这样做的typedefstruct{__IOuint32_tMODER;/*!LCD_CMD:是地址((uint32_t)(0x60000000|0x0000FFFF))上的数据LCD->LCD_DATA:是地址((uint32_t)(0x60000000|0x00010000))上的数据。这种驱动方式比较简洁,代码结构化。个人也比较喜欢这种方式。03与方法一对比:简单,但代码生成效率低,因为寄存器的地址值会作为常量存储,代码量会增加。由于需要访问更多寄存器来设置地址值,因此运行速度较慢。但是如果外设控制码值操作一个寄存器,效率和方法二一样。方法二:让外设中的多个寄存器共享一个常量作为基地址。可以使用立即偏移寻址模式访问每个寄存器。本文转载自微信公众号《知乎编程》