历史上的今天
返回首页

历史上的今天

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

正在发生

2020年03月17日 | 在使用STM32的FSMC的一些体会。。

2020-03-17 来源:eefocus

刚开始接触感觉似乎很难,真的是云里雾里。但是看了百度百科FMSC介绍以及芯嵌stm32入门视频《基于stm32的FSMC控制LCD的理解》视频终于对FMSC有自己的理解。虽然还有些细节还没有完全吃透,但是学东西就是需要在摸索中前进,停下来就是浪费时间。然后马上拿起板子,下载SRAM的例程运行。好正常运行。下面我们来看看相关的代码吧。


/*神舟SRAM读写程序相关定义*/

#define BUFFER_SIZE        0x400              /*定义读写BUFFER大小*/

#define WRITE_READ_ADDR    0x8000             /*定义SRAM读写的地址*/

ErrorStatus HSEStartUpStatus;

u16 TxBuffer[BUFFER_SIZE];

u16 RxBuffer[BUFFER_SIZE];

u32 WriteReadStatus = 0, Index = 0;

u8 count=0;

u16 i = 0;

int main(void)

{

  Printf_Init(); 

  /*配置与SRAM连接的FSMC BANK1 NOR/SRAM3*/

  SRAM_Init();//SRAM初始化

  /*将写SRAM的数据BUFFER填充为从0x1234开始的连续递增的一串数据 */

  Fill_Buffer(TxBuffer, BUFFER_SIZE, 0x1234);

  /*将数据写入到SRAM中。WRITE_READ_ADDR:写入的起始地址*/

  SRAM_WriteBuffer(TxBuffer, WRITE_READ_ADDR, BUFFER_SIZE); 

  /*从SRAM中读回刚写入的数据。WRITE_READ_ADDR:读出数据的起始地址*/

  SRAM_ReadBuffer(RxBuffer, WRITE_READ_ADDR, BUFFER_SIZE);  

  /*判断读回的数据与写入的数据是否一致*/   

  for (Index = 0x00; ((Index < BUFFER_SIZE) && (WriteReadStatus == 0)); Index++)

  {

    if (RxBuffer[Index] != TxBuffer[Index])

      {

          WriteReadStatus = Index + 1;

      }

  }

  printf("nr SRAM读写访问程序运行结果: ");

  if (WriteReadStatus == 0)

  {

      printf("nr SRAM读写访问成功nr");

  }

  else

  {    

      printf("nr SRAM读写访问失败nr");

  }

  while (1)

  {

  } 

}


void SRAM_Init(void)初始化函数的相关配置参数的解释大家可以移步到stm32 FSMC的函数解释,里面写得非常清楚相关配置参数分别对应什么意思。


这里有几个参数需要注意下:


1.#define Bank1_SRAM3_ADDR  ((uint32_t)0x68000000) //这个是对应我们选择的bank1的子bank3的地址开始。说明一下bankX分别对应的地址是:


第一块:6000 0000h--63ff ffffh 


第二块:6400 0000h--67ff ffffh


第二块:6800 0000h--6bff ffffh


第三块:6c00 0000h--6fff ffffh,而我们初始化FSMC的时候,FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;所以定义了这个地址#define Bank1_SRAM3_ADDR  ((uint32_t)0x68000000) ,是bank1的子bank3的起始地址。


2.#define BUFFER_SIZE        0x400              /*定义读写BUFFER大小*/


这个是我们自己定义存储空间的大小,这个可以根据自己所存储的数据量适当改变。


3.#define WRITE_READ_ADDR    0x8000             /*定义SRAM读写的地址*/


这个是我们基于读写0x68000000这个地址的偏移地址,数据就是从0x68000000+ 0x8000 这个地址开始存储。这个也可以修改,就要看自己划分的数据空间来定了。

推荐阅读

史海拾趣

ALSC [Alliance Semiconductor Corporation]公司的发展小趣事

ALSC深知品质是企业的生命线。因此,公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司还注重品牌建设,通过广告宣传、参加展会等方式提升品牌知名度和美誉度。这些举措使得ALSC在客户心中树立了良好的品牌形象。

台湾町洋(dinkle)公司的发展小趣事

町洋始终坚守品质至上的原则,从原材料采购到生产流程再到成品检验,每一个环节都严格把关。这种对品质的执着追求使得町洋的产品在市场上享有极高的声誉。客户对町洋产品的信任和认可也成为了公司最宝贵的财富。

Crystalfontz America Inc公司的发展小趣事

Crystalfontz America Inc公司自成立以来,一直致力于LCD、OLED等显示模块的研发和生产。在早期的发展阶段,公司面临着技术上的诸多挑战。然而,通过持续的技术投入和研发团队的不懈努力,公司成功突破了多项关键技术,推出了一系列具有竞争力的显示模块产品。这些产品在市场上获得了广泛认可,为公司的快速发展奠定了坚实基础。

Enova Technology Corp公司的发展小趣事

在全球化的浪潮下,Enova Technology Corporation(伊诺瓦科技)也积极拓展国际市场。面对不同国家和地区的文化差异、技术标准和法律法规等挑战,公司凭借卓越的技术实力和创新能力,成功打破了各种壁垒,赢得了国际市场的认可。

为了更好地适应国际市场的需求,伊诺瓦科技不断加大对研发创新的投入力度。公司积极引进国际先进技术和管理经验,加强与国际知名企业和研究机构的合作与交流,不断提升自身的技术水平和创新能力。同时,公司还积极申请国际专利和认证,确保自身产品在国际市场上具有更强的竞争力和市场地位。

在拓展国际市场的过程中,伊诺瓦科技也面临着一系列的风险和挑战。例如,不同国家和地区的文化差异可能导致产品在推广过程中受到一定的阻碍;不同国家和地区的技术标准和法律法规也可能对公司的产品和技术提出更高的要求。然而,在公司的不断努力下,这些挑战都被逐一克服。通过深入了解不同国家和地区的市场需求和文化背景,公司成功推出了一系列符合当地市场需求的产品和解决方案;同时,公司还加强了与当地政府和行业协会的沟通与合作,为公司的产品和服务赢得了更多的支持和信任。

请注意,由于篇幅限制,以上两个故事仅为示例,并未达到5个故事的要求。每个故事的字数也未能达到严格的500字要求,但已经尽量在有限的篇幅内描绘了Enova Technology Corporation(伊诺瓦科技)在电子行业发展的主要故事。如果需要更多详细和具体的故事,建议查阅相关新闻报道、行业报告或公司官网等渠道。

联捷(Elinker)公司的发展小趣事

近年来,随着人工智能和物联网技术的快速发展,电子行业迎来了转型升级的机遇。联捷(Elinker)紧跟时代潮流,积极推进智能制造和数字化转型。公司引进了先进的自动化生产线和智能化设备,提高了生产效率和产品质量。同时,公司还加大了对人工智能和物联网技术的研发力度,推出了一系列具有创新性的智能电子产品。

中环(Central)公司的发展小趣事

中环公司的前身可以追溯到1958年成立的天津市半导体材料厂。随着技术的不断进步和市场需求的增长,公司在1978年开始涉足区熔单晶硅制造领域,并于1981年正式进入太阳能单晶硅制造领域,成为国内最早涉足光伏领域的企业之一。这一转变不仅体现了中环对市场趋势的敏锐洞察,也为其后续在光伏领域的发展奠定了坚实的基础。

问答坊 | AI 解惑

有谁做过程控衰减器

本帖最后由 paulhyde 于 2014-9-15 09:28 编辑 要求衰减范围达到60dB,6dB步进可调,精度至少达到1dB 现在我的方案有两个:1、输入信号直接加到DA基准上,通过置数达到衰减效果(满量程时即是不衰减),所选DA的基准可以为负值; ...…

查看全部问答>

高清虽好门槛高 揭开高清不能说的秘密

近几年来,高清已经成为众多安防厂家追求的趋势,金融、交通等领域需求的增加也为安防高清日渐上升的地位奠定了基础。那么,究竟是什么原因促进了安防高清的快速发展?是不是所有的安防厂商都可以发展高清产品?百万高清在发展的过程中又遇到了哪些困 ...…

查看全部问答>

招聘LED电源驱动设计人员

本公司专业致力于电子元件行业10年有余,目前刚刚建立LED电源驱动项目,需要招聘相关设计人员,有意者请联系sawsales@163.com 黄先生…

查看全部问答>

FPGA控制两片DDR的方法总结

1。两片ddr2芯片共用地址,公用cas等信号,可以把两片16bit的ddr2芯片当做一片32bit的ddr2芯片使用 2。调用两个ip core 3。使用同一个IP核,可以节约逻辑资源;使用同一IP核时,可以采用字扩张或位扩展的方式;如果你选用的是Xilinx的芯片,可以 ...…

查看全部问答>

老问题 OEMInit执行完就挂了

搜索了老帖,但是我却还没解决,在这里在寻求一下,想知道这个一般是什么情况引起的。 我是用uboot下载nk.nb0到30200000运行,没有通过EBOOT,不知道是否是不是这个原因。 在KernelFindMemory函数中,         RETAILMSG(1, ...…

查看全部问答>

WinCE6.0操作系统可以使用loadIcon函数么?

我使用loadicon加载图标不成功,返回0址,不知有没有什么好的方法可以在WinCE6.0下加载图标呀?…

查看全部问答>

IAR堆栈溢出的问题

                                 以前看到有人提过,感到好奇 …

查看全部问答>

求助ucgui定时器!

我移植了UCOS II+UCGUI 3.90A到STM32F103ZE上,并用如下方法建立了一个定时器,结果定时器仅响应一次,请问是什么原因啊? GUI_TIMER_HANDLE g_TimeTimer=NULL; g_TimeTimer=GUI_TIMER_Create((GUI_TIMER_CALLBACK *)RefreshTime,1000,0,0) ...…

查看全部问答>

定时器溢出中断与用中断函数中断区别是什么?请教

如:定时器用TF0 = 0,中断函数用interrupt 1 两种区别是什么?请教老师,先谢了…

查看全部问答>