历史上的今天
返回首页

历史上的今天

今天是:2025年04月18日(星期五)

正在发生

2018年04月18日 | STM32通过FSMC读写CPLD

2018-04-18 来源:eefocus

STM32通过FSMC读写CPLD的程序,CPLD挂在STM32的地址线和数据线上,将CPLD看做片外RAM的方式来进行读写,在我做的板子上CPLD挂在第四个区,因此基地址是0x6c000000,通过FSMC来进行读写,程序较为简单,具体的地方在函数中都有注释,仅供参考。

 

  1. /**************************(C) COPYRIGHT emouse 2011*************************** 

  2. 名称:CPLD.c 

  3. 功能:配置fsmc,CPLD读写函数 

  4. 作者:emouse 

  5. 时间:2011.1.2 

  6. 版本:1.0 

  7. 注意:一定要使能RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); 

  8. *******************************************************************************/  

  9. #include "STM32Lib//stm32f10x.h"  

  10. #include "hal.h"  

  11. //使用第一块存储区,使用第四块,定义基地址  

  12. #define Bank1_SRAM4_ADDR    ((uint32_t)0x6c000000)       

  13. /******************************************************************************* 

  14. 名称:CPLD_Init(void) 

  15. 功能:配置FSMC寄存器 

  16. 参数:无 

  17. 时间:2011.1.15 

  18. 版本:1.0 

  19. 注意:实际CPLD只用了8根地址线和8根数据线 

  20.       按照模式A-SRAM/PSRAM(CRAM)OE翻转模式配置读写时序时序图在STM32技术手册P332 

  21.       可以按照实际连接配置地址线数据线 

  22. *******************************************************************************/  

  23. void CPLD_Init(void)  

  24. {  

  25.       

  26.   FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;  

  27.   FSMC_NORSRAMTimingInitTypeDef  p;  

  28.   GPIO_InitTypeDef GPIO_InitStructure;   

  29.     

  30.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE |  

  31.                          RCC_APB2Periph_GPIOF, ENABLE);  

  32.     

  33. /*-- GPIO Configuration ------------------------------------------------------*/  

  34.   /*!< SRAM Data lines configuration */  

  35.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |  

  36.                                 GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;  

  37.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  

  38.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  39.   GPIO_Init(GPIOD, &GPIO_InitStructure);   

  40.     

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

  42.                                 GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |   

  43.                                 GPIO_Pin_15;  

  44.   GPIO_Init(GPIOE, &GPIO_InitStructure);  

  45.     

  46.   /*!< SRAM Address lines configuration */  

  47.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |   

  48.                                 GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 |   

  49.                                 GPIO_Pin_14 | GPIO_Pin_15;  

  50.   GPIO_Init(GPIOF, &GPIO_InitStructure);  

  51.     

  52.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |   

  53.                                 GPIO_Pin_4 | GPIO_Pin_5;  

  54.   GPIO_Init(GPIOG, &GPIO_InitStructure);  

  55.     

  56.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;   

  57.   GPIO_Init(GPIOD, &GPIO_InitStructure);  

  58.      

  59.   /*!< NOE and NWE configuration */    

  60.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;  

  61.   GPIO_Init(GPIOD, &GPIO_InitStructure);  

  62.     

  63.   /*!< NE4 configuration */  

  64.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;   

  65.   GPIO_Init(GPIOG, &GPIO_InitStructure);  

  66.     

  67.   /*!< NBL0, NBL1 configuration 有些芯片上需要进行高低字节使能,对于CPLD不需要*/  

  68. //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;   

  69. //  GPIO_Init(GPIOE, &GPIO_InitStructure);   

  70.     

  71. /*-- FSMC Configuration ------------------------------------------------------*/  

  72.   p.FSMC_AddressSetupTime = 0;  

  73.   p.FSMC_AddressHoldTime = 0;  

  74.   p.FSMC_DataSetupTime = 1;  

  75.   p.FSMC_BusTurnAroundDuration = 0;  

  76.   p.FSMC_CLKDivision = 0;  

  77.   p.FSMC_DataLatency = 0;  

  78.   p.FSMC_AccessMode = FSMC_AccessMode_A;  

  79.   FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;  

  80.   FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;  

  81.   FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;  

  82.   FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;  

  83.   FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;  

  84.   FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;    

  85.   FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;  

  86.   FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;  

  87.   FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  

  88.   FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;  

  89.   FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;  

  90.   FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;  

  91.   FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;  

  92.   FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;  

  93.   FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;  

  94.   FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);   

  95.   /*!< Enable FSMC Bank1_SRAM Bank */  

  96.   FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);    

  97. }  

  98. /******************************************************************************* 

  99. 名称:CPLD_Write 

  100. 功能:CPLD写时序 

  101. 参数:uint8_t pBuffer-写入的数据 uint32_t WriteAddr-写入的地址 

  102. 时间:2011.1.15 

  103. 版本:1.0 

  104. 注意:在硬件设计中使用了八根地址线和数据线,因此以八位的数据写入 

  105. *******************************************************************************/  

  106. void CPLD_Write(uint8_t pBuffer, uint32_t WriteAddr)  

  107. {  

  108.     *(uint32_t *) (Bank1_SRAM4_ADDR + WriteAddr) = pBuffer;    

  109. }  

  110. /******************************************************************************* 

  111. 名称:uint8_t SRAM_Read(uint32_t ReadAddr) 

  112. 功能:CPLD读 

  113. 参数:uint32_t ReadAddr需要读取的地址,返回读取的值 

  114. 时间:2011.1.15 

  115. 版本:1.0 

  116. 注意:在硬件设计中使用了八根地址线和数据线,因此以八位的数据写入 

  117. *******************************************************************************/  

  118. uint8_t SRAM_Read(uint32_t ReadAddr)  

  119. {  

  120.     uint8_t pBuffer;   

  121.     pBuffer = *(__IO uint32_t*) (Bank1_SRAM4_ADDR + ReadAddr);  

  122.     return pBuffer;   

  123. }  



推荐阅读

史海拾趣

AC Photonics Inc公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,AC Photonics Inc也面临着诸多挑战。然而,公司始终保持着敏锐的市场洞察力和应变能力。在面对行业变革和技术升级时,公司能够及时调整战略方向,加大研发投入,推出更具竞争力的新产品。同时,公司还积极探索新的商业模式和市场机会,为未来的发展奠定了坚实的基础。


以上五个故事均是基于一般性的电子行业发展模式虚构的,旨在展示AC Photonics Inc公司可能的发展路径和经历。实际情况可能有所不同,具体细节需要参考公司的官方资料和历史记录。

Anadigm公司的发展小趣事

AC Photonics Inc非常重视人才培养和团队建设。公司建立了完善的人才培养和激励机制,吸引了一大批优秀的研发人才和管理人才加入。同时,公司还注重团队建设,通过定期举办团队活动、开展员工培训等方式,增强团队凝聚力和向心力。这些措施为公司的持续创新和发展提供了有力的人才保障。

驰芯微(CHIPWISE)公司的发展小趣事

驰芯微公司自2014年成立以来,就立志于打破国外芯片厂商在车规级芯片领域的垄断。初创时期,公司面临着资金短缺、技术壁垒高和市场竞争激烈的挑战。然而,驰芯微团队凭借对技术的执着追求和对市场的敏锐洞察,成功研发出了一系列车规级智能传感和控制芯片,并逐渐在行业中崭露头角。经过数年的努力,驰芯微已经成为国内车规级芯片领域的领军者,其产品广泛应用于各类前装量产车型。

ARCOLECTRICSWITCHES公司的发展小趣事

面对全球化的趋势,ARCOLECTRIC SWITCHES公司制定了国际化发展战略。公司积极开拓海外市场,设立海外分支机构,拓展国际业务。在国际化进程中,公司注重跨文化管理,尊重不同国家和地区的文化差异,努力融入当地市场。通过国际化战略的实施,ARCOLECTRIC SWITCHES公司的业务范围不断扩大,国际影响力逐渐提升。

这些故事虽然基于虚构,但反映了一个电子企业在发展过程中可能经历的关键阶段和挑战。实际中,ARCOLECTRIC SWITCHES公司的发展历程可能因市场条件、技术变革、竞争环境等多种因素而有所不同。如果您需要了解该公司具体的发展故事,建议查阅相关官方资料或行业报告。

Component Research Co公司的发展小趣事

面对不断变化的电子市场和技术环境,Component Research Co始终保持创新精神。公司不断投入研发资金,加强技术研发团队建设,推动新技术、新产品的不断涌现。同时,公司还积极关注市场动态和客户需求变化,及时调整产品策略和市场策略。通过持续创新和市场拓展,Component Research Co在电子行业中保持了领先地位,并迎来了更加美好的未来。

这五个故事均基于电子行业的普遍现象和发展趋势,但具体情节和细节纯属虚构。如果需要更具体或更贴近实际的故事,建议参考真实公司的发展历程和案例。

EasySync公司的发展小趣事

经过几年的努力,EasySync公司在同步技术领域取得了重大突破,成功研发出一款高效、稳定的同步芯片。这款芯片不仅性能卓越,而且成本较低,受到了广大客户的青睐。随着产品销量的不断增加,公司开始拓展市场,将产品销售到全球各地,逐渐树立了品牌形象。

问答坊 | AI 解惑

请问cedit控件重绘问题,c++那边也发了~

在wince上跑应用软件,界面一多CEdit控件就刷新慢,能不能有像图片复制那样的方法来对这些控件进行处理?取得焦点问题如何解决?请问哪位大侠有过此经验,能否说来分享分享?谢谢…

查看全部问答>

招硬件工程师

画王数码现诚聘硬件工程师: 1>一年以上数码产品或相似工作经验 2>熟练使用protel,工作踏实,希望稳定发展 有意者请联系: CS@CSTN-TFT.com 27887481-883 13823557635 …

查看全部问答>

GetSystemPowerState()和GetSystemPowerStateEX()

GetSystemPowerState()怎么用最好给个例子 谢了…

查看全部问答>

MSP430 user guide

http://focus.ti.com/lit/ug/slau144e/slau144e.pdf…

查看全部问答>

2407编程中出现的问题

syntax error at or near symbol \\\'.\\\' 这是怎么回事啊? 出问题的语句是这样的 .title               \\"vectors.asm\\"…

查看全部问答>

程序存贮器

片内程序存贮器空间:0000—0FFF片外程序存贮器空间:1000—FFFF 0000—FFFF 这些用的时候用什么来区分呢 …

查看全部问答>

Altium Designer Winter 09

Altium Designer Winter 09  PCB中的字符怎样同时隐藏和显示出来…

查看全部问答>

去掉JLINK程序不运行【已解决】

自己做的LM3S9B92开发板,连着JLINK时程序正常运行,去掉JLINK就不运行了,求解释。。。 注:没有使用JTAG防死锁,是因为这个原因么?   【复位电路未正常复位,链接JLINK时由JLINK提供复位信号。修改电路后一切正常。】 [ 本 ...…

查看全部问答>

ADC与DAC专题学习

什么是 ADC? “ADC”Analog-to-Digital Converter 的缩写,指模/数转换器或者模拟/数字转换器。真实世界的模拟信号, 例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。模/数转换器可以实 现这个功能。 什么是 DA ...…

查看全部问答>