×
单片机 > 单片机程序设计 > 详情

STM32通过FSMC读写CPLD

发布时间:2020-09-01 发布时间:
|

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.   /*!

  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.   /*!

  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.   /*!

  60.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;  

  61.   GPIO_Init(GPIOD, &GPIO_InitStructure);  

  62.     

  63.   /*!

  64.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;   

  65.   GPIO_Init(GPIOG, &GPIO_InitStructure);  

  66.     

  67.   /*!

  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.   /*!

  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. }  





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义