STM32通过FSMC读写CPLD

简介:

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

 

[c-sharp]  view plain copy print ?
  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. }  
 本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/archive/2011/01/15/2198184.html,如需转载请自行联系原作者

相关文章
|
存储 芯片
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
496 0
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
|
存储 关系型数据库 编译器
STM32学习笔记:读写内部Flash(介绍+附代码)
STM32学习笔记:读写内部Flash(介绍+附代码)
434 0
|
存储 安全 芯片
STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)
STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)
1119 0
STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)
|
存储 芯片
STM32入门开发: 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)
STM32入门开发: 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)
819 0
STM32入门开发: 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)
|
存储 物联网 数据安全/隐私保护
STM32+MFRC522完成IC卡号读取、密码修改、数据读写
STM32+MFRC522完成IC卡号读取、密码修改、数据读写
802 0
STM32+MFRC522完成IC卡号读取、密码修改、数据读写
【STM32 .Net MF开发板学习-08】远程PLC读写控制
在工控项目中,PLC一般必不可少,现场控制一般以它为核心,而PC系统一般只是起到远程监控、图表和数据存储的作用。
728 0
|
5月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
450 2
|
4月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
722 0
|
5月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
510 4