STM32如何通过FSMC点亮LCD

发布者:EnchantedHeart最新更新时间:2023-07-21 来源: elecfans关键字:STM32  FSMC 手机看文章 扫描二维码
随时随地手机看文章

FSMC是Flexible static memory controller(可变静态存储控制器)的简称,是STM32系列采用的一种新型的存储器扩展技术,支持SRAM、Nor Flash、LCD、PSRAM、NAND Flash、PC Card等。只在某些芯片上有,使用前要查看对应的手册确定。


在FSMC的角度来看,外部存储分成了4个固定的大小为256MB的bank。

pYYBAGQbsyeALt0FAADB_IK47Us138.jpg

Bank1分成了4个子bank,每一个64MB大小,并且每个bank都有独立的片选,用来控制Nor Flash、RAM、PSRAM。Bank2和Bank3用来控制NAND Flash。Bank4控制PC Card。


不同的Bank共享了地址、数据、读、写信号,其他信号根据bank的用途不同会有一些差别。

pYYBAGQbsyiAGyDKAABGVE_gg2U739.jpg

下面介绍下如何通过FSMC点亮LCD。LCD可以看作是一个SRAM,通过Bank1控制。理论上支持8080接口的LCD都可以使用FSMC来点亮(不知是否有例外)。LCD有8位或16位接口的,FSMC的设置需要一致,本文以16位为例。


STM32的设置使用cubeMX很方便,下面是针对FSMC的设置,其他基础设置这里就不罗列了。

poYBAGQbsymAV1oDAAG_xbnM61k692.jpg

这里使用了bank1的第四个子bank,片选是NE4;

内存类型是LCD接口;

LCD寄存器选择为A0,其他A1-A24都可以,这本来是存储器寻址信号,这里用来接LCD的RS信号,控制LCD是写命令(低0)还是写数据(高1)。;

数据选择16位。


再往下

写操作使能;

扩展模式Disabled;

地址建立时间设置为6;

数据建立时间设置为6;

总线翻转时间设置为0.

上面建立时间范围如下表所示,实际要根据LCD的时序确定。

poYBAGQbsyqANpN1AAG8n4G7s4c892.jpg

除了上面的配置,别忘了一般LCD还有个背光控制引脚。

pYYBAGQbsyuAWK0mAAAarHjrZ-E294.jpg

之后生成代码。(只罗列了变量和函数内容,不是真正的函数)

背光引脚代码如下:

poYBAGQbsy2AVjKEAAHLHXBr2dY483.jpg

FSMC的初始化代码如下:

FSMC的引脚配置

pYYBAGQbsy-AdO4cAAIoVVKqGcw275.jpg

FSMC模式和时序配置:

pYYBAGQbszGAKNHfAAJQf3B5r_g171.jpg

到此,FSMC的初始化就搞定了,后边就可以通过内存地址直接控制LCD了。这里有几个需要注意的点,下面来详细说说。

第一, 存储基地址

bank1的基地址是0x60000000,不同的子bank地址不同,通过HADDR[27:26]这两位的值确定。我们选择了第四个,这两位是11,所以子bank的基地址是

0x60000000+(0x3<<26)=0x6c000000。

poYBAGQbszOAYBVmAACWOmFuhXk160.jpg

第二, 外部存储地址

HADDR[25:0]存储了外部存储器的地址,对于8位和16位略有差别。

pYYBAGQbszSALu5vAAAavL2HumE336.jpg

8位用到了HADDR[25:0]的所有位,对映FSMC_A[25:0]。而16位只用了HADDR[25:1],没有用HADDR0,所以对于16位,HADDR[25:1]就对映了FSMC_A[24:0]。

pYYBAGQbszWAbnv2AAC81il_JTM837.jpg

第三, LCD的数据or命令选择

LCD没有地址,我们引出的地址线实际上接到了LCD的RS或者叫D/C引脚上。当RS为低,则通过D[15:0]的是命令,当RS为高,则通过D[15:0]的是数据。上面我们选择了A0,在16位模式下,写命令的地址就是0x6c000000(HADDR1为0),写数据的地址就是0x6c000002(HADDR1为1)

(其实地址不唯一,只要保证HADDR1的0和1准确就行,其他地址位随意,但是一般选择最简单或实用的地址,后边会提到)。

pYYBAGQbszaAPt73AACjAfu5ZAQ101.jpg

我们再假设选择A3,那么写命令的地址还是0x6c000000(HADDR4为0),写数据的地址是0x6c000010(HADDR4为1)。所以结论就是,写命令的地址可以都是0x6c000000,写数据的地址根据选择的地址线确定。这是最简单的地址。

pYYBAGQbszaAXM9rAADrhh7RyYU120.jpg

第四, 巧用结构体,只需定义一个地址

在很多参考例程中,会出现下面的实现方法:

pYYBAGQbszeAKcvZAAB9YNtN71o340.jpg

我们都知道结构体是顺序排列的,所以LCD_REG的地址是0x6c000000,变量大小是2个字节(16位),所以LCD_RAM的地址就是0x6c000002,刚好就是我们选择A0地址线(HADDR1)拉高的值。

那如果选择其他地址线,这里就需要做一点变动。比如选择A3,我们逆向操作来解决这个问题,A3写数据地址是0x6c000010,也就是LCD_RAM的地址。LCD_REG比LCD_RAM小两个字节,减2就得到了0x6c00000e,此时HADDR4为0,那这个就是我们需要的LCD基地址,因为只有这个值加2后会变成写数据的地址,这就是那个实用的地址。

poYBAGQbsziATdmqAAB4Dg8Xu7w197.jpg

操作框图如下图所示,FSMC初始化好后就跟透明的一样,只需要往指定的地址送命令或者数据即可。类似串口蓝牙的透传,一旦设置配对好,就可以无视蓝牙的存在。

poYBAGQbszmAG-uqAADLTESdCI8539.jpg

后面的事情就跟具体的LCD有关了,比如读取ID,写初始化序列等,这里就不多介绍了。


关键字:STM32  FSMC 引用地址:STM32如何通过FSMC点亮LCD

上一篇:基于STM32设计的酒精检测仪
下一篇:STM32的GPIO在实际开发设计的使用配置和技巧

推荐阅读最新更新时间:2024-11-12 15:42

STM32 TImer几种模式
输入捕获模式 库函数例程位置: STM32F10x_StdPeriph_Lib_V3.3.0ProjectSTM32F10x_StdPeriph_ExamplesTIMInputCapture 在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当捕获事件发生时,相应的CCxIF标志(TIMx_SR寄存器)被置’1’,如果使能了中断或者DMA操作,则将产生中断或者DMA操作。 在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。 PWM输入模式 库函数例程位置 :STM32F10x_StdPeriph_Lib_V3.3.0ProjectSTM32
[单片机]
stm32 通用定时器中断
void TIM_DeInit(TIM_TypeDef* TIMx) // 用初始化参数初始化定时器的寄存器 TIMx: where x can be 1 to 17 to select the TIM peripheral. TIM Output Compare Init structure definition void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) void TIM_OC1NPola
[单片机]
GPIO资源总结
STM32Fx系列 GPIO基本结构 保护二极管:IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。 P-MOS管和N-MOS管:由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输出”和“开漏输出”的模式。这里的电路会在下面很详细地分析到。 TTL肖特基触发器:信号经过触发器后,模拟信号转化为0和1的数字信号。但是,当GPIO引脚作为ADC采集电压的输入通道时,用其“
[单片机]
GPIO资源总结
STM32 软件模拟SPI时序驱动NRF24L01
其实stm32本身的硬件SPI也很好用,但是还是想用软件来模拟一下PSI的时序。 SPI 是一种高速的,全双工,同步串行的通信总线。SPI通信方式相当于是一个环形结构,由CSN、MISO、MOSI、SCLK四线组成,主要是在SCLK时钟线的驱动下,进行数据转换。 接下来直接上程序配置: 使用32模拟SPI时序的IO口配置,应该注意的是MISO应该选择模拟输入方式GPIO_Mode_IN_FLOATING。 以下是我的初始化部分: /*用于软件模拟SPI IO口宏定义区*/#define SPI_CS_PORT GPIOB#define SPI_CS_PIN GPIO_Pin_11#define SPI_CS_LOW
[单片机]
<font color='red'>STM32</font> 软件模拟SPI时序驱动NRF24L01
STM32单片机的复用端口初始化的步骤及方法
STM32有好几个串口。比如说STM32F103ZET6有5个串口,串口1的引脚对应的IO为PA9,PA10.PA9,PA10默认功能是GPIO,所以当PA9,PA10引脚作为串口1的TX,RX引脚使用的时候,那就是端口复用。 复用端口初始化有几个步骤: 1) GPIO端口时钟使能。要使用到端口复用,当然要使能端口的时钟了。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 2) 复用的外设时钟使能。比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
[单片机]
<font color='red'>STM32</font>单片机的复用端口初始化的步骤及方法
STM32的SYS_TICK配置
1、SYS_TICK不属于外设,是内核的一部分,RM0008里面没有关于它的说明。 2、这是一个24位计数器,能够产生内部中断。 3、它的中断不需要配置NVIC属性,就能产生中断。 4、如果需要配置8分频,需要在SysTick_Config()配置之后才能进行配置。
[单片机]
<font color='red'>STM32</font>的SYS_TICK配置
STM32基础之串口通信
串口通讯协议简介: 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。 串行通信的分类 1、按照数据传送方向,分为: **单工:**
[单片机]
<font color='red'>STM32</font>基础之串口通信
STM32的GPIO口使用
STM32的GPIO类似于51单片机的IO口。只不过STM32的IO口使用时要配置输入/输出模式、速度、而且时钟使能后才能使用。 配置相关代码: GPIO_InitTypeDef GPIO_InitStructure;//定义初始化类型结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开GPIOA时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//引脚 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度 GPIO_InitStructure.GPIO_M
[单片机]
<font color='red'>STM32</font>的GPIO口使用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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