stm32专题二十一:FSMC模拟8080时序

发布者:sheng44最新更新时间:2021-10-27 来源: eefocus关键字:stm32  FSMC 手机看文章 扫描二维码
随时随地手机看文章

ILI9341的8080通讯接口时序可以由STM32使用普通 I/O 接口进行模拟,但这样效率太低,STM32 提供了一种特别的控制方法,使用FSMC接口实现8080时序。


由于 FSMC 外设可以用于控制扩展的外部存储器,而 MCU 对液晶屏的操作实际上就是把显示数据写入到显存中,与控制SRAM 存储器非常类似,且 8080 接口的通讯时序完全可以使用 FSMC 外设产生,因而非常适合使用 FSMC控制液晶屏。


FSMC结构框图:

LCD — 液晶显示:

NADV引脚是专门拥堵地址 / 数据线复用时做锁存信号,如下。当我们不需要地址 / 数据线复用时,NADV就不用管。

NADV由以下寄存器位来配置:

液晶屏使用模式B的写操作时序:

模式B读操作时序:

根据 STM32 对寻址空间的地址映射,地址 0x6000 0000 ~0x9FFF FFFF 是映射到外部存储器的,而其中的 0x6000 0000 ~0x6FFF FFFF 则是分配给 NOR FLASH、PSRAM这类可直接寻址的器件。


当 FSMC 外设被配置成正常工作,并且外部接了 NOR FLASH 时,若向 0x60000000地址写入数据如 0xABCD,FSMC 会自动在各信号线上产生相应的电平信号,写入数据。FSMC 会控制片选信号 NE1 选择相应的 NOR 芯片,然后使用地址线 A[25:0]输出0x60000000,在 NWE 写使能信号线上发出低电平的写使能信号,而要写入的数据信号0xABCD 则从数据线 D[15:0]输出,然后数据就被保存到 NOR FLASH 中了。


使用FSMC模拟8080时序:

一个非常重要的问题:就是地址对齐。


回想之前在SRAM中使用到的一个函数:


  /* 向整个SRAM写入数据  16位 */

  for (counter = 0; counter < IS62WV51216_SIZE/2; counter++)

  {

    *(__IO uint16_t*) (Bank1_SRAM3_ADDR + 2*counter) = (uint16_t)(uhWritedata_16b + counter);

  }

这个函数能够正常运行,没有问题。但是,值得注意的是,SRAM的数据线为16位,也就是说每个地址对应2个字节。这里在代码中直接写的是Bank1_SRAM3_ADDR + 2*counter,那么就会递增两个地址(4字节),是不是出了问题??应该只递增1地址才对啊?但是,无论是这个代码 or 下面的代码,都能够正确运行,非常奇怪。


/**

  * @brief  以“字”为单位向sdram写入数据 

  * @param  pBuffer: 指向数据的指针 

  * @param  uwWriteAddress: 要写入的SRAM内部地址

  * @param  uwBufferSize: 要写入数据大小

  * @retval None.

  */

void SRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize)

{

  __IO uint32_t write_pointer = (uint32_t)uwWriteAddress;

 

 

  /* 循环写入数据 */

  for (; uwBufferSize != 0; uwBufferSize--) 

  {

    /* 发送数据到SRAM */

    *(uint32_t *) (Bank1_SRAM3_ADDR + write_pointer) = *pBuffer++;

 

    /* 地址自增*/

    write_pointer += 4;

  }

}


这里竟然地址递增了4,应该会跳过8字节,但程序依然正常运行。问题出在这里:

这里感觉很不好理解,简单地分析如下:


对于16位SRAM,FSMC地址线要向右移一位(非常重要)。


以0x6800  0000这个地址为例,它分解成二进制是0110 1000 0000 0000 0000 0000 0000 0000,由于一个BANK是64M的地址空间,而2^25=64M,故0x6800 0000的位[25:0]是FSMC向外部SRAM传递的真实地址,对于0x6800 0000,FSMC向外部SRAM发的地址是位[25:0],即00 0000 0000 0000 0000 0000 0000。


同理,对于0x6800 0002,FSMC向外部SRAM发送的地址是00 00000000 0000 0000 0000 0010。若FSMC不自动右移一位,这个地址明显发错了,因为期望读取的SRAM地址为0x0000 0001中的数据。


为了解决这一问题,当在初始化FSMC时,若选择外部SRAM为16位,则FSMC在向外部SRAM发地址时,会自动右移一位,例如刚才的0x6800 0002,FSMC在向外部发SRAM地址时,00 0000 0000 0000 0000 0000 0010会自动右移一位,变成00 0000 00000000 0000 0000 0001,即0x0000 0001,该地址正好是期望的外部SRAM地址。接着,外部SRAM从地址为0x0000 0001中取出16位数据传送给FSMC,由FSMC将这个16位数据保存在以映射地址0x6800 0002起始的两个8位存储单元中。

地址映射如下:

这样的话,当16位数据宽度时,地址的问题解决了,还有一个问题,是往高字节写入还是低字节写入呢?


这也就是NBL0和NBL1的作用了,如果你要进行字节操作 :

如stm32发送地址0x0001读取一个字节。右移一位对应的是sram地址0x0000处的16位数据, FSMC会根据A0(最后一根地址线)来控制NBL0和NBL1。当A0 = 1时,读取高字节数据(仅NBL1有效);A0 = 0时,读取低字节数据仅NBL0有效),当进行16位读写时,NBL0和NBL1都有效。


**********************************************************************************************************************************************


经过了上面的分析,再来重新观察数据的写入过程:


当地址为0x6800  0000,会访问到SRAM的第0个16位地址,而此时A0 = 0(低字节有效),实际会访问的是16位 0地址的低字节;当地址为0x6800  0001时,A0 = 1,访问16位 0地址的高字节。依次。


因此,想让地址线的最后一位产生0或1,应该在前一位做出改变(stm32会自动右移):

结论:


本工程中使用 FSMC_A16 地址线作为命令/数据选择线 RS 信号,所以在地址范围内,再选择出使得 FSMC_A16 输出高电平的地址,即可控制表示数据,选择出使得FSMC_A16输出低电平的地址,即可控制表示命令。


要使 FSMC_A16 地址线为高电平,实质是访问内部 HADDR 地址的第(16+1)位为1 即可:


使用 0X6000 0000~0X63FF FFFF内的任意地址,作如下运算:

       使 FSMC_A16地址线为高电平:0X6000 0000 |= (1<<(16+1)) = 0x6002 0000

要使 FSMC_A16 地址线为低电平,实质是访问内部 HADDR 地址的第(16+1)位为0 即可:


使用 0X6000 0000~0X63FF FFFF内的任意地址,作如下运算:

       使 FSMC_A16地址线为低电平: 0X6000 0000 &= ~ (1<<(16+1)) = 0x6000 0000


*************************************************************************************************************************************************


根据最终的计算结果,总结如下:当 STM32 访问内部的 0x6002 0000 地址时,FSMC自动输出时序,且使得与液晶屏的数据/命令选择线 RS(即 D/CX)相连的 FSMC_A16 输出高电平,使得液晶屏会把传输过程理解为数据传输;     类似地,当 STM32 访问内部的 0X6000 0000 地址时,FSMC 自动输出时序,且使得与液晶屏的数据/命令选择线 RS(即 D/CX)相连的 FSMC_A16输出低电平,使得液晶屏会把传输过程理解为命令传输。


使用这两个地址发送命令和数据:


关键字:stm32  FSMC 引用地址:stm32专题二十一:FSMC模拟8080时序

上一篇:stm32专题二十一:LCD控制原理
下一篇:stm32专题二十一:FSMC液晶显示和扫描方向

推荐阅读最新更新时间:2024-11-13 10:27

STM32 嵌入式学习入门(0)——C语言基础复习
摘要 主要介绍了嵌入式编程中几个常用,但软件编程中用得不是很多的C语言知识。包括位操作、条件编译、结构体和结构体指针、typedef声明类型、以及extern变量声明、static关键字等内容。 本文并没有将相关C语言知识点介绍地很详细,毕竟这么多知识点要想掌握绝对不是看几篇文档就能掌握的。因此博主建议,如果上述的C语言知识掌握得还不是很好的话,找一本C语言的书好好研究研究。尤其是结构体和结构体指针、还有函数的知识(本文没提到),一定要很熟练。 本文除了简要介绍C语言知识,也结合博主自己的感受简单谈了各个知识点用在了嵌入式编程的什么地方,有不详细和描述不准确的地方欢迎大家留言讨论。 要想学习STM32,C语言的基础
[单片机]
<font color='red'>STM32</font> 嵌入式学习入门(0)——C语言基础复习
一步步写STM32 OS【四】OS基本框架
一、上篇回顾 上一篇文章中,我们完成了两个任务使用PendSV实现了互相切换的功能,下面我们接着其思路往下做。这次我们完成OS基本框架,即实现一个非抢占式(已经调度的进程执行完成,然后根据优先级调度等待的进程)的任务调度系统,至于抢占式的,就留给大家思考了。上次代码中Task_Switch实现了两个任务的切换,代码如下: void Task_Switch() { if(g_OS_Tcb_CurP == &TCB_1) g_OS_Tcb_HighRdyP=&TCB_2; else g_OS_Tcb_HighRdyP=&TCB_1; OSCtxSw(); } 我们把要切换任务指针付给跟_OS_Tcb_HighRdyP
[单片机]
一步步写<font color='red'>STM32</font> OS【四】OS基本框架
基于STM32单片机设计的红外测温仪(带人脸检测)
由于医学发展的需要,在很多情况下,一般的温度计己经满足不了快速而又准确的测温要求,例如:车站、地铁、机场等人口密度较大的地方进行人体温度测量。 当前设计的这款红外非接触式测温仪由测温硬件+上位机软件组合而成,主要用在地铁、车站入口等地方,可以准确识别人脸进行测温,如果有人温度超标会进行语音提示并且保存当前人脸照片。 1、 硬件选型与设计思路 (1). 设备端 主控单片机采用STM32F103C8T6,人体测温功能采用非接触式红外测温模块。 (2). 上位机设计思路 上位机采用Qt5设计,Qt5是一套基于C++语言的跨平台软件库,性能非常强大,目前桌面端很多主流的软件都是采用QT开发。比如: 金山办公旗下的-WPS,字节
[单片机]
基于<font color='red'>STM32</font>单片机设计的红外测温仪(带人脸检测)
Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发
概述 Windows下使用Keil MDK5进行 STM32F401 的开发和编译, 配合ST-LINK工具进行烧录, 使用硬件抽象库HAL. STM32F401硬件环境和连接 略, 与SPL环境相同 STM32F4 硬件抽象库 STM32F4xx_HAL_Driver 直接下载 STM32CubeF4 MCU 固件开发包 前往 https://github.com/STMicroelectronics/STM32CubeF4 点击Code - Download ZIP 文件比较大, 有接近300M, 解压备用 当前版本是v1.26.2. ST硬件抽象库HAL结构说明 STM32CubeF4Drivers 目录结构
[单片机]
STM32驱动AT24CXX系列芯片
AT24Cxx系列EEPROM是由美国Mcrochip公司出品,1-512K位的支持I2C总线数据传送协议的串行CMOS E2PROM,可用电擦除,可编程自定时写周期(包括自动擦除时间不超过10ms,典型时间为5ms)的。串行E2PROM一般具有两种写入方式,一种是字节写入方式,还有另一种页写入方式。允许在一个写周期内同时对1个字节到一页的若干字节的编程写入,1页的大小取决于芯片内页寄存器的大小。其中,AT24C01具有8字节数据的页面写能力,AT24C02/04/08/16具有16字节数据的页面写能力,AT24C32/64具有32字节数据的页面写能力 AT24CXX的驱动是基于IIC的,在基本的IIC上加入了一些通讯协议,具体如
[单片机]
<font color='red'>STM32</font>驱动AT24CXX系列芯片
STM32开发 -- Git的详细使用
在GPS部分有用到DMA,接下来看一下它的使用。 一、DMA简介 直接存储器存取(DMA) 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。 两个DMA控制器有12个通道(DMA1有7个通道, DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。 二、DMA主要特性 ● 12个独立的可配置的通道(请求): DMA1有7个通道, DMA2有5个通道 ● 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。 ● 在同一
[单片机]
<font color='red'>STM32</font>开发 -- Git的详细使用
STM32端口复用和端口重映射?什么是端口复用重映射?
对于单片机而言,GPIO引脚配置是最基本的,也是最重要的,因为所有的(信号)输入和(控制)输出都是通过这些配置起作用的。这里就不得不提到单片机的复用功能AF(Alternate Function),这篇文章我们说一说复用功能。 STM32Fxx系列单片机的GPIO可以配置为浮空输入(input floating)、上拉输入(input pull-up)、下拉输入(input pull-down)、模拟输入(analog)、开漏输出(output open-drain)、推挽输出(ouput push-pull)、复用开漏输出(alternate function open-drain)、复用推挽输出(alternate fun
[单片机]
<font color='red'>STM32</font>端口复用和端口重映射?什么是端口复用重映射?
意法半导体量产STM32 F0系列入门级MCU
意法半导体(ST)5月15日在北京媒体沟通会上宣布,开始量产基于ARM Cortex-M0处理器内核的入门级STM32 F0系列32位MCU。其适于工业控制器、家庭自动化、打印机和白色家电等应用。   STM32 F0的主要特性包括:①工作频率48MHz时,性能为38DMIPS,独立第三方评测机构的CoreMark评分为68;24MHz时,22DMIPS,CoreMark39。11项外设映射在5通道的DMA,结合总线矩阵,使闪存中执行代码与DMA数据传输同步操作。   ②四个低功耗模式包括5.3μA停止模式,实时时钟运行的2.8μA待机模式,电池供电模式下且实时时钟运行时0.4μA。1.8V/2-3.6V电源电压。功耗效率如图
[模拟电子]
意法半导体量产<font color='red'>STM32</font> F0系列入门级MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved