关于结构体与对应寄存器地址的问题

2019-07-15 21:00发布

//LCD地址结构体
typedef struct
{
        u16 LCD_REG;
        u16 LCD_RAM;
} LCD_TypeDef;
结构体定义成这样,如何让LCD_REG变量对应地址为0x6000 0000,LCD_RAM对应寄存器地址为0x6002 0000?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
dongyumin
1楼-- · 2019-07-15 23:34
#define LCD ((LCD_TypeDef*)0X60000000 )  

结构体每个成员变量都是16bit的。所以,第一个LCD->LCD_REG的地址0X60000000.第二个LCD->LCD_RAM地址自增2个字节。。。
youhuofree0
2楼-- · 2019-07-16 01:26
 精彩回答 2  元偷偷看……
dongyumin
3楼-- · 2019-07-16 06:34
youhuofree0 发表于 2014-1-19 15:49
首先,谢谢您的回答,这个我知道,问题是我想让这个结构体第二个成员地址为0x6002 0000,后面用到LCD->L ...

typedef struct
{
  __IO uint16_t CR1;
  uint16_t  RESERVED0;
  __IO uint16_t CR2;
  uint16_t  RESERVED1;
  __IO uint16_t OAR1;
  uint16_t  RESERVED2;
  __IO uint16_t OAR2;
  uint16_t  RESERVED3;
  __IO uint16_t DR;
  uint16_t  RESERVED4;
  __IO uint16_t SR1;
  uint16_t  RESERVED5;
  __IO uint16_t SR2;
  uint16_t  RESERVED6;
  __IO uint16_t CCR;
  uint16_t  RESERVED7;
  __IO uint16_t TRISE;
  uint16_t  RESERVED8;
} I2C_TypeDef;
库里的结构体,定义了成员变量RESERVED来保留一些不用的地址空间,,,这些寄存器实质都是4字节的,而有效位都只有它们的低16位,软件上为了对齐,定义了保留成员变量用于填充内存。。。

youhuofree0
4楼-- · 2019-07-16 08:51
dongyumin 发表于 2014-1-19 16:08
typedef struct
{
  __IO uint16_t CR1;


我是不是可以理解为将第一个变量地址指定为0x6000 0000,中间填充保留变量(实际未用),一直到地址为0x6002 0000呢?可是这样定义的保留变量就太多了2的16次方个(65536)。能不能弄到一个结构体中呢?不能的话,怎样定义成该地址的指针变量啊?再次感谢!
dongyumin
5楼-- · 2019-07-16 13:31
#define LCD_RAM ((volatile u16*)0x60020000)
#define LCD_REG ((volatile u16*)0x60000000)

直接这样变成指针吧、、、呵呵、
youhuofree0
6楼-- · 2019-07-16 14:21
dongyumin 发表于 2014-1-19 18:10
#define LCD_RAM ((volatile u16*)0x60020000)
#define LCD_REG ((volatile u16*)0x60000000)


好吧,谢谢啦~

一周热门 更多>