<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32F103 FSMC同步模式學(xué)習(xí)筆記2

          STM32F103 FSMC同步模式學(xué)習(xí)筆記2

          作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò) 收藏
          苦逼了。??戳藢⒔粋€(gè)禮拜的STM32F103 FSMC 片選NOR的異步模式。。。。可能對(duì)項(xiàng)目提升不大。?!,F(xiàn)在看同步突發(fā)模式。。我也不知道怎么翻譯。。。嵌入式學(xué)得不太久。。不說(shuō)了 一會(huì)看手冊(cè)啊。。
          ----------------------------------我是無(wú)恥的分割線-----------------------------------------------
          首先對(duì)于NOR異步模式總結(jié)一下:
          1.硬件線路一定要對(duì)
          2.需要知道可以用一根地址線(Ax)或者一些地址線選擇RS或者其他的東西,很有用。
          3.我用的是不復(fù)用模式144腳,如果是復(fù)用模式可能地址線會(huì)更亂一些。
          4.一定要先初始化RCC,GPIO在初始化FSMC。。要不可能會(huì)有問(wèn)題,經(jīng)驗(yàn)之談。。
          5.21IC上有好多FSMC的帖子。。很有用。。
          6.要去官網(wǎng)下appliction note和芯片手冊(cè)。。最權(quán)威

          之后對(duì)于一些要重復(fù)記憶的話:
          FSMC所有輸出信號(hào)都是上升沿有效。

          最后給出我用示波器測(cè)試出來(lái)數(shù)據(jù):
          ADDSET = 0DATASET = 2實(shí)際數(shù)據(jù)傳輸率: 7MHz (接近最快)
          ADDSET = 0DATASET = 6實(shí)際數(shù)據(jù)傳輸率: 5MHz
          ADDSET = 15 DATASET = 255 實(shí)際數(shù)據(jù)傳輸率: 260KHz (接近最慢)

          異步模式NE也就是信號(hào)有點(diǎn)奇怪,我認(rèn)為他是片選信號(hào),但是為什么會(huì)根據(jù)transaction拉低,transaction結(jié)束后又拉高,維持一固定一小段時(shí)間??(有待繼續(xù)看手冊(cè))

          經(jīng)過(guò)異步模式的測(cè)量與驗(yàn)證,按照時(shí)序計(jì)算,一次transaction(NE從低到高的過(guò)程),時(shí)間計(jì)算和手冊(cè)是一樣的:
          我用的是擴(kuò)展模式B: Tclc(write) =ADDSET + 1 + DATASET + 1;
          其中ADDSET最小為0,而DATASET最小為1.

          手冊(cè)上沒(méi)有的知識(shí),經(jīng)過(guò)一下午的測(cè)量,得出NE信號(hào)的恢復(fù)時(shí)間,即transaction結(jié)束后,NE拉高,再拉地的時(shí)間大致為6個(gè)HCLK。(如果同步模式和你的分頻有關(guān),為6個(gè)CLK)
          -------------------------------------------------------------------------------------------------
          下面是同步模式:



          為了保證memory clock(CLK)在NADV低電平的中間上升,F(xiàn)SMC會(huì)在一個(gè)HCLK周期后操作CLK(在NADV前)。
          Data latency:就是在采樣前等待的時(shí)間周期,但是不包括NADV為低時(shí)的時(shí)間,可以從圖1看出。
          注意的是:一些NOR FLASH包括NADV為低時(shí)的周期,所以有下面的情況
          NOR Flash latency = DATLAT + 2
          NOR Flash latency = DATLAT + 3

          同步模式代碼我貼出來(lái)吧:
          void LED_FSMCConfigMy(void)
          {
          FSMC_NORSRAMInitTypeDefFSMC_NORSRAMInitStructure;
          FSMC_NORSRAMTimingInitTypeDefp;

          memset((unsigned char *)&p, 0, sizeof(FSMC_NORSRAMTimingInitTypeDef));
          memset((unsigned char *)&FSMC_NORSRAMInitStructure, 0, sizeof(FSMC_NORSRAMInitTypeDef));



          p.FSMC_CLKDivision =0x09;
          p.FSMC_DataLatency =0x01;
          p.FSMC_AccessMode = FSMC_AccessMode_A;

          //- Data/Address MUX = Disable
          //- Memory Type = SRAM
          //- Data Width = 16bit
          //- Write Operation = Enable
          //- Extended Mode = Disable
          //- Asynchronous Wait = Disable
          //- WaitSignalPolarity = Low
          //- BurstAccessMode = Enable
          FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//NOR和SRAM的BANK
          FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; //不復(fù)用
          FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM ; //因?yàn)槲倚枰獙?xiě),同步模式只有PSRAM才能寫(xiě),和輸出時(shí)鐘信號(hào)
          FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//16位輸出
          FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Enable; //這個(gè)不太懂
          FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
          FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; //同步模式dont care
          FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;//WAITCFG = 0 默認(rèn)值,其實(shí)無(wú)所謂
          FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;//WREN 同步寫(xiě)時(shí)不可更改
          FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Enable;//允許等待
          FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;//不用擴(kuò)展模式
          FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Enable;//使用同步模式必須開(kāi)
          FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
          FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

          FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);


          FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);


          }


          另外,我用紅色高亮的代碼是我遇到問(wèn)題后的解決方案,就是不論你怎么設(shè)置分頻和時(shí)延,都是預(yù)期的結(jié)果。
          http://bbs.21ic.com/viewthread.php?tid=375165&highlight=
          原因很簡(jiǎn)單:
          因?yàn)?strong>STM32 給的庫(kù),在這個(gè)結(jié)構(gòu)體問(wèn)題上FSMC_NORSRAMTimingInitTypeDef, 并沒(méi)有初始化?。?!
          天知道原來(lái)是什么值,加上庫(kù)里直接把寄存器用 或 的方式全部賦值,如果結(jié)構(gòu)體本身就有數(shù)值,進(jìn)行 或 了
          以后當(dāng)然天知道他變成什么值了??!
          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;

          加了一句 清零結(jié)構(gòu)體數(shù)值語(yǔ)句。
          memset((unsigned char *)&p, 0, sizeof(FSMC_NORSRAMTimingInitTypeDef));
          保證他能夠成功寫(xiě)入寄存器


          關(guān)鍵詞: STM32F103FSMC同步模

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();