关于FSMC驱动LCD的函数LCD_WR_REG的理解
- 首先你需要理解使用结构体LCD_BASE
- 若有错误,请各位师兄师姐指点
- 原理框图
- 重要的函数理解
- 关于LCD_BASE和函数LCD_WR_REG(u16 regval)的理解
- 至于0X6C00 0802地址也是一样的。
首先要说的是这是我个人的理解,很可能是错的!!!!!
首先要说的是这是我个人的理解,很可能是错的!!!!!
首先要说的是这是我个人的理解,很可能是错的!!!!!
首先要说的是这是我个人的理解,很可能是错的!!!!!
首先要说的是这是我个人的理解,很可能是错的!!!!!
首先要说的是这是我个人的理解,很可能是错的!!!!!
首先你需要理解使用结构体LCD_BASE
若有错误,请各位师兄师姐指点
原理框图
至于这里其中的详细讲解,可以参考:https://blog.csdn.net/RongLin02/article/details/121445952
重要的函数理解
首先来看一个结构体:
然后是几个非常重要的函数:
在这里我们先解释第一个函数:
void LCD_WR_REG(u16 regval)
{
LCD->LCD_REG = regval; //写入要写的寄存器序号
}
调用这个函数:
int main() {
LCD_WR_REG(0xd3);
}
关于LCD_BASE和函数LCD_WR_REG(u16 regval)的理解
在LCD_WR_REG函数中,可以发现居然是直接给LCD_REG赋值,很奇怪是吧,(这里用VS跑了一下输出LCD_REG居然是coredump)。
然后找了一些资料,发现说FSMC已经将地址0X6C00 07FE映射了(如何映射我也不知道),
这里的大概意思是向LCD_REG这个地址所指向的空间写入0XD3,然后FSMC就自动通过数据线FSMC_D[15:0]
发给LCD了。
也就是说这里的
LCD->LCD_REG = regval
的操作相当于
int *p; *p = regval;
这就是说并没有改变p(指针的值,即LCD_REG所指向的地址是0X6C00 07FE,那么就是说FSMC_A[0:25]其中的A10即LCD的RS没有改变,仍然是0)的值,那么就实现了向LCD写数据/命令的效果。