打印

FSMC 同步模式

[复制链接]
5308|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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;
就搞定了!
下次用库的时候还是因该谨慎谨慎!

使用特权

评论回复
5
airwill| | 2012-9-12 20:11 | 只看该作者
由于 STM32 系列 MCU 的功能复杂, 外设寄存器庞大.
所以库里大量使用了结构体来传递参数.
这确实带来了结构体初始化的问题, 因为通常编译器把结构体放在堆栈中. 那么不初始化, 天知道现在是什么值了.
不过 st 也考虑到这个问题了, 所以各个结构基本都有初始化函数.

使用特权

评论回复
6
figo20042005| | 2012-9-12 21:59 | 只看该作者
看来初始化赋值很关键,结构体数量很多,很容易犯错

使用特权

评论回复
7
freewhz| | 2016-10-16 20:13 | 只看该作者
我也遇到这个问题了,找了一下,库中有初始化函数
FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

0

粉丝