打印

FSMC有没有中文使用说明?不使用库的话,初始化过程是什么样

[复制链接]
3054|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lianshumou|  楼主 | 2008-8-26 07:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
lianshumou|  楼主 | 2008-8-26 09:44 | 只看该作者

我一操作外部空间的地址就过硬件失效中断

最有意思的一次是读0x64000000,结果造成JTAG锁死且靠重新上电无法恢复! 相当的活见鬼啊!  不知FSMC设置方面有什么需要注意的,有没有寄存器写的先后要求?是否需要先使能时钟,是否需要先使能FSMC后在设置寄存器,还是先设寄存器后使能.  但不管咱样,咱的会进硬件失效中断啊!真是相当的夸张!

使用特权

评论回复
板凳
ijk| | 2008-8-26 10:03 | 只看该作者

FSMC不难操作

  根据经验,FSMC不难操作。下面给出一些代码,代码可用于ST的官方评估板STM3210E-EVAL,仅供参考:

// Note: NOR /CS is CE1 - Bank 1 of 0~3
#define EVAL_NOR_BASE        ((u32)(0x60000000 | 0x04000000))
#define EVAL_NOR             ((EVAL_NOR_TypeDef *) EVAL_NOR_BASE)

//...

//-----------------------------------------------------------------
//   NOR(M29W128, /CS1-of 0~3) initialization
//-----------------------------------------------------------------
void NOR_Test_Init(void)
{
  // NOR IO configuration --------------------------------------//
  // Enable FSMC, GPIOD~G & AFEN(Alternate Function) clock //
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
                         RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |
                         RCC_APB2Periph_AFIO, ENABLE);
  // Set PD0,1, 4~5, 8~15 as PP AF - D2,3, OE,WE, D13~15, A16~18, D0~1
//...
  // Set PE3~6, 7~15 as PP AF - A19~22, D4~12
//...
  // Set PF0~5, 12~15 as PP AF - A0~5, A6~9
//...
  // Set PG0~5, 9 as PP AF - A10~15, CE1
//...

  // NOR configuration ------------------------------------------//
  // NOR configured as follow:
  //      - Data/Address MUX = Disable
  //      - Memory Type = NOR
  //      - Data Width = 16bit
  //      - Reset Pin Level = High (needed for Flash memory)
  //      - Wait Signal Polarity = Low
  //      - Write Operation = Enable
  //      - Extended Mode = Disable
  //      - Asynchronous Wait = Disable
  // for test purpose only
//  FSMC_Bank1->BTCR[2] = FSMC_DataAddressMux_Disable | FSMC_MemoryType_SRAM |
//                        FSMC_MemoryDataWidth_16b | FSMC_WaitSignalPolarity_Low |
//                        FSMC_WriteOperation_Enable |
//                        FSMC_ExtendedMode_Disable | FSMC_AsyncWait_Disable;

  FSMC_Bank1->BTCR[2] = FSMC_DataAddressMux_Disable | FSMC_MemoryType_NOR |
                        FSMC_MemoryDataWidth_16b | FSMC_FlashResetPinLevel_High |
                        FSMC_WaitSignalPolarity_Low | FSMC_WriteOperation_Enable |
                        FSMC_ExtendedMode_Disable | FSMC_AsyncWait_Disable;

  // and as follow (NOR cycle time is <= 80ns):
  //      - Address Setup Time = 0x03
  //      - Address Hold Time = 0x00
  //      - Data Setup Time = 0x04
  //      - Bus Turn around Duration = 0x05
  FSMC_Bank1->BTCR[3] = 0x00050403;
  //      - BANK 1 (of NOR/SRAM Bank 0~3) is enabled
  FSMC_Bank1->BTCR[2] |= 0x0001;
}

随后就可以对 NOR 进行读写了:
//-----------------------------------------------------------------
//   NOR(M29W128) test
//   return NOR_TEST_FAIL_xx - Fail
//   return NOR_TEST_PASS - PASS
//-----------------------------------------------------------------
u8 NOR_Test(u32 address)
{
//...
}

使用特权

评论回复
地板
lianshumou|  楼主 | 2008-8-26 10:11 | 只看该作者

LS的是参照库改的吧!我没有用库!正在看它是怎么设置的!

我没有用库,所有都是直接地址操作! ST有关寄存器设置顺序方面的文档基本没有,只能是看它的库是确保顺序了!

使用特权

评论回复
5
ijk| | 2008-8-26 10:19 | 只看该作者

关于上面的示例

  关于上面的示例,除了打开FSMC的时钟,其它都是直接操作FSMC的寄存器,当然示例使用了库中的定义(自己没必要重复定义)。有1点需要特别注意(或许跟LZ的问题有关):
  //      - Reset Pin Level = High (needed for Flash memory)

  FSMC_Bank1->BTCR[2] = FSMC_DataAddressMux_Disable | FSMC_MemoryType_NOR |
                        FSMC_MemoryDataWidth_16b | FSMC_FlashResetPinLevel_High |
                        FSMC_WaitSignalPolarity_Low | FSMC_WriteOperation_Enable |
                        FSMC_ExtendedMode_Disable | FSMC_AsyncWait_Disable;

使用特权

评论回复
6
lianshumou|  楼主 | 2008-8-26 11:57 | 只看该作者

我唯一和库同的是我先使能的FSMC

FSMC_Bank1->BTCR[2] |= 0x0001;

而后才设置的寄存器!

使用特权

评论回复
7
lianshumou|  楼主 | 2008-8-27 08:31 | 只看该作者

我的FSMC终于正常了,原来是因为存贮类型选了NOR

但FACCEN位却没有置位,造成FSMC不能使能.

另外一个问题,FSMC不的读不能设为波形图上的最快. ADDSET = 0;  DATAST = 0
ADDHLD = 0; 模式0  在这种情况下会造成JTAG锁死,只能用其它方式擦完falsh后重新上电方可在连上.
我的设置是:  ADDSET = 0;  DATAST = 1  ADDHLD = 0;  模式0

使用特权

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

本版积分规则

47

主题

560

帖子

1

粉丝