//LCD???·?á????
typedef struct
{
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;
//????NOR/SRAM?? Bank1.sector4,???·??HADDR[27,26]=11 A10×÷???????ü????·???
//×????è???±STM32?????á????????????! 111110=0X3E
#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
依我自己的理解,这样定义也行啊,可实际是不行的,请问差在哪?
//LCD???·?á????
typedef struct
{
u32 LCD_REG;
u32 LCD_RAM;
} LCD_TypeDef;
//????NOR/SRAM?? Bank1.sector4,???·??HADDR[27,26]=11 A10×÷???????ü????·???
//×????è???±STM32?????á????????????! 111110=0X3E
#define LCD_BASE ((u32)(0x6C000000 | 0x000007FC))
#define LCD ((LCD_TypeDef *) LCD_BASE)
A10的话数据和命令的控制信号是0x000007fe,结构体中定义的是16位的变量,两字节加上2就是RAM地址0x00000800. 如果定义的是32位的变量,是不是就是0x000007fc,四字节加上四后就是RAM的地址0x00000800了,但就是不好使,为什么呢?是因为给LCD的数据或是命令是16位的,结构体中就得定义成16位的变量吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
LCD_REG/LCD_RAM这两个东西是定义了FSMC的相关地址变量,看#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#define LCD ((LCD_TypeDef *) LCD_BASE)这里就强制性转换成结构体的指针了,当你往LCD_REG送数据的时候就是往0x6C000000 | 0x000007FE这个地址上面放上数据,如同51上的P0 = 0XFF一样,仔细看下有关于STM32的FSMC的介绍吧
我的这样写的
#define LCD_REG_ADD ((u32)(0x6c000000 | 0x000007fe)) //寄存器地址,命令,RS = 0
#define LCD_DAT_ADD ((u32)(0x6c000000 | 0x00000800)) //显示数据地址,显示RAM,RS = 1
#define LCD_WR_REG(index) ((*(__IO u16 *)(LCD_REG_ADD)) = ((u16)index))
//写LCD寄存器写入数值index
#define LCD_WR_Data(val) ((*(__IO u16 *)(LCD_DAT_ADD)) = ((u16)val))
//往LCD的RAM写入数据val
一周热门 更多>