图中只画出了数据线与地址线 其他的线我没有花,请各位脑部一下,实在不行去看原子提供的LCD的原理图。

LCD有一个引脚是D/C引脚,用来区分往LCD中写入的数据是命令还是数据 Data/Command
比如说我要给LCD控制器的X寄存器写入数据Y 那么我需要先给LCD发送一个命令----X寄存器的地址,此时D/C引脚为低电平
然后再发送一个数据Y,此时D/C引脚为高电平。但是正常的FSMC总线中没有控制命令与数据的功能(或许我不知道)。
正常的FSMC是绝对地址寻址。也就是需要硬件地址线A0-AX(X为地址的长度)去控制。
所以STM32使用了一根地址线不是说往LCD控制的的某个地址写入数据。而是用这一根地址线去控制往LCD输入是命令还是数据。
那么是怎么控制的,咱们一点一点来分析。
首先数据手册上说

为什么16位的时候要右移1位?这是因为宽度为16位的时候每写入一个数据,即为两个字节,那么地址就应该加2.
所以这样的话,用FSMC配置为16位数据宽度时,每次设置地址都只改变了HADDR[25:1],那么就会保证地址为2的倍数,不会出现从半个数据宽度的地址处写入数据的情况。搞清楚这个然后再来看原子提供的LCD结构体

1

2

3

4

5

6

7

8

typedef struct

{

vu16 LCD_REG;

vu16 LCD_RAM;

} LCD_TypeDef;

#define LCD_BASE        ((u32)(0x6C000000 | 0x0000007E))

#define LCD             ((LCD_TypeDef *) LCD_BASE)

这段代码,结构体中包含两个双字节成员LCD_REG跟LCD_RAM;
大家都知道结构体中的地址是从上到下连续增加的。
结构体的地址即为LCD_REG的地址。那么LCD_RAM的地址将为LCD_REG地址加2,因为是u16,双字节类型。
FSMC使用了NOR/SRAM的 Bank1 sector4 那么根据数据手册可以得知NOR/SRAM的起始地址为0x6000 0000
但是FSMC又把NOR这部分区域的地址分为了四块,在这使用的是第四块,所以HADDR[27 26] == 11
即27与26位为1,所以地址应该基地址应该为0x6C00 0000

然后再看地址线选用了A6当作LCD的D/C区分线,那么就应该是写入LCD_RAM时,第七位(还有A0嘛 这反应一下)应该为1。但是设置的数据宽度为16位,STM32会自动的右移1位,所以咱们需要反过来左移一位,那么就应该是1000 0000b 把这个数减2就应该是
0111 1110b 即为0x7E
那么0x6C00 0000 | 0x7E 这个地址将会是LCD结构体的首地址。

1

#define LCD_BASE        ((u32)(0x6C000000 | 0x0000007E))

而这句话,将LCD_BASE代表这个地址数据

1

#define LCD             ((LCD_TypeDef *) LCD_BASE)

这句话将LCD定义为一个结构体指针,而这个结构体指针的地址为LCD_BASE

现在再反过来推一遍。
定义了这个结构体指针,第一个成员的地址为0x6C00 007E,第二个成员的地址为0x6C00 0080
把这两个数写成二进制格式
0110 1100 0000 0000 0000 0000 0111 1110
0110 1100 0000 0000 0000 0000 1000 0000
通过对比是不是看出来第8位从0变为了1,即为A7的电平状态,但是由于16位数据格式,要右移一位,所以就会成为A6的电平状态。
所以通过这个结构体对不同地址写入数据,就能控制是对LCD写入的是命令还是数据。

STM32 FSMC 地址相关推荐

  1. STM32 FSMC/FMC原理保姆级讲解(二)

    上一话我们说了FSMC的基本原理及控制逻辑,这一讲我们来说下FSMC如何通过HAL库来进行配置,及具体参数 STM32 FSMC/FMC原理保姆级讲解(一) FSMC的初始化 在使用SRAM之前,我们 ...

  2. STM32 FSMC/FMC原理保姆级讲解(一)

    FSMC通俗讲解 FSMC 框图 FMC引脚说明 FMC地址映射 FSMC不同位宽操作 FSMC寄存器 FSMC时钟 FSMC 四种模式 FSMC参数设置 FSMC 控制异步 NOR FLASH 的时 ...

  3. STM32 FSMC接口驱动4.3寸TFT LCD屏

    STM32 FSMC接口驱动4.3寸TFT LCD屏 STM32的FSMC接口是并行总线接口,可以用于驱动存储芯片如FLASH/SRAM等,也可以用于驱动并口LCD屏. 这里以STM32F103VET ...

  4. STM32 FSMC 驱动16脚12864lcd液晶显示屏

    写在前面 在学习了两天STM32 FSMC后,总算是拿这个东西做了第一个应用,关于FSMC是什么东西怎么用,CSDN中有很多介绍,但是,估计新手刚看都是一头雾水(我就是),不过,你仍必须反反复复地看, ...

  5. STM32 FSMC简介(二)

    以下内容整理自<STM32中文参考手册>.正点原子<STM32F1开发指南--库函数版>.野火<零死角玩转STM32F103霸道V2>,仅为个人学习方便所整理 4. ...

  6. 8、STM32 FSMC驱动LCD(ILI93xx)

    本文使用FSMC驱动LCD显示,关于建议先看之前的7.STM32 FSMC驱动SRAM一文 硬件连接: 一.CubeMx配置FSMC驱动LCD ILI93xx 此章只为快速使用LCD,不涉及原理.指令 ...

  7. STM32 FSMC学习笔记+补充(LCD的FSMC配置)

    STM32 FSMC学习笔记+补充(LCD的FSMC配置) STM32 FSMC学习笔记 STM32 FSMC的用法--LCD 转载于:https://www.cnblogs.com/LittleTi ...

  8. STM32启动地址设置及从非0x800000 开始调试程序

    首先设置程序的启动地址,STM32默认的启动地址是从0x8000000开始的,现在我要设置程序向后偏移10K地址,也就是从0x8002800启动. 需要分两步完成上面操作: 一.Keil MDK设置: ...

  9. STM32 FSMC 16位寻址 地址移位的解读

    一. 当 Bank1 接的是 16 位宽度存储器的时候:HADDR[25:1] FSMC_A[24:0]. 当 Bank1 接的是 8 位宽度存储器的时候:HADDR[25:0] FSMC_A[2 ...

  10. STM32 FSMC基地址详解

    LCD有如下控制线: CS:Chip Select 片选,低电平有效 RS:Register Select 寄存器选择 WR:Write 写信号,低电平有效 RD:Read 读信号,低电平有效 RES ...

最新文章

  1. 机器学习中算法的性能评估
  2. 超干货!一位博士生80篇机器学习相关论文及笔记下载
  3. 多家巨头实测鸿蒙系统:比安卓快60%
  4. MVC下HtmlHelper自带BeginForm表单提交与异步Ajax请求
  5. CNN收购Beme视频分享APP 11个员工也将加入
  6. 不是我吹,20M的压缩文件我只用了1秒!
  7. Windows下使用Caffe-Resnet
  8. ExceptionLess新玩法 — 记日志
  9. python常用类型转换の方法
  10. [Hadoop] - 异常Cannot obtain block length for LocatedBlock
  11. [转]Winform不规则窗体的实现心得
  12. 择师论(怎么有效的向别人学习)
  13. zend studio php 接口,通过PHP环境ZendStudio轻松实现webservice接口
  14. 按键精灵打怪学习-多窗口多线程后台判断人物、宠物血量和宠物快乐度
  15. Guice依赖注入(一)
  16. 在word文档中插入代码_如何在自动更新的Word文档中插入当前的月份和年份
  17. 学影视模型与游戏模型哪个更有前景呢?
  18. 当你凝视深渊时,深渊也在凝视着你。
  19. python tableau工作流_【干货】五分钟Get到Tableau五个实用小技巧
  20. 如何导入后缀ndm的文件

热门文章

  1. 5面阿里,终获offer(Java后端)
  2. 还在为满意的渐变色发愁吗?10+个网站帮你解决烦恼
  3. python 隐马尔可夫模型的中文分词和词性分类实验 hmm
  4. kubelet源码分析(四)之 syncLoopIteration
  5. 计算机单位换换算,时间单位换算表与计算机单位换算
  6. 云计算怎么学?学习云计算有什么用?
  7. 留学目的地选择之伊利诺伊州
  8. 直连服务器ping有丢包,为何ping服务器会丢包严重?
  9. 程序员风格的修真小说 —— 《码师》
  10. 【FlinkX】两个issue分析:reader和writer的通道数不一致+获取JobId