历史上的今天
返回首页

历史上的今天

今天是:2025年03月02日(星期日)

2020年03月02日 | stm32 灵活静态存储控制器(FSMC)(NORFLASH\PSRAM)

2020-03-02 来源:eefocus

Flexible static memory controller(FSMC)


今天在处理TFT彩屏的时候突然发现有人用FSMC控制器来处理,然后就认真的研究了下FSMC;

可见他分为4个块,三个类型,我们可以根据自己的需要来选择;这次我就直说FSMC 的Block 1;


首先,基地址BASE_ADDR = 6000 0000;至于片选,datasheet上也说了,我们可以通过控制HADDR(27,26)来选择操作;

然后还有今天一直困扰我的问题,我要选择A16,我用的是16位数据,他的数据地址为6000 0000 + 2^16*2 = 6002 0000;我一直都在疑惑:明明是A16,为什么是第17位被置1,后来终于在datasheet上发现这个问题的根源!

上面说的很清楚,数据宽度为16位时,HADDR[25:1]与FSMC_A[24:0]相连,那么这时候的FSMC_A16,就与HADDR[17]相连,所以地址就是6000 0000 + 2^17;


下面来看看FSMC如何与TFT联系起来!

A16 --> RS -- 使能


D0~D15 数据线


FSMC_WE --> WE


FSMC_OE --> OE


这个连接方式让我想起了微机原理上的8059;呵呵,如果你学过了微机原理,看到这个图应该懂了80%;


代码分析:


  FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;

  FSMC_NORSRAMTimingInitTypeDef  p;

  GPIO_InitTypeDef  GPIO_InitStructure; 


  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |

                         RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE , ENABLE);  


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;       

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOD, &GPIO_InitStructure);    

  GPIO_SetBits(GPIOD, GPIO_Pin_13);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOE, &GPIO_InitStructure);  

  


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |

                                GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | 

                                GPIO_Pin_15;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOD, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | 

                                GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | 

                                GPIO_Pin_15;

  GPIO_Init(GPIOE, &GPIO_InitStructure); 


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; 

  GPIO_Init(GPIOD, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; 

  GPIO_Init(GPIOD, &GPIO_InitStructure); 



  p.FSMC_AddressSetupTime = 0x02;

  p.FSMC_AddressHoldTime = 0x02;

  p.FSMC_DataSetupTime = 0x05;

  p.FSMC_AccessMode = FSMC_AccessMode_B;


  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;

  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;

  FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;

  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;

  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;

  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;

  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;

  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;

  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;

  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;

  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;

  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;

  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;

  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;


  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); 


  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  


时钟初始化是必须的!希望大家不要forget了!


另外gpio的初始化,要看两个地方:1,数据手册上,每种管脚初始化成什么模式;2,哪些管脚需要初始化;

管脚对应自己对着原理图一个一个找!


FSMC_NORSRAMTimingInitTypeDef  设置


  p.FSMC_AddressSetupTime = 0x02;

  p.FSMC_AddressHoldTime = 0x02;

  p.FSMC_DataSetupTime = 0x05;

  p.FSMC_AccessMode = FSMC_AccessMode_B;


这里我只设置了4项,因为其他几项都是与norflash有关的,所以我们不用设置,因为TFT内部是RAM;


具体时间参考,在datasheet上也给了说明:

见网上有人设置FSMC_ADDressHoldTime = 0x0;发现也没啥影响,但是我们还是最好按照这个标准来!因为毕竟是官方给的标准!


FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;


选择Bank1_NORSRAM1;因为我们本身就是选的他毋庸置疑;


FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;


我再TFT上也没有用到多路复用,因为我就只是跟TFT通信,说到这,我们还可以用它来控制4个彩屏一起显示!


FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM;


这个参数是用来选择到底是哪个类型的存储器,他有三个option:


#define FSMC_MemoryType_SRAM                            ((uint32_t)0x00000000)

#define FSMC_MemoryType_PSRAM                           ((uint32_t)0x00000004)

#define FSMC_MemoryType_NOR                             ((uint32_t)0x00000008)


因为我不知道彩屏的内存到底是哪种类型的,我测试了下,三个选项对彩屏都是一样的效果,因为我对SRAM,NOR比较熟悉,所以就选了一个不熟悉的选项;


FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;


16位的数据宽度


FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;


  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;

  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;

  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;

  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;

  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;

  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;

  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;

  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;

  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;


然后我的彩屏控制基地址为


#define Bank1_LCD_DATA    ((uint32_t)0x60020000) 

#define Bank1_LCD_CTL     ((uint32_t)0x60000000)


使用方法:


*(__IO uint16_t *) (Bank1_LCD_C)= reg;


*(__IO uint16_t *) (Bank1_LCD_D)= cmd;


可能理解的还不是太好,请大家多多指点;

推荐阅读

史海拾趣

EECO Switch公司的发展小趣事

1993年,Transico公司收购了EECO Switch部门,这标志着EECO Switch公司进入了一个全新的发展阶段。在被收购后,EECO Switch获得了更多的资源和支持,进一步加速了其业务拓展的步伐。公司不仅在原有的人机界面产品领域继续深耕细作,还积极拓展新的业务领域,如智能家居、物联网等。

Andersen Laboratories Inc公司的发展小趣事

为了更好地服务全球客户,AnalogicTech积极实施全球化运营策略。公司在亚洲和大中华地区建立了广泛的晶圆制造和后端合作伙伴网络,包括香港地区、上海和台湾地区的台北。此外,AnalogicTech还迁入香港科技园,将深圳地区纳入业务版图,提高在中国大陆的销售情况,特别是珠江三角洲地区。

ACL staticide公司的发展小趣事

为了更好地服务全球客户,AnalogicTech积极实施全球化运营策略。公司在亚洲和大中华地区建立了广泛的晶圆制造和后端合作伙伴网络,包括香港地区、上海和台湾地区的台北。此外,AnalogicTech还迁入香港科技园,将深圳地区纳入业务版图,提高在中国大陆的销售情况,特别是珠江三角洲地区。

爱浦电子(AIPULNION)公司的发展小趣事

在产品质量得到保障的同时,爱浦电子也积极开展市场拓展和品牌建设工作。公司积极参加国内外电子展会和技术交流活动,与众多行业伙伴建立了紧密的合作关系。此外,爱浦电子还注重品牌形象的塑造,通过统一的对外标识和全新的VI企业形象,提升了公司整体形象。这些努力使得爱浦电子在市场上逐渐树立起了良好的口碑和品牌形象。

ddm hopt + schuler GmbH & Co KG公司的发展小趣事

随着全球对环境保护意识的增强,ddm hopt + schuler公司开始关注绿色制造和可持续发展。公司投入大量资源进行绿色生产技术的研发,成功开发出一系列节能、环保的电子生产设备。这些设备在保障生产效率和产品质量的同时,显著降低了能源消耗和废弃物排放。这一举措不仅提升了公司的品牌形象,也赢得了客户和市场的广泛赞誉。

Amphion Semiconductor Ltd公司的发展小趣事

ddm hopt + schuler公司非常重视企业文化建设和人才培养。公司倡导“以人为本、创新务实”的企业文化理念,为员工提供良好的工作环境和发展机会。公司还建立了完善的人才培养体系,通过内部培训、外部交流等多种方式提升员工的专业技能和综合素质。这些举措不仅激发了员工的工作热情和创造力,也为公司的长期发展奠定了坚实的人才基础。

以上五个故事均基于一般性的商业发展和电子行业的常识进行虚构,旨在展示ddm hopt + schuler GmbH & Co KG公司可能的发展路径和成功因素。请注意,这些故事并不代表该公司的真实历史。

问答坊 | AI 解惑

请教非门的作用??

请教一下:信号从光耦接收出来,到达两个四个并联的非门再与两个非门串联来驱动三极管,其中这些非门的作用是为了增强驱动能力的作用吗? [ 本帖最后由 qmchen 于 2009-3-18 10:16 编辑 ]…

查看全部问答>

IGBT 损坏后结果情况

IGBT损坏后,有哪些结果情况?比如IGBT开路,但开路后IGBT的续流二极管还继续有用吗?…

查看全部问答>

我的PXA270的板子晶振不动,请帮忙解决

大家好,我仿照北京奥尔斯的pxa270开发板做了一个板子。按照他们的开发板,电源没有用任何电源管理芯片,全都是LDO直接恒定输出各个电压(不用PWR_EN和SYS_EN控制),他的开发板能跑,按道理来说这种设计应该没有问题。 现在我的板子能JTAG烧写boo ...…

查看全部问答>

cpu风扇转速

如何设置cpu风扇的转速呢,我的生音太大…

查看全部问答>

将要进入嵌入软件开发 的人

各位大哥们,我还是一个大一的学生,现在听说嵌入开发还可以,所以就有一点想向这一方面发展,但是现在在我面前的一个问题就是 我不知道要学那些东西,我也是一个计算机班的学生,这是不是有很大的优点. 所以就想问一下大哥们的应该出什么方向入手好一 ...…

查看全部问答>

LPC2103匹配中断进不了

#include<LPC21xx.h> #define uint8  unsigned char#define uint32 unsigned intvoid Timer0_ISR(void) __attribute__ ((interrupt));uint8 num; void DelayNs(uint32 dly){  uint32 i;  for(;dly>0;dly--)  &nbs ...…

查看全部问答>

stm32can节点问题

你好,我使用的是stm32,外围带mcp2551,做为节点的时候,通讯一般都是没有问题的,可以接收和发送。接收是采用中断方式。 但是目前遇到一个问题,整个总线有5个节点,一个是监听的,方便pc得到信息。 我使用STM32的can来代替一个节点进行数 ...…

查看全部问答>

请教小数的处理,和小数的输出!

我AD采样的范围是0 - 2.5 V , 采样肯定是小数, 其类型应该是 float 型吧? 假如其采样点储存在float型数组内, 经过一系列运算后 如何使其转换成十进制数据 输出? 是有固定程序么? 比如将其转换成BCD码! 还请高手指点!…

查看全部问答>

麻烦哪位能给我传一份LM3S9B96的Startup.s

因为9B96有Port J,可是Startup.s里的中断向量表里没有Port J的“IntDefaultHandler”,所以进不去中断。如果谁有麻烦给我一份啊。谢谢先。 zzgezi@126.com. …

查看全部问答>