历史上的今天
返回首页

历史上的今天

今天是:2024年10月27日(星期日)

正在发生

2021年10月27日 | stm32专题二十一:FSMC模拟8080时序

2021-10-27 来源:eefocus

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输出低电平,使得液晶屏会把传输过程理解为命令传输。


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


推荐阅读

史海拾趣

Babcock Inc公司的发展小趣事

Babcock深知技术创新是公司发展的核心动力。因此,公司始终保持着对技术研发的持续投入。通过不断引进先进设备、优化研发流程、加强团队建设等措施,Babcock的技术实力得到了不断提升。同时,公司还注重与高校和研究机构的合作,共同推动电子技术的创新发展。

Cyrustek公司的发展小趣事

在Cyrustek公司的发展过程中,人才一直是其最重要的资产。Cyrustek注重人才的培养和引进,建立了一支高素质、专业化的技术团队。这些人才不仅具备丰富的行业经验和专业知识,还具备创新精神和团队协作能力。在Cyrustek公司的发展过程中,这些人才发挥了至关重要的作用,推动了公司的不断发展和壮大。

Essentra Components公司的发展小趣事

面对日益激烈的市场竞争,Essentra Components公司决定实施全球化战略,以拓展更广阔的市场。公司先后在亚洲、欧洲、美洲等多个地区设立了生产基地和销售服务点,实现了产品的全球覆盖。同时,公司还积极与当地企业合作,共同开发适合当地市场需求的产品,进一步巩固了其在全球市场的地位。

Hitano Enterprise Corp公司的发展小趣事

随着环保意识的不断提高,Essentra Components公司积极响应绿色发展的号召,将环保理念融入到产品的设计和生产过程中。公司采用环保材料替代传统材料,减少了对环境的污染;同时,公司还引进了先进的节能减排技术,降低了生产过程中的能耗和排放。这些措施不仅提高了产品的环保性能,还为公司赢得了更多的社会赞誉和市场份额。

长江连接器(CJT)公司的发展小趣事

长江连接器(CJT)公司自创立之初,就致力于电子连接器的研发、生产和销售。公司凭借对连接器技术的深入研究和理解,不断积累技术经验,逐渐在连接器领域建立了自己的技术壁垒。在初创阶段,长江连接器就注重产品质量和技术创新,通过引进先进的生产设备和技术人才,不断提高产品的性能和可靠性。

High Energy Corp公司的发展小趣事

为了进一步拓展市场和提升竞争力,长江连接器开始实施全球化战略。公司积极在海外设立生产基地和研发中心,加强与国际知名企业的合作和交流。通过引进国际先进的生产技术和管理经验,长江连接器不断提升自身的生产能力和管理水平。同时,公司还积极参与国际竞争和合作,与全球各地的客户建立了长期稳定的合作关系。

问答坊 | AI 解惑

我的ucos终于在51上跑起来了(附加代码和强人心得)

转自周立功论坛 小弟学ucos有一段时间了,总想找个移植的案例跑起来试试 前不久将网络上的一篇“小siae的uCOS2C51”下载下来,放到我的STC89C52RC中,发现跑不起来,郁闷了.... 后来在网上找了一个很好的关于uCOS2C51的移植总结,比较着调 ...…

查看全部问答>

基于SOPC的PCI数据采集卡的设计与实现

基于SOPC的PCI数据采集卡的设计与实现…

查看全部问答>

RFID入门经典培训教材

别处看到的资料,新手了解很不错的…

查看全部问答>

4.3寸屏不能显示完整文字

最近在开发测试TFT LCD屏. 刚开始用3.5寸的320*240编译了CE系统.文字可以显示完整. 之后改用4.3寸的480*272分辨率(16:9)编译CE系统.显示的文字例如回收站这几个字只能显示横的.竖的显示不出来. 直接换成3.5寸的屏又可以显示.用PB截图也是显示完 ...…

查看全部问答>

关于西门子plc的问题

请问各位老师们,学习西门子plc应该遵寻怎样一个过程,先学啥后学啥,请老师指点,我对这个学习的先后顺序很迷茫,不知道如何下手?…

查看全部问答>

高分2440SDRAM时钟配置问题

我的SDRAM时钟,按我的意思是配置到100M,但实际只配到了4M左右,单步调试发现int.s中分频已经正确,但在MAIN.C函数,倍频时,时钟并没有起来                 ChangeUPllValue(56,2,2);    // ...…

查看全部问答>

做手写板软件。。。

请问有人做过手写板软件吗? 我想做个手写板的软件,通过手写板输入,最好可以检测压力,如果买市面上的手写板,好像很难通过这些成品做出软件来。 请问有有过同样想法的人吗?我要买什么好呢? 请各位指教~~…

查看全部问答>

串口通信两端都是RS232可以吗

想做一个带console口的硬件系统,通过PC机对其进行控制。看到交换机一般都是用RJ45做console口。对硬件不太懂,问点外行问题: 可不可以我的console口也是个和PC机一样的串口(RS232)啊?有两边都是RS232的console线吗? 如果不行,做成RJ45口的 ...…

查看全部问答>

直流电机励磁电压,励磁电流的问题?

直流电机励磁电压,励磁电流的问题,求助 我们现场有一台直流电机,平头机刀盘用。励磁电压180V,励磁电流6.67A。用西门子6RA28带动。装置电流125A,励磁最大电流10A。开始安装的时候励磁没有放变压器,励磁回路直接给220V。现在现场说带电机的时 ...…

查看全部问答>

示波器utd2025c使用说明

本帖最后由 paulhyde 于 2014-9-15 08:53 编辑 我想要示波器utd2025c使用说明书  谁有的 上传一下  谢谢  …

查看全部问答>