TFTLCD指针深度讲解

原创《TFTLCD指针深度解析》

限于知识程度有限,出错在所难免,还请指正!

辛苦之作,大家共享,转载还请注明出处!

Email :[email protected]

参考资料:STM32F405xx,STM32F407xx数据手册.pdf
STM32F4xx中文参考手册.pdf

//TFTLCD地址结构体

typedef struct
{
	vu16 LCD_REG;
	vu16 LCD_RAM;
} LCD_TypeDef;	    
#define LCD_BASE        ((u32)(0x6C000000 | 0x0000007E))
#define TFTLCD 			((LCD_TypeDef *) LCD_BASE)
TFTLCD->LCD_REG=regval; 	指针指向 0x6C00 007E
TFTLCD->LCD_RAM=data;		指针指向 0x6C00 0080
  • 1、怎么决定发送的是数据还是命令?
  • 假设说某个芯片有一个D/C管脚,连到了单片机I/O口上,我们就可以通过让I/O输出高低电平,决定发送的是数据还是命令,最常见的就是这样。但是现在我们的FSMC控制器要挂载外接存储器(TFTLCD屏),如下图,PF12 ( FSMC A6 )要复用成地址线, 不能通过 I/O 口
    拉高拉低决定发送数据还是命令,但是我们可以通过FSMC_A6这一根地址线是0还是1,决定发送的数据还是命令。

在这里插入图片描述

2、先来思考一个问题: 内核是怎么寻找到外设之间的 ?
在这里插入图片描述
举个栗子,当我们调用这一条程序时,GPIOA->MODER=xxxx,内核怎么把数据 xxxx 写入GPIOA的MODER寄存器的?
哎,内核首先发出疑问了,MODER寄存器是谁?在哪?我怎么把xxxx数据写进MODER寄存器?最明显的是,内核和外设不是直接进行数据交换的,如果是直接进行数据交换,那还要映射,总线干啥,对吧,哈哈哈。其实GPIOA->MODER 已经提供了一个地址(在后面有讲解),这时候内核拿着这个地址通过数据总线去外设地址上去寻址,说白了,内核要对某一个寄存器(外设)操作,前提得先找到你。然后是读是写,全由内核来说了算。寻址流程见上图
内核究竟怎么样交换数据的,没必要深究了,知道寻址流程就可以了。
讲完这个好像跟 TFTLCD 指针也没啥关系呀,别着急,看下一个问题-------->

  1. 3、HADDR[27:0]地址线 和 FSMC_A[24:0]地址线有什么关系?
    STM32F4xx中文参考手册 1194/1284
    HADDR[27:0]是什么? HADDR 是 AHB 内部地址线,但也会参与对外部存储器的寻址。
    HADDR 27位和26位用于选择4个存储区域之一的.
    我们定义的 TFTLCD指针 是指向0X6C00 007E 这个地址, 从图上看是存储在HADDR[25:0]里面,因为HADDR[25:0]包含外部存储器地址, 之后是要被传到FSMC_A[24:0]的 如图

TFTLCD指针传递过程
这两个结构体变量是16位的变量,当TFTLCD从指向LCD_REG 在指向 LCD_RAM的时候,7E 变成了 80 ,HADDR[25:0]的第7位 由0变成了1,FSMC_A[24:0]的第6位也由 0 变成了 1,就可以决定发的是数据还是命令了,16位的变量目的就在于此。
为什么是HADDR[25:0]这26根数据线呢,不是25根,24根呢?
存储区域地址相减,0X6FFF FFFF – 0X6C00 0000 =0X3F FFFF 换成二进制刚好是26个1。

  1. 4、结构体成员为什么只有地址有用?我们通过调用这两句话TFTLCD->LCD_REG=regval;TFTLCD->LCD_RAM=data;数据是怎么被传出去的?
    在这里插入图片描述
    通过这两张图,我们会发现跟最开始定义的TFTLCD结构体和TFTLCD指针超级像,简直一模一样呀。
    这里,我打开的是F4的keil工程,根据实际情况分析。。。
    #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 0x4002 0000 (自己算一下 哈哈)
    在这里插入图片描述
    所以、GPIOA 默认指向MODER寄存器
    只要有了GPIOA这个基地址 , 通过 -> 指向谁,就偏移到哪个寄存器 . GPIOA->MODER=xxxx操作就是直接向指针指向的寄存器赋值。
    这里只是定义了一个结构体,并没有定义变量,也没有开辟空间,GPIOA 指向谁,只是提供一个偏移,我们会发现,结构体成员只有地址有用,这两个变量就没有用了。
    类比GPIOA指针,TFTLCD指针也是同样的道理,给TFTLCD指针指向的区域赋值,只要数据到了这个区域(0x6C00 0000 - 0x6FFF FFFF),剩下的事情就是FSMC的了。

  2. 5、为什么HADDR的最后一根地址线舍弃了?

STM32F4xx中文参考手册1195 / 1284
因为我们的LCD屏是2个字节2个字节寻址的,而我们的总线是一个字节一个字节寻址的,寻址宽度不同所以要舍弃一根,详细解释见下面两个链接:
感谢下面两个链接的大佬,哈哈哈。。。

1、链接1
2、链接2

发布了6 篇原创文章 · 获赞 1 · 访问量 147

猜你喜欢

转载自blog.csdn.net/qq_42570756/article/details/103546079
今日推荐