开发者社区> 文艺小青年> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

STM32通过FSMC读写CPLD

简介:
+关注继续查看

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
VS2017编写MFC库以及使用Qt调用MFC库方法
VS2017编写MFC库以及使用Qt调用MFC库方法
99 0
用户登陆注册【JDBC版】(上)
在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文! 本来使用的是XML文件作为小型数据库,现在使用Mysql数据库,代码究竟要改多少呢?我们拭目以待!
50 0
【OkHttp】OkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )(二)
【OkHttp】OkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )(二)
121 0
【物联网云端对接-2】通过MQTT协议与阿里云物联网套件进行云端通信
 在《程序员》杂志2017.4刊上,曾写过一篇《微软百度阿里三大物联网平台探析》,上面曾介绍了阿里云物联网套件的一些内容,在写该篇文章的时候,凌霄物联网网关还无法对接到此平台(TLS必须1.1版本以上)。
1555 0
zabbix3.0.2 通过orabbix来监控oracle11g增强版的详细过程 ​
zabbix3.0.2 通过orabbix来监控oracle11g增强版的详细过程
943 0
php 使用GD库上传图片以及创建缩略图
php 使用GD库上传图片以及创建缩略图   GD库是PHP进行图象操作一个很强大的库。 先在php.ini里增加一行引用:extension=php_gd2.dll 重启apache。
1069 0
1.QT中播放视频,录音程序的编写
 1  通过process的方式播放视频 T22VideoPlayer.pro HEADERS += \     MyWidget.h   SOURCES += \     MyWidget.cpp   QT += gui widgets
1445 0
C#获取cpu序列号 硬盘ID 网卡硬地址以及操作注册表 .
转:http://blog.csdn.net/smartsmile2012/article/details/8682295#region 获取cpu序列号 硬盘ID 网卡硬地址 /**/ /// /// 获取cpu序列号 ...
1035 0
3576
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载