FSMC 同步模式

[复制链接]
 楼主| cao884203 发表于 2012-9-10 18:03 | 显示全部楼层 |阅读模式
有没有达人有设置好的FSMC的同步模式,我设置了以后发现与异步模式在时序上没有差别,也许是我没看懂。
以下是我的初始化代码,还希望达人帮我看看,我的异步模式已经成功了。

FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef  p;
/* FSMC_Bank1_NORSRAM4 timing configuration */
  p.FSMC_CLKDivision =2;
  p.FSMC_DataLatency = 2;
  p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM ;
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Enable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_DuringWaitState;
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Enable;
  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Enable;
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

  /* Enable FSMC_Bank1_NORSRAM4 */
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
 楼主| cao884203 发表于 2012-9-11 10:06 | 显示全部楼层
配置我又搞了搞,现在能把CLK输出了,但是同步写方式还有些疑惑,有没有人用过同步写方式呢?给我点参考谢谢
IJK 发表于 2012-9-11 11:57 | 显示全部楼层
FSMC的同步模式 用得少,需要有支持同步模式的外设才行。
 楼主| cao884203 发表于 2012-9-11 17:56 | 显示全部楼层
最后调试了调试,发现我用的库
FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] =
            (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime |
            (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) |
            (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) |
            (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) |
            (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) |
            (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) |
             FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode;


代码是不安全的,因为只是或的方式赋值,逐步调试到了这里,里面的变量很乱,不是我想要的值。。
找了师傅帮我看了看,指出
FSMC_NORSRAMTimingInitTypeDef  p; 这句没有给变量赋初值,里面是乱码,这样跑库给的函数时相或是很不安全的。加了一句 清零语句。
memset((unsigned char *)&p, 0, sizeof(FSMC_NORSRAMTimingInitTypeDef));


FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  p;


  memset((unsigned char *)&p, 0, sizeof(FSMC_NORSRAMTimingInitTypeDef));
  /*-- FSMC Configuration ------------------------------------------------------*/
  /* FSMC_Bank1_NORSRAM4 timing configuration */

  p.FSMC_CLKDivision =0x09;
  p.FSMC_DataLatency =0x01;
  p.FSMC_AccessMode = FSMC_AccessMode_A;
就搞定了!
下次用库的时候还是因该谨慎谨慎!
airwill 发表于 2012-9-12 20:11 | 显示全部楼层
由于 STM32 系列 MCU 的功能复杂, 外设寄存器庞大.
所以库里大量使用了结构体来传递参数.
这确实带来了结构体初始化的问题, 因为通常编译器把结构体放在堆栈中. 那么不初始化, 天知道现在是什么值了.
不过 st 也考虑到这个问题了, 所以各个结构基本都有初始化函数.
figo20042005 发表于 2012-9-12 21:59 | 显示全部楼层
看来初始化赋值很关键,结构体数量很多,很容易犯错
freewhz 发表于 2016-10-16 20:13 | 显示全部楼层
我也遇到这个问题了,找了一下,库中有初始化函数
FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部