Electoday 4.0

ไมโครคอนโทรลเลอร์ => ARM Processors => Topic started by: tha on December 29, 2020, 08:15:46 am

Title: STM32F1 FSMC
Post by: tha on December 29, 2020, 08:15:46 am
21 Flexible static memory controller (FSMC)

Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx
microcontrollers where the Flash memory density ranges between 16 and 32 Kbytes.
Medium-density devices are STM32F101xx and STM32F103xx microcontrollers where
the Flash memory density ranges between 32 and 128 Kbytes.
High-density devices are STM32F101xx and STM32F103xx microcontrollers where the
Flash memory density ranges between 256 and 512 Kbytes.
XL-density devices are STM32F101xx and STM32F103xx microcontrollers where the
Flash memory density ranges between 768 Kbytes and 1 Mbyte.
Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.

section นี้ใช้กับ high-density and XL-density devices เท่านั้น.

21.1 FSMC main features

The FSMC block สามารถ interface กับ synchronous and asynchronous memories and 16-bit PC memory cards. จุดประสงค์หลักของมันคือ:
•    แปล the AHB transactions ลงใน the appropriate external device protocol
•    ตอบสนอง the access timing requirements ของ the external devices

external memories ทั้งหมดแชร์ the addresses, data and control signals ด้วย the controller. แต่ละ external device ถูกเข้าถึงโดยวิธีของ a unique chip select. The FSMC ดำเนินการได้เพียง one access ในแต่ละครั้งถึง an external device.
Title: Re: STM32F1 FSMC
Post by: tha on December 29, 2020, 03:01:21 pm
The FSMC มีคุณลักษณะหลักดังต่อไปนี้:
•    Interfaces ด้วย static memory-mapped devices ได้แก่:
      –    Static random access memory (SRAM)
      –    NOR Flash memory
      –    PSRAM (4 memory banks)
•    Two banks ของ NAND Flash ด้วย ECC hardware ที่เช็คได้สูงถึง 8 Kbytes of data
•    16-bit PC Card compatible devices
•    รองรับ burst mode เข้าถึงไปยัง synchronous devices (NOR Flash and PSRAM)
•    8- or 16-bit wide databus
•    Independent chip select control สำหรับแต่ละ memory bank
•    Independent configuration สำหรับแต่ละ memory bank
•    Programmable timings เพื่อรองรับ a wide range ของ devices, โดยเฉพาะอย่างยิ่ง:
      –    Programmable wait states (สูงถึง 15)
      –    Programmable bus turnaround cycles (up to 15)
      –    Programmable output enable and write enable delays (up to 15)
      –    Independent read and write timings and protocol, เพื่อรองรับ the widest variety of memories and timings
•    Write enable และ byte lane select outputs สำหรับใช้กับ PSRAM and SRAM devices
•    การแปลของ 32-bit wide AHB transactions ไปเป็น consecutive 16-bit or 8-bit เข้าถึงไปยัง external 16-bit or 8-bit
      devices
•    A Write FIFO, ความยาว 2-word , แต่ละ word คือ 32 bits wide, stores data เท่านั้นและไม่มี the address. ดังนั้น, FIFO นี้
      เป็นเพียงบัฟเฟอร์ AHB write burst transactions. นี้ทำให้มันสามารถที่จะเขียนไปยัง slow memories และปล่อยให้ the AHB ที่
      เร็วไปทำงานอื่น. มีเพียง one burst แต่ละครั้งเท่านั้นที่ถูก buffered: ถ้า a new AHB burst หรือ single transaction เกิดขึ้นใน
      ขณะที่ an operation กำลังดำเนินการ, the FIFO จะถูกระบายออก. The FSMC จะใส่ wait states จนกระทั่ง the current
      memory access เสร็จสมบูรณ์.
•    External asynchronous wait control

The FSMC registers ที่กำหนด the external device type และ associated characteristics โดยปกติเซ็ตที่ boot time และไม่เปลี่ยนจนกระทั่ง the next reset หรือ power-up. อย่างไรก็ตาม, มันเป็นไปได้ที่จะเปลี่ยน the settings ที่เวลาใดๆก็ได้.
Title: Re: STM32F1 FSMC
Post by: tha on December 29, 2020, 03:13:08 pm
21.2 Block diagram

The FSMC ประกอบด้วย four main blocks:
•    The AHB interface (รวมถึง the FSMC configuration registers)
•    The NOR Flash/PSRAM controller
•    The NAND Flash/PC Card controller
•    The external device interface
The block diagram ถูกแสดงใน Figure 185.

(https://i.imgur.com/i37VwLn.png)
Title: Re: STM32F1 FSMC
Post by: tha on December 30, 2020, 05:40:37 am
21.3 AHB interface

The AHB slave interface เปิดการใช้งาน internal CPUs และ bus master peripherals อื่นๆเพื่อเข้าถึง the external static memories.

AHB transactions ถูกแปลลงใน the external device protocol. โดยเฉพาะอย่างยิ่ง, ถ้า the selected external memory เป็น 16 หรือ 8 bits wide, 32-bit wide transactions บน the AHB ถูกแยกลงใน consecutive 16- or 8-bit accesses. The Chip Select ถูกทำให้เป็น low หรือสลับระหว่าง the consecutive accesses เมื่อดำเนินการ 32-bit aligned หรือ 32-bit unaligned accesses ตามลำดับ.

The FSMC สร้าง an AHB error ในเงื่อนไขดังต่อไปนี้:
•    เมื่อ reading หรือ writing ถึง an FSMC bank ซึ่งไม่ถูก enabled
•    เมื่อ reading หรือ writing ถึง the NOR Flash bank ขณะที่ the FACCEN bit ถูก reset ใน the FSMC_BCRx register.
•    เมื่อ reading หรือ writing ถึง the PC Card banks ขณะที่ the input pin FSMC_CD (Card Presence Detection) เป็น low.

The effect ของ this AHB error ขึ้นอยู่กับ the AHB master ซึ่งมีความพยายาม the R/W access:
•    ถ้ามันเป็น the Cortex®-M3 CPU, a hard fault interrupt ถูกสร้างขึ้น
•    ถ้าเป็น a DMA, a DMA transfer error ถูกสร้างขึ้นและ the corresponding DMA channel ถูก disabled โดยอัตโนมัติ.

The AHB clock (HCLK) คือ the reference clock สำหรับ the FSMC.
Title: Re: STM32F1 FSMC
Post by: tha on December 30, 2020, 06:38:01 am
21.3.1 Supported memories and transactions

General transaction rules

The requested AHB transaction data size สามารถเป็น 8-, 16- or 32-bit wide ในขณะที่ the accessed external device มี a fixed data width. นี้อาจนำไปสู่ inconsistent transfers.

ดังนั้น, บาง simple transaction rules ต้องถูกปฏิบัติตาม:
•    AHB transaction size and memory data size เท่ากัน
      ไม่มีปัญหาในกรณีนี้
•    AHB transaction size ใหญ่กว่า the memory size
      ในกรณีนี้, the FSMC แยก the AHB transaction ลงใน smaller consecutive memory accesses เพื่อตอบสนองต่อ the
      external data width.
•    AHB transaction size เล็กกว่า the memory size
      Asynchronous transfers อาจสม่ำเสมอหรือไม่สม่ำเสมอขึ้นอยู่กับ the type of external device.
      –    Asynchronous เข้าถึงไปยัง devices ที่มี the byte select feature (SRAM, ROM, PSRAM).
            a) FSMC อนุญาติให้ write transactions เข้าถึง the right data ผ่านทาง byte lanes NBL[1:0] ของมัน
            b) Read transactions ถูกอนุญาติ. memory bytes ทั้งหมดถูกอ่านและส่วนที่ไร้ประโยชน์จะถูกทิ้ง. The NBL[1:0] ถูกทำให้
                เป็น low ในระหว่าง read transactions.
      –    Asynchronous เข้าถึงไปยัง devices ที่ไม่มี the byte select feature (NOR and NAND Flash 16-bit).
            สถานการณ์นี้เกิดขึ้นเมื่อ a byte access ถูกร้องขอไปยัง a 16-bit wide Flash memory. เห็นได้ชัดว่า, the device ไม่
            สามารถถูกเข้าถึงใน byte mode (เฉพาะ 16-bit words สามารถถูกอ่านจาก/เขียนถึง the Flash memory) ดังนั้น:
           a) Write transactions ไม่ถูกอนุญาติ
           b) Read transactions ถูกอนุญาติ. memory bytes ทั้งหมดถูกอ่านและส่วนที่ไร้ประโยชน์จะถูกทิ้ง. The NBL[1:0] ถูกเซ็ต
               เป็น 0 ในระหว่าง read transactions.
Title: Re: STM32F1 FSMC
Post by: tha on December 30, 2020, 06:43:49 am
Configuration registers

The FSMC สามารถถูกกำหนดค่าโดยใช้ a register set. ดู Section 21.5.6, สำหรับรายละเอียดการอธิบายของ the NOR Flash/PSRAM control registers. ดู Section 21.6.8, สำหรับรายละเอียดการอธิบายของ the NAND Flash/PC Card registers.
Title: Re: STM32F1 FSMC
Post by: tha on December 30, 2020, 07:12:53 am
21.4 External device address mapping

จากมุมมอง the FSMC , the external memory ถูกแบ่งลงใน 4 fixed-size banks of 256 Mbytes each (Refer to Figure 186):
•    Bank 1 ถูกใช้เพื่อระบุตำแหน่งสูงถึง 4 NOR Flash or PSRAM memory devices.  bank ถูกแยกลงใน 4 NOR/PSRAM
      subbanks พร้อมด้วย 4 dedicated Chip Selects, ดังต่อไปนี้:
      –    Bank 1 - NOR/PSRAM 1
      –    Bank 1 - NOR/PSRAM 2
      –    Bank 1 - NOR/PSRAM 3
      –    Bank 1 - NOR/PSRAM 4
•    Banks 2 and 3 ถูกใช้เพื่อระบุตำแหน่ง NAND Flash devices (1 device per bank)
•    Bank 4 ถูกใช้เพื่อระบุตำแหน่ง a PC Card device

สำหรับแต่ละ bank the type of memory ที่ถูกใช้ เป็นแบบผู้ใช้กำหนดใน the Configuration register

(https://i.imgur.com/dHyljMf.png)
Title: Re: STM32F1 FSMC
Post by: tha on December 30, 2020, 09:59:25 am
21.4.1 NOR/PSRAM address mapping

HADDR[27:26] bits ถูกใช้เลือกหนึ่งของ the four memory banks ดังแสดงใน Table 100.

(https://i.imgur.com/vhe9bqu.png)
(https://i.imgur.com/7HxkbUm.png)
1. HADDR คือ internal AHB address lines ที่ถูกแปลเป็น external memory.

HADDR[25:0] บรรจุ the external memory address. เนื่องจาก HADDR คือ a byte address ในขณะที่ the memory ถูกระบุตำแหน่งใน words, the address จริงที่ปล่อยออกไปยัง the memory แตกต่างกันไปสอดคล้องกันกับ the memory data width, ดังแสดงในตารางต่อไปนี้.

(https://i.imgur.com/pvUGyoE.png)
1. ในกรณีของ a 16-bit external memory width, the FSMC จะใช้โดยภายใน HADDR[25:1] เพื่อสร้าง the address สำหรับ external memory FSMC_A[24:0].
อย่างไรก็ตาม the external memory width (16-bit or 8-bit), FSMC_A[0] ควรถูกต่อถึง external memory address A[0].

Wrap support for NOR Flash/PSRAM

Wrap burst mode สำหรับ synchronous memories ไม่ได้ถูกรองรับ. The memories ต้องถูกกำหนดค่าใน linear burst mode ของความยาวที่ไม่ได้กำหนด.
Title: Re: STM32F1 FSMC
Post by: tha on December 30, 2020, 02:16:28 pm
21.4.2 NAND/PC Card address mapping

ในกรณีนี้, three banks มีให้ใช้งาน, แต่ละของมันถูกแบ่งลงใน memory spaces ดังแสดงใน Table 102.

(https://i.imgur.com/ZD1O4WY.png)

สำหรับ NAND Flash memory, the common and attribute memory spaces ถูกแบ่งย่อยลงใน three sections (ดูใน Table 103 ข้างล่าง) ตั้งอยู่ใน the lower 256 Kbytes:
•    Data section (first 64 Kbytes in the common/attribute memory space)
•    Command section (second 64 Kbytes in the common / attribute memory space)
•    Address section (next 128 Kbytes in the common / attribute memory space)

(https://i.imgur.com/CXeExt9.png)

The application software ใช้ the 3 sections เพื่อเข้าถึง the NAND Flash memory:
•    เพื่อส่งคำสั่งไปยัง NAND Flash memory: the software ต้องเขียน the command value ไปยัง memory location ใดๆใน
      the command section.
•    เพื่อระบุ the NAND Flash address ที่ต้องถูกอ่านหรือเขียน: the software ต้องเขียน the address value ไปยัง memory
      location ใดๆใน the address section. เนื่องจาก an address สามารถมีความยาว 4 หรือ 5 bytes (ขึ้นอยู่กับ the actual
      memory size), several consecutive writes ไปยัง the address section ถูกต้องการเพื่อระบุ the full address.
•    เพื่ออ่านหรือเขียน data: the software อ่านหรือเขียน the data value จากหรือไปยัง memory location ใดๆใน the data
      section.

เนื่องจาก the NAND Flash memory เพิ่ม addresses โดยอัตโนมัติ, ไม่มีความจำเป็นต้องเพิ่ม the address ของ the data section เพื่อเข้าถึง consecutive memory locations.
Title: Re: STM32F1 FSMC
Post by: tha on December 31, 2020, 05:26:29 am
21.5 NOR Flash/PSRAM controller

The FSMC สร้าง the appropriate signal timings เพื่อขับ the following types of memories:
•    Asynchronous SRAM and ROM
      –    8-bit
      –    16-bit
      –    32-bit
•    PSRAM (Cellular RAM)
      –    Asynchronous mode
      –    Burst mode for synchronous accesses
•    NOR Flash
      –    Asynchronous mode
      –    Burst mode for synchronous accesses
      –    Multiplexed or nonmultiplexed

The FSMC ส่งออก a unique chip select signal NE[4:1] ต่อ bank. สัญญาฯอื่นๆทั้งหมด (addresses, data and control) ถูกแชร์.

สำหรับ synchronous accesses, the FSMC ปล่อยออก the clock (CLK) ไปยัง the selected external device เฉพาะในระหว่าง the read/write transactions. clock นี้คือ a submultiple ของ the HCLK clock. ขนาดของแต่ละ bank ถูก fixed และเท่ากับ 64 Mbytes.

แต่ละ bank ถูกกำหนดค่าโดยวิธีของ dedicated registers (ดู Section 21.5.6).

The programmable memory parameters รวมถึง access timings (see Table 104) และการรองรับสำหรับ wait management (สำหรับ PSRAM and NOR Flash ถูกเข้าถึงใน burst mode).

(https://i.imgur.com/1JHDOet.png)
Title: Re: STM32F1 FSMC
Post by: tha on December 31, 2020, 07:27:05 am
21.5.1 External memory interface signals

Table 105, Table 106 and Table 107  แสดงรายการสัญญาณที่มักใช้เพื่อเชื่อมต่อกับ NOR Flash, SRAM and PSRAM

Note: คำนำหน้า “N”. ระบุ the associated signal ว่า active low.

(https://i.imgur.com/qH0XPzm.png)

NOR Flash memories ถูกระบุที่อยู่ใน 16-bit words. The maximum capacity คือ 512 Mbit (26 address lines).

(https://i.imgur.com/c3afm6v.png)

NOR Flash memories ถูกระบุที่อยู่ใน 16-bit words. The maximum capacity คือ 512 Mbit (26 address lines).

(https://i.imgur.com/RV9sln7.png)

PSRAM memories ถูกระบุที่อยู่ใน 16-bit words. The maximum capacity คือ 512 Mbit (26 address lines).
Title: Re: STM32F1 FSMC
Post by: tha on December 31, 2020, 08:33:54 am
21.5.2 Supported memories and transactions

Table 108 ข้างล่างแสดงตัวอย่างของ the supported devices, access modes และ transactions เมื่อ the memory data bus คือ 16-bit for NOR, PSRAM and SRAM. Transactions ไม่อนุญาติ (หรือไม่รองรับ) โดย the FSMC ในตัวอย่างนี้จะปรากฎในสีเทา.

(https://i.imgur.com/UdaryFt.png)
Title: Re: STM32F1 FSMC
Post by: tha on December 31, 2020, 09:30:57 am
21.5.3 General timing rules

Signals synchronization

•    controller output signals ทั้งหมดเปลี่ยนบน the rising edge of the internal clock (HCLK)
•    ใน synchronous mode (read or write), output signals ทั้งหมดเปลี่ยนบน the rising edge of HCLK. ไม่ว่าค่า CLKDIV จะ
      เป็นเท่าใด, outputs ทั้งหมดเปลี่ยนดังต่อไปนี้:
      –    NOEL/NWEL/ NEL/NADVL/ NADVH /NBLL/ Address valid outputs เปลี่ยนบน the falling edge of FSMC_CLK
            clock.
      –    NOEH/ NWEH / NEH/ NOEH/NBLH/ Address invalid outputs เปลี่ยนบน the rising edge of FSMC_CLK clock.
Title: Re: STM32F1 FSMC
Post by: tha on December 31, 2020, 09:59:46 am
21.5.4 NOR Flash/PSRAM controller asynchronous transactions

Asynchronous static memories (NOR Flash memory, PSRAM, SRAM)

•    Signals ถูก synchronized โดย the internal clock HCLK. clock นี้ไม่ได้ถูกปล่อยออกไปยัง the memory
•    The FSMC สุ่มตัวอย่าง the data เสมอก่อนยกเลิกการยืนยัน the NOE signals. นี้รับประกันว่า the memory data-hold timing
      constraint ถูกตรงตาม (chip enable high เพื่อ data transition, โดยปกติต่ำสุดคือ 0 ns.)
•    ถ้า the extended mode ถูก enabled (EXTMOD bit ถูก set ใน the FSMC_BCRx register), มากถึง four extended
      modes (A, B, C and D) มีให้ใช้งาน. มันเป็นไปได้ที่จะผสม A, B, C and D modes สำหรับ read and write operations.
      ตัวอย่างเช่น, read operation สามารถถูกดำเนินการใน mode A และเขียนใน mode B.
•    ถ้า the extended mode ถูก disabled (EXTMOD bit ถูก reset ใน the FSMC_BCRx register), the FSMC สามารถดำเนิน
      การใน Mode1 or Mode2 ดังต่อไปนี้
      –    Mode 1 คือ the default mode เมื่อ SRAM/PSRAM memory type ถูกเลือก (MTYP[0:1] = 0x0 or 0x01 in the
            FSMC_BCRx register)
      –    Mode 2 คือ the default mode เมื่อ NOR memory type ถูกเลือก (MTYP[0:1] = 0x10 in the FSMC_BCRx
            register).
Title: Re: STM32F1 FSMC
Post by: tha on December 31, 2020, 10:28:51 am
Mode 1 - SRAM/PSRAM (CRAM)

The next figures แสดง the read and write transactions สำหรับ the supported modes ตามด้วย the required configuration of FSMC _BCRx, and FSMC_BTRx/FSMC_BWTRx registers.

(https://i.imgur.com/XykN6rR.png)

The one HCLK cycle ที่ the end of the write transaction ช่วยกะรันตี the address and data hold time หลังจาก the NWE rising edge. เนื่องจากการมีอยู่ของ one HCLK cycle นี้, the DATAST value ต้องใหญ่กว่าศูนย์ (DATAST > 0).

(https://i.imgur.com/86Z1wMS.png)
Title: Re: STM32F1 FSMC
Post by: tha on December 31, 2020, 10:41:06 am
(https://i.imgur.com/tGNpCfH.png)

ความแตกต่างเปรียบเทียบกับ mode1 คือ the toggling of NOE และ the independent read and write timings.

(https://i.imgur.com/9h6XDsY.png)

(https://i.imgur.com/jsldSAv.png)
Title: Re: STM32F1 FSMC
Post by: tha on December 31, 2020, 11:14:15 am
(https://i.imgur.com/NO1jbpt.png)

(https://i.imgur.com/SIslAU0.png)

ความแตกต่างกับ mode1 คือ the toggling of NWE and the independent read and write timings เมื่อ extended mode ถูก set (Mode B).

(https://i.imgur.com/WOjo24g.png)

(https://i.imgur.com/nvBS3Ss.png)

Note: The FSMC_BWTRx register จะใช้ได้เฉพาะถ้า extended mode ถูก set (mode B), มิฉะนั้นเนื้อหาของมันทั้งหมดไม่ต้องสนใจ.
Title: Re: STM32F1 FSMC
Post by: tha on December 31, 2020, 11:20:30 am
(https://i.imgur.com/0ZxAFHB.png)

(https://i.imgur.com/2R9He9o.png)

(https://i.imgur.com/E5fo5Ii.png)
Title: Re: STM32F1 FSMC
Post by: tha on December 31, 2020, 12:40:25 pm
(https://i.imgur.com/aMkrlTz.png)

ความแตกต่างกับ mode1 คือ the toggling of NOE ที่ไปบนการสลับหลังจาก NADV เปลี่ยนและ the independent read and write timings.

(https://i.imgur.com/TCOqoFH.png)

(https://i.imgur.com/ixI2lyA.png)
Title: Re: STM32F1 FSMC
Post by: tha on January 01, 2021, 06:10:00 am
(https://i.imgur.com/5SizCAy.png)
1. The bus turnaround delay (BUSTURN + 1) และ the delay ระหว่าง side-by-side transactions เหลื่อมกัน, ดังนั้น  BUSTURN ≤5 ไม่มีผลกระทบ.

(https://i.imgur.com/4qM3Nhg.png)

ความแตกต่างกับ mode D คือ the drive of the lower address byte(s) on the databus.

(https://i.imgur.com/3cfLbNG.png)

(https://i.imgur.com/wDaA429.png)

ปล. สวัสดีปีใหม่ ขอให้ชาวอีเล็คทูเดย์มีความสุข สุขภาพแข็งแรง มีสติ มีสมาธิ มีปัญญากันนะครับ
Title: Re: STM32F1 FSMC
Post by: tha on January 01, 2021, 07:14:25 am
WAIT management in asynchronous accesses

ถ้า the asynchronous memory ยืนยัน a WAIT signal เพื่อแสดงให้เห็นว่ามันยังไม่พร้อมที่ะรับหรือจัด data ให้, the ASYNCWAIT bit ต้องถูกเซ็ตใน FSMC_BCRx register.

ถ้า the WAIT signal ทำงาน (high or low ขึ้นอยู่กับ the WAITPOL bit), the second access phase (Data setup phase) ที่โปรแกรมโดย the DATAST bits, ถูกยืดออกไปจนกระทั่ง WAIT มาเป็นไม่ทำงาน. ไม่เหมือนกับ the data setup phase, the first access phases (Address setup and Address hold phases), โปรแกรมโดย the ADDSET[3:0] and ADDHLD bits, จะไม่ WAIT sensitive และดังนั้นพวกมันจะไม่ยืดเวลาออก.

The data setup phase (DATAST in FSMC_BTRx register) ต้องถูกโปรแกรมดังนั้น the WAIT signal จะตรงตามเงื่อนไขต่อไปนี้:
•    สำหรับ read accesses: WAIT สามารถถูกตรวจพบ 4 HCLK cycles ก่อน data จะถูกสุ่มจับหรือ 6 HCLK cycles ก่อน NOE ถูก
      ยกเลิกการยืนยัน (อ้างอิงถึง Figure 200).
•    สำหรับ write accesses: WAIT สามารถถูกตรวจพบ 4 HCLK cycles ก่อน NWE ยกเลิกการยืนยัน (refer to Figure 201).

1.    Memory ยืนยัน the WAIT signal เป็นแนวไปยัง NOE/NWE ซึ่งสลับ:

           DATAST ≥ (4 × HCLK) + max_wait_assertion_time

2.    Memory ยืนยัน the WAIT signal เป็นแนวไปยัง NEx (หรือ NOE/NWE ไม่มีการสลับ):
ถ้า

          max_wait_assertion_time > address_phase + hold_phase

ดังนั้น

          DATAST ≥ (4 × HCLK) + (max_wait_assertion_time – address_phase – hold_phase)

มิฉะนั้น

          DATAST ≥ 4 × HCLK

      โดยที่ max_wait_assertion_time คือ the maximum time ที่ใช้โดย the memory เพื่อยืนยัน the WAIT signal เมื่อ
      NEx/NOE/NWE เป็น low.

Figure 200 and Figure 201 แสดง the number of HCLK clock cycles ที่ถูกเพิ่มไปยัง the memory access หลังจาก WAIT ถูกปลดปล่อยโดย the asynchronous memory (เป็นอิสระจากกรณีข้างบน).

(https://i.imgur.com/pyH0mzA.png)

(https://i.imgur.com/DEhg3Xa.png)
Title: Re: STM32F1 FSMC
Post by: tha on January 01, 2021, 09:47:22 am
21.5.5 Synchronous transactions

The memory clock, CLK, คือ a submultiple of HCLK สอดคล้องกันกับ the value of parameter CLKDIV.

NOR Flash memories ระบุ a minimum time จาก NADV assertion ไปยัง CLK high. เพื่อตรงตามข้อจำกัดนี้, the FSMC ไม่ได้ปล่อย the clock ไปยัง the memory ในระหว่าง the first internal clock cycle of the synchronous access (ก่อน NADV assertion). นี้กะรันตีว่า the rising edge of the memory clock เกิดขึ้นใน the middle of the NADV low pulse.

Data latency versus NOR Flash latency

The data latency คือ the number of cycles เพื่อ wait ก่อนการสุ่มจับ the data. The DATLAT value ต้องสอดคล้องกับ the latency value ที่ระบุใน the NOR Flash configuration register. The FSMC ไม่ได้รวม the clock cycle เมื่อ NADV เป็น low ใน the data latency count.

Caution: บาง NOR Flash memories รวม the NADV Low cycle ไว้ใน the data latency count, ดังนั้น the exact
                 relation ระหว่าง the NOR Flash latency and the FMSC DATLAT parameter สามารถเป็นอย่างใดอย่างหนึ่งของ:
                 •    NOR Flash latency = (DATLAT + 2) CLK clock cycles
                 •    NOR Flash latency = (DATLAT + 3) CLK clock cycles

Some recent memories ยืนยัน NWAIT ในระหว่าง the latency phase. ในกรณีอย่างนี้ DATLAT สามารถถูกเซ็ตไปยังค่าต่ำสุดของมัน. เป็นผลให้, the FSMC สุ่มจับ the data และคอยยาวเพียงพอที่จะตีค่าถ้า the data ถูกต้อง. ดังนั้น the FSMC ตรวจพบเมื่อ the memory ออกจาก latency และ real data เอามา.

memories อื่นๆจะไม่ยืนยัน NWAIT ในระหว่าง latency. ในกรณีนี้ the latency ต้องถูกเซ็ตอย่างถูกต้องสำหรับทั้ง the FSMC and the memory, มิฉะนั้น invalid data จะเข้าใจผิดว่าเป็น good data, หรือ valid data จะสูญหายใน the initial phase ของ the memory access.
Title: Re: STM32F1 FSMC
Post by: tha on January 01, 2021, 10:46:38 am
Single-burst transfer

เมื่อ the selected bank ถูกกำหนดค่าใน burst mode สำหรับ synchronous accesses, ถ้าตัวอย่างเช่น an AHB single-burst transaction ถูกต้องการบน 16-bit memories, the FSMC ดำเนินการ a burst transaction ของความยาว 1 (ถ้า the AHB transfer คือ 16-bit), หรือความยาว 2 (ถ้า the AHB transfer คือ 32-bit) และยกเลิกการยืนยัน the chip select signal เมื่อ the last data ถูก strobed.

เห็นได้ชัดว่า, a transfer ดังกล่าวไม่มี the most efficient ใน terms of cycles (เปรียบเทียบกับ an asynchronous read). อย่างไรก็ตาม, a random asynchronous access จะต้องการเป็นอันดับแรกที่จะตั้งโปรแกรม the memory access mode ใหม่, ซึ่งจะอยู่ได้นานขึ้น.
Title: Re: STM32F1 FSMC
Post by: tha on January 01, 2021, 10:57:12 am
Cross boundary page for Cellular RAM 1.5

Cellular RAM 1.5 ไม่อนุญาติ burst access เพื่อข้าม the page boundary. The FSMC controller อนุญาติที่จะแยกโดยอัตโนมัติy the burst access เมื่อ the memory page size ถูกบรรลุผลสำเร็จโดยการกำหนดค่า the CPSIZE bits ใน the FSMC_BCR1 register ตามหลัง the memory page size.
Title: Re: STM32F1 FSMC
Post by: tha on January 01, 2021, 04:52:10 pm
Wait management

สำหรับ synchronous NOR Flash memories, NWAIT ถูกตีค่าหลังจาก the programmed latency period, (DATLAT+2) CLK clock cycles.

ถ้า NWAIT ถูก sensed active (low level เมื่อ WAITPOL = 0, high level เมื่อ WAITPOL = 1), wait states ถูกแทรกจนกระทั่ง NWAIT ถูก sensed inactive (high level เมื่อ WAITPOL = 0, low level เมื่อ WAITPOL = 1).

เมื่อ NWAIT เป็น inactive, the data ถูกพิจารณาว่าถูกต้องทันที (bit WAITCFG = 1) หรือบน the next clock edge (bit WAITCFG = 0) อย่างใดอย่างหนึ่ง.

ในระหว่าง wait-state insertion โดยทาง the NWAIT signal, the controller ยังคงส่ง clock pulses ไปยัง the memory, ทำให้ the chip select and output enable signals ใช้ได้, และไม่ได้พิจารณาว่า the data ใช้ได้.

มี two timing configurations สำหรับ the NOR Flash NWAIT signal ใน burst mode:
•    Flash memory ยืนยัน the NWAIT signal หนึ่ง data cycle ก่อน the wait state (ค่าเริ่มต้นหลังจาก reset)
•    Flash memory ยืนยัน the NWAIT signal ในระหว่าง the wait state

two NOR Flash wait state configurations นี้ถูกรองรับโดย the FSMC, เป็นรายไปสำหรับแต่ละ chip select, เพราะ the WAITCFG bit ใน the FSMC_BCRx registers (x = 0..3).

(https://i.imgur.com/tKcdN2t.png)

(https://i.imgur.com/LqkdrEa.png)
1. Byte lane outputs BL ไม่ถูกแสดง; สำหรับ NOR access, พวกมันเป็น high, and, สำหรับ PSRAM (CRAM) access, พวกมันเป็น low.
2. NWAIT polarity ถูกเซ็ตเป็น 0.

(https://i.imgur.com/kacBsVx.png)

(https://i.imgur.com/3xh4Gtn.png)

(https://i.imgur.com/Az1jEeF.png)
1. Memory ต้องส่งออก NWAIT signal หนึ่ง cycle ล่วงหน้า, สอดคล้องกัน WAITCFG ต้องถูกโปรแกรมเป็น 0.
2. NWAIT polarity ถูกเซ็ตเป็น 0.
3. Byte Lane (NBL) outputs ไม่ถูกแสดง, พวกมันเป็น low ในขณะที่ NEx is active.

(https://i.imgur.com/MmyG5HF.png)

(https://i.imgur.com/aYplQx6.png)
Title: Re: STM32F1 FSMC
Post by: tha on January 02, 2021, 06:49:56 am
21.5.6 NOR/PSRAM control registers

The NOR/PSRAM control registers ต้องถูกเข้าถึงโดย words (32 bits).

SRAM/NOR-Flash chip-select control registers 1..4 (FSMC_BCR1..4)

Address offset: 0xA000 0000 + 8 * (x – 1), x = 1...4
Reset value: 0x0000 30DB for Bank1 and 0x0000 30D2 for Bank 2 to 4

register นี้บรรจุ the control information ของแต่ละ memory bank, ใช้สำหรับ SRAMs, PSRAM and NOR Flash memories.

(https://i.imgur.com/sYSW2Fb.png)

Bits 31: 20 Reserved, must be kept at reset value.

Bit 19 CBURSTRW: Write burst enable.
สำหรับ Cellular RAM (PSRAM) memories, บิตนี้เปิดการใช้งาน the synchronous burst protocol ในระหว่าง write operations. The enable bit สำหรับ synchronous read accesses คือ the BURSTEN bit ใน the FSMC_BCRx register.
     0: Write operations ถูกดำเนินการใน asynchronous mode เสมอ
     1: Write operations ถูกดำเนินการใน synchronous mode.

Bits 18: 16 CPSIZE[2:0]: CRAM page size.
เหล่านี้ถูกใช้สำหรับ Cellular RAM 1.5 ซึ่งไม่ยอมให้ burst access ข้าม the address boundaries ระหว่าง pages. เมื่อบิตเหล่านี้ถูกกำหนดค่า, the FSMC controller แยก the burst access โดยอัตโนมัติเมื่อ the memory page size ถูกถึง (อ้างอิงถึง memory datasheet สำหรับ page size).
     000: ไม่มี burst split เมื่อข้าม page boundary (ค่าเริ่มต้นหลังจาก reset)
     001: 128 bytes
     010: 256 bytes
     011: 512 bytes
     100: 1024 bytes
     อื่นๆ: สงวนไว้.

Bit 15 ASYNCWAIT: Wait signal during asynchronous transfers
บิตนี้ enables/disables the FSMC เพื่อใช้ the wait signal แม้ในระหว่าง an asynchronous protocol.
     0: NWAIT signal ไม่ถูกคำนึงถึงเมื่อกำลังรัน an asynchronous protocol (ค่าเริ่มต้นหลังจาก reset)
     1: NWAIT signal ถูกคำนึงถึงเมื่อกำลังรัน an asynchronous protocol
Title: Re: STM32F1 FSMC
Post by: tha on January 02, 2021, 04:44:02 pm
Bit 14 EXTMOD: Extended mode enable.
บิตนี้เปิดการใช้งาน the FSMC เพื่อโปรแกรม the write timings สำหรับ non-multiplexed asynchronous accesses ภายใน the FSMC_BWTR register, ดังนั้นเป็นผลให้ different timings สำหรับ read and write operations.
     0: values ภายใน FSMC_BWTR register ไม่ถูกคำนึงถึง (ค่าเริ่มต้นหลังจาก reset)
     1: values inside FSMC_BWTR register ถูกคำนึงถึง
Note: เมื่อ the extended mode ถูก disabled, the FSMC สามารถทำงานใน Mode1 or Mode2 ดังต่อไปนี้:
           – Mode 1 คือ the default mode เมื่อ the SRAM/PSRAM memory type ถูกเลือก (MTYP [0:1]=0x0 or 0x01)
           – Mode 2 คือ the default mode เมื่อ the NOR memory type ถูกเลือก (MTYP [0:1]= 0x10).

Bit 13 WAITEN: Wait enable bit.
บิตนี้ enables/disables wait-state insertion โดยทาง the NWAIT signal เมื่อเข้าถึง the Flash memory ใน synchronous mode.
     0: NWAIT signal ถูก disabled ( level ของมันไม่ถูกคำนึงถึง, ไม่มี wait state ถูกแทรกหลังจาก the programmed Flash
          latency period)
     1: NWAIT signal ถูก enabled (level ของมันถูกคำนึงถึงหลังจาก the programmed Flash latency period แทรก wait
          states ถ้าถือสิทธิ์) (ค่าเริ่มต้นหลังจาก reset)

Bit 12 WREN: Write enable bit.
บิตนี้แสดงให้เห็นว่า write operations ถูก enabled/disabled ใน the bank โดย the FSMC:
     0: Write operations ถูก disabled ใน the bank โดย the FSMC, an AHB error ถูกรายงาน,
     1: Write operations ถูก enabled สำหรับ the bank โดย the FSMC (ค่าเริ่มต้นหลังจาก reset)
Title: Re: STM32F1 FSMC
Post by: tha on January 02, 2021, 05:50:46 pm
Bit 11 WAITCFG: Wait timing configuration.
The NWAIT signal แสดงให้เห็นว่า the data จาก the memory ใช้ได้หรือถ้า a wait state ต้องถูกแทรกเมื่อเข้าถึง the Flash memory ใน synchronous mode. configuration bit นี้ตัดสินว่าถ้า NWAIT ถูกถือสิทธิ์โดย the memory หนึ่ง clock cycle ก่อน the wait state หรือในระหว่าง the wait state:
     0: NWAIT signal is active หนึ่ง data cycle ก่อน wait state (default after reset),
     1: NWAIT signal is active ในระหว่าง wait state (ไม่ถูกใช้สำหรับ PRAM).

Bit 10 WRAPMOD: Wrapped burst mode support.
กำหนดว่า the controller จะแยกหรือไม่แยก an AHB burst wrap access ลงใน two linear accesses. ใช้ได้เฉพาะเมื่อเข้าถึง memories ใน burst mode
     0: Direct wrapped burst ไม่ถูก enabled (default after reset),
     1: Direct wrapped burst ถูก enabled.
Note: บิตนี้ไม่มีผลตาม the CPU and DMA ที่ไม่สามารถสร้าง wrapping burst transfers.

Bit 9 WAITPOL: Wait signal polarity bit.
กำหนด the polarity ของ the wait signal จาก memory. ใช้ได้เฉพาะเมื่อเข้าถึง memories ใน burst mode:
     0: NWAIT active low (default after reset),
     1: NWAIT active high.

Bit 8 BURSTEN: Burst enable bit.
บิตนี้ enables/disables synchronous accesses ในระหว่าง read operations. มันใช้ได้เฉพาะสำหรับ synchronous memories ทำงานใน burst mode:
     0: Burst mode disabled (default after reset). Read accesses ถูกดำเนินการใน asynchronous mode.
     1: Burst mode enable. Read accesses ถูกดำเนินการใน synchronous mode.
Title: Re: STM32F1 FSMC
Post by: tha on January 03, 2021, 04:40:11 am
Bit 7 Reserved, must be kept at reset value.

Bit 6 FACCEN: Flash access enable
เปิดการใช้งาน NOR Flash memory access operations.
     0: Corresponding NOR Flash memory access ถูก disabled
     1: Corresponding NOR Flash memory access ถูก enabled (default after reset)

Bits 5:4 MWID[1:0]: Memory databus width.
กำหนด the external memory device width, ใช้ได้สำหรับ all type of memories.
     00: 8 bits,
     01: 16 bits (default after reset),
     10: สงวนไว้, ห้ามใช้,
     11: สงวนไว้, ห้ามใช้.

Bits 3:2 MTYP[1:0]: Memory type.
กำหนด the type of external memory ที่ต่อถึง the corresponding memory bank:
     00: SRAM (ค่าเริ่มต้นหลังจาก reset for Bank 2...4)
     01: PSRAM (CRAM)
     10: NOR Flash(default after reset for Bank 1)
     11: reserved

Bit 1 MUXEN: Address/data multiplexing enable bit.
เมื่อบิตนี้ถูกเซ็ต, the address and data values ถูก multiplexed บน the databus, ใช้ได้เฉพาะกับ NOR and PSRAM memories:
     0: Address/Data nonmultiplexed
     1: Address/Data multiplexed on databus (default after reset)

Bit 0 MBKEN: Memory bank enable bit.
เปิดการใช้งาน the memory bank. หลังจากรีเซ็ต Bank1 ถูก enabled, อื่นๆทั้งหมดถูก disabled. การเข้าถึง a disabled bank เป็นเหตุให้เกิด an ERROR บน AHB bus.
     0: Corresponding memory bank ถูก disabled
     1: Corresponding memory bank ถูก enabled
Title: Re: STM32F1 FSMC
Post by: tha on January 03, 2021, 06:08:44 am
SRAM/NOR-Flash chip-select timing registers 1..4 (FSMC_BTR1..4)

Address offset: 0xA000 0000 + 0x04 + 8 * (x – 1), x = 1..4
Reset value: 0x0FFF FFFF

FSMC_BTRx bits ถูกเขียนโดย software เพื่อเพิ่ม a delay ที่ the end of a read /write transaction. delay นี้ยอมให้การจับคู่ the minimum time ระหว่าง consecutive transactions (tEHEL จาก NEx high ไปยัง FSMC_NEx low) และ the maximum time ที่ต้องการโดย the memory เพื่อปล่อยเป็นอิสระ the data bus หลังจาก a read access (tEHQZ).

register นี้บรรจุ the control information ของแต่ละ memory bank, ที่ใช้สำหรับr SRAMs, PSRAM and NOR Flash memories. ถ้า the EXTMOD bit ถูกเซ็ตใน the FSMC_BCRx register, ดังนั้น register นี้ถูกแยกสำหรับ write และ read access, นั่นคือ, 2 registers มีให้ใช้งาน: หนึ่งเพื่อกำหนดค่า read accesses (this register) และหนึ่งเพื่อกำหนดค่า write accesses
(FSMC_BWTRx registers).

(https://i.imgur.com/TlrOLLO.png)

Bits 31:30 Reserved, must be kept at reset value.

Bits 29:28 ACCMOD[1:0]: Access mode
ระบุ the asynchronous access modes ดังแสดงใน the timing diagrams. บิตเหล่านี้ถูกคำนึงถึงเฉพาะเมื่อ the EXTMOD bit ใน the FSMC_BCRx register เป็น 1.
     00: access mode A
     01: access mode B
     10: access mode C
     11: access mode D

Bits 27:24 DATLAT[3:0]: Data latency for synchronous NOR Flash memory (ดู note ข้างล่าง bit description table)
สำหรับ synchronous NOR Flash memory พร้อมด้วย burst mode ถูกเปิดการใช้งาน, กำหนดจำนวนของ memory clock cycles (+2) เพื่อปล่อยออกไปยัง the memory ก่อน reading/writing the first data. timing parameter นี้ไม่ถูกแสดงใน HCLK periods, แต่ใน FSMC_CLK periods. ในกรณีของ PSRAM (CRAM), field นี้ต้องถูกเซ็ตเป็น 0. ใน asynchronous NOR Flash หรือ SRAM หรือ PSRAM , ค่านี้ไม่ต้องสนใจ.
     0000: Data latency of 2 CLK clock cycles for first burst access
     1111: Data latency of 17 CLK clock cycles for first burst access (default value after reset)

Bits 23:20 CLKDIV[3:0]: Clock divide ratio (for FSMC_CLK signal)
กำหนดคาบเวลาของ of FSMC_CLK clock output signal, ที่แสดงในจำนวนของ HCLK cycles:
     0000: Reserved
     0001: FSMC_CLK period = 2 × HCLK periods
     0010: FSMC_CLK period = 3 × HCLK periods
     1111: FSMC_CLK period = 16 × HCLK periods (default value after reset)
ใน asynchronous NOR Flash, SRAM or PSRAM accesses, ค่านี้ไม่ต้องสนใจ.
Title: Re: STM32F1 FSMC
Post by: tha on January 03, 2021, 10:48:16 am
Bits 19:16 BUSTURN[3:0]: Bus turnaround phase duration
บิตเหล่านี้ถูกเขียนโดย software เพื่อเพิ่ม a delay ที่ the end ของ a write-to-read (และ read-to-write) transaction. The programmed bus turnaround delay ถูกแทรกระหว่าง an asynchronous read (muxed or D mode) หรือ a write transaction และ asynchronous/synchronous read หรือ write อื่นใดๆ ไปยัง/จาก a static bank (สำหรับ a read operation, the bank สามารถเป็นตัวเดียวกันหรือตัวต่างกันก็ได้; สำหรับ a write operation, the bank สามารถเป็นตัวต่างกันยกเว้นใน muxed or D mode).

ในบางกรณี, the bus turnaround delay ถูกคงที่, อย่างใดก็ตาม the programmed BUSTURN values:
– ไม่มี bus turnaround delay ถูกแทรกระหว่าง two consecutive asynchronous write transfers ไปยัง the same static memory bank ยกเว้นใน muxed and D mode.
– A bus turnaround delay ของ 1 FSMC clock cycle ถูกแทรกระหว่าง:
     – Two consecutive asynchronous read transfers ไปยัง the same static memory bank ยกเว้นสำหรับ muxed and D
        modes.
     – An asynchronous read ไปยัง an asynchronous หรือ synchronous write ไปยัง static bank ใดๆ หรือ dynamic bank
        ยกเว้นสำหรับ muxed and D modes.
     – An asynchronous (modes 1, 2, A, B or C) read และ a read operation จาก static bank อื่น.
– A bus turnaround delay of 2 FSMC clock cycles ถูกแทรกระหว่าง:
     – Two consecutive synchronous write accesses (in burst or single mode) ไปยัง the same bank
     – A synchronous write (burst or single) access และ an asynchronous write or read transfer ไปยังหรือจาก static
        memory bank (the bank สามารถเป็นตัวเดียวกันหรือตัวต่างกันก็ได้ในกรณีของ a read operation).
     – Two consecutive synchronous read accesses (in burst or single mode) ตามด้วย a synchronous/asynchronous
        read หรือ write ใดๆ จาก/ไปยัง static memory bank อื่น.
– A bus turnaround delay of 3 FSMC clock cycles ถูกแทรกระหว่าง:
     – Two consecutive synchronous write operations (in burst or single mode) ไปยัง static banks ตัวอื่น.
     – A synchronous write access (in burst or single mode) และ a synchronous read access จาก the same หรือไปยัง
        a different bank.
     0000: BUSTURN phase duration = 1 HCLK clock cycle ถูกเพิ่ม
     ...
     1111: BUSTURN phase duration = 16 × HCLK clock cycles (default value after reset)
Title: Re: STM32F1 FSMC
Post by: tha on January 03, 2021, 12:50:19 pm
Bits 15:8 DATAST[7:0]: Data-phase duration
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนด the duration ของ the data phase (อ้างอิงถึง Figure 187 ถึง Figure 199), ถูกใช้ใน asynchronous accesses:
     0000 0000: Reserved
     0000 0001: DATAST phase duration = 2 × HCLK clock cycles
     0000 0010: DATAST phase duration = 3 × HCLK clock cycles
     ...
     1111 1111: DATAST phase duration = 256 × HCLK clock cycles (default value after reset)
สำหรับแต่ละ memory type and access mode data-phase duration, อ้างอิงถึง the respective figure (Figure 187 to Figure 199).
Example: Mode1, read access, DATAST=1: Data-phase duration= DATAST+3 = 4 HCLK clock cycles.
Note: In synchronous accesses, ค่านี้ไม่ต้องสนใจ.

Bits 7:4 ADDHLD[3:0]: Address-hold phase duration
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนด the duration ของ the address hold phase (refer to Figure 196 to Figure 199), ถูกใช้ใน mode D and multiplexed accesses:
     0000: Reserved
     0001: ADDHLD phase duration = 2 × HCLK clock cycle
     0010: ADDHLD phase duration = 3 × HCLK clock cycle
     ...
     1111: ADDHLD phase duration = 16 × HCLK clock cycles (default value after reset)
สำหรับแต่ล access mode address-hold phase duration, refer to the respective figure (Figure 196 to Figure 199).
Example: ModeD, read access, ADDHLD=1: Address-hold phase duration = ADDHLD + 1 =2 HCLK clock cycles.
Note: In synchronous accesses, ค่านี้ไม่ถูกใช้, the address hold phase เป็น 1 memory clock period duration เสมอ.

Bits 3:0 ADDSET[3:0]: Address setup phase duration
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนด the duration ของ the address setup phase (refer to Figure 187 to Figure 199), ถูกใช้ใน SRAMs, ROMs and asynchronous NOR Flash and PSRAM accesses:
     0000: ADDSET phase duration = 1 × HCLK clock cycle
     ...
     1111: ADDSET phase duration = × HCLK clock cycles (default value after reset)
For each access mode address setup phase duration, refer to the respective figure (refer to Figure 187 to Figure 199).
Example: Mode2, read access, ADDSET=1: Address setup phase duration = ADDSET + 1 =
2 HCLK clock cycles.
Note: In synchronous NOR Flash and PSRAM accesses, ค่านี้ไม่ต้องสนใจ.

Note: PSRAMs (CRAMs) มี a variable latency เนื่องจาก internal refresh. ดังนั้น memories เหล่านี้ปล่อยออก the NWAIT
           signal ในระหว่าง the whole latency phase เพื่อยืดเวลา the latency ตามต้องการ.

           ในส่วน PSRAMs (CRAMs) the DATLAT field ต้องถูกเซ็ตเป็น 0, ดงนั้น the FSMC ออกจาก latency phase ของมันทันที
           และสตาร์ทการสุ่มจับ NWAIT จาก memory, จากนั้นสตาร์ทการ read or write เมื่อ the memory มีความพร้อม.

           วิธีนี้สามารถถูกใช้กับรุ่นล่าสุดของ synchronous Flash memories ได้อีกด้วย, ที่ปล่อยออก the NWAIT signal, ไม่เหมือน
           Flash memories รุ่นเก่ากว่า (เช็ค the datasheet of the specific Flash memory ที่ถูกใช้).
Title: Re: STM32F1 FSMC
Post by: tha on January 03, 2021, 05:07:45 pm
SRAM/NOR-Flash write timing registers 1..4 (FSMC_BWTR1..4)

Address offset: 0xA000 0000 + 0x104 + 8 * (x – 1), x = 1...4
Reset value: 0x0FFF FFFF

register นี้บรรจุ the control information ของแต่ละ memory bank, ที่ใช้สำหรับ SRAMs, PSRAM and NOR Flash memories. register นี้จะทำงานสำหรับ write asynchronous access เฉพาะเมื่อ the EXTMOD bit ถูกเซ็ตใน the FSMC_BCRx register

(https://i.imgur.com/PmBY1j0.png)

Bits 31:30 Reserved, must be kept at reset value.

Bits 29:28 ACCMOD[1:0]: Access mode
ระบุ the asynchronous access modes ดังแสดงใน the next timing diagrams. บิตเหล่านี้ถูกคำนึงถึงเฉพาะเมื่อ the EXTMOD bit ใน the FSMC_BCRx register เป็น 1.
     00: access mode A
     01: access mode B
     10: access mode C
     11: access mode D

Bits 27:20 Reserved, must be kept at reset value.

Bits 19:16 BUSTURN[3:0]: Bus turnaround phase duration
The programmed bus turnaround delay ถูกแทรกระหว่าง an asynchronous write transfer และ asynchronous/synchronous read หรือ write transfer อื่นใดๆ ไปยัง/จาก a static bank (สำหรับ a read operation, the bank สามารถเป็นตัวเดียวกันหรือตัวต่างกันก็ได้; สำหรับ a write operation, the bank สามารถเป็นตัวต่างกันยกเว้นใน muxed or D mode).

ในบางกรณี, the bus turnaround delay ถูกคงที่, อย่างใดก็ตาม the programmed BUSTURN values:
– ไม่มี bus turnaround delay ถูกแทรกระหว่าง two consecutive asynchronous write transfers ไปยัง the same static memory bank ยกเว้นใน muxed and D mode.
– A bus turnaround delay ของ 2 FSMC clock cycle ถูกแทรกระหว่าง:
      – Two consecutive synchronous write accesses (in burst or single mode) ไปยัง the same bank
      – A synchronous write transfer (in burst or single mode) และ an asynchronous write or read transfer ไปยังหรือ
         จาก static memory bank
– A bus turnaround delay of 3 FSMC clock cycles ถูกแทรกระหว่าง:
     – Two consecutive synchronous write accesses (in burst or single mode) ไปยัง static banks ตัวอื่น.
     – A synchronous write transfer (in burst or single mode) และ a synchronous read จาก the same หรือจาก a
        different bank.
     0000: BUSTURN phase duration = 1 HCLK clock cycle ถูกเพิ่ม
     ...
     1111: BUSTURN phase duration = 16 HCLK clock cycles added (default value after reset)
Title: Re: STM32F1 FSMC
Post by: tha on January 03, 2021, 06:06:52 pm
Bits 15:8 DATAST[7:0]: Data-phase duration.
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนด the duration ของ the data phase (อ้างอิงถึง Figure 187 ถึง Figure 199), ถูกใช้ใน asynchronous SRAM, PSRAM and NOR Flash memory accesses:
     0000 0000: Reserved
     0000 0001: DATAST phase duration = 2 × HCLK clock cycles
     0000 0010: DATAST phase duration = 3 × HCLK clock cycles
     ...
     1111 1111: DATAST phase duration = 16 × HCLK clock cycles (default value after reset)
Note: In synchronous accesses, ค่านี้ไม่ต้องสนใจ.

Bits 7:4 ADDHLD[3:0]: Address-hold phase duration.
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนด the duration ของ the address hold phase (refer to Figure 196 to Figure 199), ถูกใช้ใน asynchronous multiplexed accesses:
     0000: Reserved
     0001: ADDHLD phase duration = 2 × HCLK clock cycle
     0010: ADDHLD phase duration = 3 × HCLK clock cycle
     ...
     1111: ADDHLD phase duration = 16 × HCLK clock cycles (default value after reset)
Note: In synchronous NOR Flash accesses, ค่านี้ไม่ถูกใช้, the address hold phase คือ 1 Flash clock period duration
          เสมอ.

Bits 3:0 ADDSET[3:0]: Address setup phase duration.
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนด the duration ของ the address setup phase ใน HCLK cycles (refer to Figure 196 to Figure 199), ถูกใช้ใน asynchronous accessed:
     0000: ADDSET phase duration = 1 × HCLK clock cycle
     ...
     1111: ADDSET phase duration = 16 × HCLK clock cycles (default value after reset)
Note: In synchronous NOR Flash and PSRAM accesses, ค่านี้ไม่ต้องสนใจ.
Title: Re: STM32F1 FSMC
Post by: tha on January 04, 2021, 06:50:13 am
21.6 NAND Flash/PC Card controller

The FSMC สร้าง the appropriate signal timings เพื่อขับ device ประเภทต่อไปนี้:
• NAND Flash
– 8-bit
– 16-bit
• 16-bit PC Card compatible devices

The NAND/PC Card controller สามารถควบคุม three external banks. Bank 2 and bank 3 รองรับ NAND Flash devices. Bank 4 รองรับ PC Card devices.

แต่ละ bank ถูกกำหนดค่าโดยวิธีของ dedicated registers (Section 21.6.8 ). The programmable memory parameters รวมถึง access timings (แสดงใน Table 129) and ECC configuration.

(https://i.imgur.com/lGxf7Kt.png)
Title: Re: STM32F1 FSMC
Post by: tha on January 04, 2021, 07:32:58 am
21.6.1 External memory interface signals

ตารางต่อไปนี้แสดงรายการ the signals ที่มักถูกใช้เพื่อเชื่อมต่อ NAND Flash and PC Card.

คำเตือน: เมื่อใช้ a PC Card หรือ a CompactFlash ใน I/O mode, the NIOS16 input pin ต้องยังคงอยู่ที่ ground level ในระหว่าง
               การทำงานทั้งหมด, มิฉะนั้นe the FSMC อาจไม่ทำงานอย่างเหมาะสม. นี้หมายความว่า the NIOS16 input pin ต้องไม่ถูกต่อ
               ถึง the card, แต่จะต่อโดยตรงถึง ground (เฉพาะ 16-bit accesses ที่ถูกยอมให้).

Note: คำนำหน้า “N”. ระบุ the associated signal เป็น active low.

(https://i.imgur.com/dLHKesy.png)

ไม่มี theoretical capacity limitation ดังที่ the FSMC สามารถจัดการ address cycles ได้มากมายตามต้องการ.

(https://i.imgur.com/FPBe61p.png)
Title: Re: STM32F1 FSMC
Post by: tha on January 04, 2021, 09:17:25 am
21.6.2 NAND Flash / PC Card supported memories and transactions

Table 133 ข้างล่างแสดง the supported devices, access modes and transactions. Transactions ที่ไม่ยอมให้ (หรือไม่ถูกรองรับ) โดย the NAND Flash / PC Card controller จะปรากฎในสีเทา.

(https://i.imgur.com/BQvlDE4.png)
Title: Re: STM32F1 FSMC
Post by: tha on January 04, 2021, 09:37:55 am
21.6.3 Timing diagrams for NAND and PC Card

แต่ละ PC Card/CompactFlash and NAND Flash memory bank ถูกจัดการผ่านทางชุดของ registers:
•    Control register: FSMC_PCRx
•    Interrupt status register: FSMC_SRx
•    ECC register: FSMC_ECCRx
•    Timing register for Common memory space: FSMC_PMEMx
•    Timing register for Attribute memory space: FSMC_PATTx
•    Timing register for I/O space: FSMC_PIOx

แต่ละ timing configuration register บรรจุ three parameters ถูกใช้เพื่อกำหนดจำนวนของ HCLK cycles สำหรับ the three phases ของ any PC Card/CompactFlash or NAND Flash access, บวก one parameter ที่กำหนด the timing สำหรับสตาร์ทการขับ the databus ในกรณีของ a write. Figure 205 แสดง the timing parameter definitions สำหรับ common memory accesses, รู้ไว้ว่า Attribute และ I/O (เฉพาะสำหรับ PC Card) memory space access timings จะคล้ายกัน.

(https://i.imgur.com/CefvaZ3.png)
1. NOE ยังคง high (inactive) ในระหว่าง write access. NWE ยังคง high (inactive) ในระหว่าง read access.
2. NCEx ไปเป็น low ทันทีที่ NAND access ถูกร้องขอและยังคง low จนกระทั่ง a different(ตัวอื่น) memory bank ถูกเข้าถึง.
Title: Re: STM32F1 FSMC
Post by: tha on January 04, 2021, 02:55:55 pm
21.6.4 NAND Flash operations

The command latch enable (CLE) และ address latch enable (ALE) signals ของ the NAND Flash device ถูกขับโดย some address signals ของ the FSMC controller. นี้หมายความว่าเพื่อส่ง a command หรือ an address ไปยัง the NAND Flash memory, the CPU ต้องดำเนินการ a write ไปยัง a certain address ใน memory space ของมัน.

A typical page read operation จาก the NAND Flash device ทำดังต่อไปนี้ :
1.    โปรแกรมและเปิดการใช้งาน the corresponding memory bank โดยการกำหนดค่า the FSMC_PCRx and FSMC_PMEMx
       (และสำหรับบาง devices, FSMC_PATTx, ดู Section 21.6.5) registers สอดคล้องกันกับคุณสมบัติของ the NAND Flash
       (PWID bits สำหรับ the databus width ของ the NAND Flash, PTYP = 1, PWAITEN = 0 or 1 ตามต้องการ, ดู Common
       memory space timing register 2..4 (FSMC_PMEM2..4) สำหรับ timing configuration).
2.    The CPU ดำเนินการ a byte write ใน the common memory space, ด้วย data byte ที่เท่ากับ one Flash command
       byte (ตัวอย่างเช่น 0x00 สำหรับ Samsung NAND Flash devices). The CLE input ของ the NAND Flash is active ใน
       ระหว่าง the write strobe (low pulse บน NWE), ดังนั้น the written byte ถูกตีความว่าเป็น a command โดย the NAND
       Flash. เมื่อ the command ถูก latched โดย the NAND Flash device, มันไม่จำเป็นที่ต้องถูกเขียนสำหรับ the following
       page read operations.
3.    The CPU สามารถส่ง the start address (STARTAD) สำหรับ a read operation โดยการเขียน the required bytes (ตัวอย่าง
       เช่น four bytes หรือ three สำหรับ smaller capacity devices), STARTAD[7:0], STARTAD[15:8], STARTAD[23:16]
       และสุดท้าย STARTAD[25:24] สำหรับ 64 Mb x 8 bit NAND Flash) ใน the common memory หรือ attribute space.
       The ALE input of the NAND Flash device is active ในระหว่าง the write strobe (low pulse บน NWE), ดังนั้น the
       written bytes ถูกตีความว่าเป็น the start address สำหรับ read operations. การใช้ the attribute memory space ทำให้
       สามารถใช้ a different timing configuration ของ the FSMC, ซึ่งสามารถถูกใช้เพื่อทำให้เป็นผล the prewait functionality
       ที่ต้องการโดย some NAND Flash memories (ดูรายละเอียดใน Section 21.6.5).
4.    The controller คอยสำหรับ the NAND Flash มีความพร้อม (R/NB signal high) เพื่อจะ active, ก่อนการสตาร์ท a new
       access (ไปยังตัวเดียวกันหรือ memory bank ตัวอื่น). ขณะที่คอย, the controller จะรักษา the NCE signal active (low).
5.    The CPU สามารถจากนั้นดำเนินการ byte read operations ใน the common memory space เพื่ออ่าน the NAND Flash
       page (data field + Spare field) byte by byte.
6.    The next NAND Flash page สามารถถูกอ่านโดยปราศจาก any CPU command หรือ address write operation, ในสามวิธีที่
       ต่างกัน :
       –    โดยดำเนินการอย่างง่ายๆ the operation ที่อธิบายใน step 5
       –    a new random address สามารถถูกเข้าถึงโดยการรีสตาร์ท the operation ที่ step 3
       –    a new command สามารถถูกส่งไปยัง the NAND Flash device โดยการรีสตาร์ทที่ step 2
Title: Re: STM32F1 FSMC
Post by: tha on January 05, 2021, 06:53:23 am
21.6.5 NAND Flash prewait functionality

Some NAND Flash devices ต้องการว่า, หลังจากการเขียน the last part of the address, the controller คอยสำหรับr the R/NB signal ไปเป็น low ดังแสดงใน Figure 206.

(https://i.imgur.com/r8xDkfw.png)
5. CPU เขียน byte A25-A24 ที่ address 0x7802 0000: FSMC ดำเนินการ a write access โดยใช้ FSMC_PATT2 timing definition, ที่ ATTHOLD ? 7 (จัดให้มีว่า (7+1) ≥ HCLK = 112 ns > tWB max). นี้กะรันตีว่า NCE ยังคง low จนกระทั่ง R/NB ไปเป็น low และ high อีกครั้ง (เฉพาะถูกร้องขอสำหรับ NAND Flash memories ที่ NCE ไม่สนใจไม่ได้).

เมื่อ functionality นี้ถูกต้องการ, มันสามารถถูกกะรันตีโดยการโปรแกรม the MEMHOLD value เพื่อให้ตรงตาม the tWB timing. อย่างไรก็ตาม CPU read accesses ไปยัง the NAND Flash memory มี a hold delay of (MEMHOLD + 2) x HCLK cycles, ในขณะที่ CPU write accesses มี a hold delay of (MEMHOLD) x HCLK cycles.

เพื่อเอาชนะ timing constraint นี้, the attribute memory space สามารถถูกใช้โดยการโปรแกรม timing register ของมันด้วย an ATTHOLD value ที่ตรงตาม the tWB timing, และทิ้งให้ the MEMHOLD value อยู่ที่ค่าต่ำสุดของมัน. ดังนั้น, the CPU ต้องใช้ the common memory space สำหรับ all NAND Flash read and write accesses, ยกเว้นเมื่อเขียน the last address byte ไปยัง the NAND Flash device, ที่ the CPU ต้องเขียนไปยัง the attribute memory space.
Title: Re: STM32F1 FSMC
Post by: tha on January 05, 2021, 08:58:48 am
21.6.6 Computation of the error correction code (ECC) in NAND Flash memory

The FSMC PC-Card controller ได้รวมเอา two error correction code computation hardware blocks, หนึ่งต่อ memory bank. พวกมันถูกใช้เพื่อลด the host CPU workload เมื่อประมวลผล the error correction code โดย software ใน the system.

two registers นี้เหมือนกันและเกี่ยวข้องกันกับ bank 2 and bank 3, ตามลำดับ. เป็นผลให้, ไม่มี hardware ECC computation มีให้ใช้สำหรับ memories ที่ต่อถึง bank 4.

The error correction code (ECC) algorithm ถูกทำให้เป็นผลใน the FSMC สามารถดำเนินการ 1-bit error correction และ 2-bit error detection ต่อ 256, 512, 1 024, 2 048, 4 096 or 8 192 bytes อ่านจาก or เขียนถึง NAND Flash memory. มันอยู่บนฐานของ the Hamming coding algorithm และประกอบด้วยการคำนวณ the row and column parity.

The ECC modules เฝ้ามอง the NAND Flash databus และ read/write signals (NCE and NWE) แต่ละเวลาที่ the NAND Flash memory bank is active.

The functional operations คือ:
•    เมื่อเข้าถึงไปยัง NAND Flash ถูกทำถึง bank 2 or bank 3, the data ที่ปรากฎบน the D[15:0] bus ถูก latched และถูกใช้
      สำหรับ ECC computation.
•    เมื่อเข้าถึงไปยัง NAND Flash เกิดขึ้นที่ address อื่นใดๆ, the ECC logic ไม่ได้ใช้งาน, และไม่ได้ดำเนินการการทำงานใดๆ. ดังนั้น,
      write operations สำหรับกำหนด commands หรือ addresses ไปยัง NAND Flash จะไม่ถูกคำนึงถึงสำหรับ ECC computation.

เมื่อจำนวนที่ต้องการของ bytes ได้ถูกอ่านจาก/เขียนถึง the NAND Flash แล้วโดย the host CPU, the FSMC_ECCR2/3 registers ต้องถูกอ่านเพื่อดึงข้อมูลค่าที่คำนวณ. เมื่ออ่าน, พวกมันควรถูกเคลียร์โดยการรีเซ็ต the ECCEN bit เป็นศูนย์. เพื่อคำนวณ a new data block, the ECCEN bit ต้องถูกเซ็ตเป็นหนึ่งใน the FSMC_PCR2/3 registers.

เพื่อดำเนินการ an ECC computation:
1.    Enable the ECCEN bit in the FSMC_PCR2/3 register.
2.    เขียน data ไปยัง the NAND Flash memory page. ขณะที่ the NAND page ถูกเขียน, the ECC block คำนวณ the ECC
       value.
3.    อ่าน the ECC value ที่มีให้ใช้ใน the FSMC_ECCR2/3 register และเก็บมันไว้ในตัวแปร.
4.    เคลียร์ the ECCEN bit และจากนั้น enable มันใน the FSMC_PCR2/3 register ก่อนอ่านกลับ the written data จาก the
       NAND page. ขณะที่ the NAND page ถูกอ่าน, the ECC block คำนวณ the ECC value.
5.    อ่าน the new ECC value ที่มีให้ใช้ใน the FSMC_ECCR2/3 register.
6.    ถ้า the two ECC values เหมือนกัน, ไม่มี correction ถูกต้องการ, มิฉะนั้นมี an ECC error และ the software correction
       routine ส่งคืนกลับ information ว่า the error สามารถถูกทำให้ถูกต้องได้หรือไม่.
Title: Re: STM32F1 FSMC
Post by: tha on January 05, 2021, 01:28:46 pm
21.6.7 PC Card/CompactFlash operations

Address spaces and memory accesses

The FSMC รองรับ Compact Flash storage หรือ PC Cards ใน Memory Mode and I/O Mode (True IDE mode ไม่ถูกรองรับ)

The Compact Flash storage and PC Cards ถูกทำมาจาก 3 memory spaces:
•    Common Memory Space
•    Attribute Space
•   I/O Memory Space

The nCE2 and nCE1 pins (FSMC_NCE4_2 and FSMC_NCE4_1 ตามลำดับ) เลือก the card และแสดงให้เห็นว่า a byte หรือ a word operation กำลังถูกดำเนินการ : nCE2 เข้าถึง the odd byte บน D15-8 และ nCE1 เข้าถึง the even byte บน D7-0 ถ้า A0=0 หรือ the odd byte บน D7-0 ถ้า A0=1. The full word ถูกเข้าถึงบน D15-0 ถ้าทั้ง nCE2 and nCE1 เป็น low.

The memory space ถูกเลือกโดยการถือสิทธิ์ low nOE สำหรับ read accesses หรือ nWE สำหรับ write accesses, ร่วมด้วย the low assertion ของ nCE2/nCE1 and nREG.
•    ถ้า pin nREG=1 ในระหว่าง the memory access, the common memory space ถูกเลือก
•    ถ้า pin nREG=0 ในระหว่าง the memory access, the attribute memory space ถูกเลือก

The I/O Space ถูกเลือกโดยการถือสิทธิ์ low nIORD สำหรับ read accesses หรือ nIOWR สำหรับ write accesses [แทนที่ nOE/nWE สำหรับ memory Space], ร่วมด้วย nCE2/nCE1. บันทึกไว้ว่า nREG ต้องถูกถือสิทธิ์ low อีกด้วยในระหว่างเข้าถึงไปยัง I/O Space.

Three type ของ accesses ถูกยอมให้สำหรับ a 16-bit PC Card:
•    เข้าถึงไปยัง Common Memory Space สำหรับ data storage สามารถเป็นอย่างใดอย่างหนึ่ง 8-bit accesses at even
      addresses หรือ 16 bit AHB accesses.
      บันทึกไว้ว่า 8-bit accesses at odd addresses ไม่ถูกรองรับและจะไม่นำมาซึ่ง the low assertion of nCE2. A 32-bit AHB
      request ถูกแปลลงใน two 16-bit memory accesses.
•    เข้าถึงไปยัง Attribute Memory Space ที่ the PC Card เก็บรักษา configuration information ถูกจำกัดที่ 8-bit AHB
      accesses at even addresses
      บันทึกไว้ว่า a 16-bit AHB access จะถูกแปลงลงใน a single 8-bit memory transfer: nCE1 จะถูกถือสิทธิ์ low, nCE2 จะถูก
      ถือสิทธิ์ high และเฉพาะ the even Byte บน D7-D0 จะถูกใช้ได้. แทน a 32-bit AHB access ที่จะถูกแปลงลงใน two 8-bit
      memory transfers at even addresses: nCE1 จะถูกถือสิทธิ์ low, NCE2 จะถูกถือสิทธิ์ high และเฉพาะ the even bytes จะ
      ถูกใช้ได้.
•    เข้าถึงไปยัง I/O Space สามารถถูกดำเนินการอย่างใดอย่างหนึ่งผ่านทาง AHB 8-bit หรือ 16-bit accesses.

(https://i.imgur.com/WAIQTyh.png)

The FSMC Bank 4 ให้เข้าถึงไปยัง 3 memory spaces เหล่านั้นดังอธิบายใน Section 21.4.2: NAND/PC Card address mapping and Table 102: Memory mapping and timing registers
Title: Re: STM32F1 FSMC
Post by: tha on January 05, 2021, 04:14:24 pm
Wait Feature

The CompactFlash Storage หรือ PC Card อาจร้องขอ the FSMC เพื่อยืดความยาวของ the access phase ที่โปรแกรมโดย MEMWAITx/ATTWAITx/IOWAITx bits, โดยถือสิทธ์ the nWAIT signal หลังจาก nOE/nWE หรือ nIORD/nIOWR activation ถ้า the wait feature ถูก enabled ผ่านทาง the PWAITEN bit in the FSMC_PCRx register. เพื่อตรวจจับ the nWAIT assertion อย่างถูกต้อง, the MEMWAITx/ATTWAITx/IOWAITx bits ต้องถูกโปรแกรมดังต่อไปนี้:

          xxWAITx >= 4 + max_wait_assertion_time/HCLK

ที่ max_wait_assertion_time คือ the maximum time ที่ใช้โดย NWAIT เพื่อไปเป็น low เมื่อ nOE/nWE or nIORD/nIOWR เป็น low.

หลังจากยกเลิกการถือสิทธิ์ของ nWAIT, the FSMC ยืดเวลา the WAIT phase ออกไป 4 HCLK clock cycles.
Title: Re: STM32F1 FSMC
Post by: tha on January 06, 2021, 07:00:40 am
21.6.8 NAND Flash/PC Card control registers

The NAND Flash/PC Card control registers ต้องถูกเข้าถึงโดย words (32 bits).

(https://i.imgur.com/WNxi1Su.png)

Bits 31:20 Reserved, must be kept at reset value.

Bits 19:17 ECCPS[2:0]: ECC page size.
กำหนด the page size สำหรับ the extended ECC:
     000: 256 bytes
     001: 512 bytes
     010: 1024 bytes
     011: 2048 bytes
     100: 4096 bytes
     101: 8192 bytes

Bits 16:13 TAR[2:0]: ALE to RE delay.
เซ็ต time จาก ALE low ถึง RE low ในจำนวนของ AHB clock cycles (HCLK).
Time คือ: t_ar = (TAR + SET + 4) x THCLK ที่ THCLK คือ the HCLK clock period
     0000: 1 HCLK cycle (ค่าเริ่มต้น)
     1111: 16 HCLK cycles
Note: SET คือ MEMSET หรือ ATTSET สอดคล้องกันกับ the addressed space.

Bits 12:9 TCLR[2:0]: CLE to RE delay.
เซ็ต time จาก CLE low ถึง RE low ในจำนวนของ AHB clock cycles (HCLK).
Time คือ t_clr = (TCLR + SET + 4) x THCLK ที่ THCLK คือ the HCLK clock period
     0000: 1 HCLK cycle (default)
     1111: 16 HCLK cycles
Note: SET คือ MEMSET หรือ ATTSET สอดคล้องกันกับ the addressed space.

Bits 8:7 Reserved, must be kept at reset value.

Bit 6 ECCEN: ECC computation logic enable bit
     0: ECC logic ถูก disabled และ reset (ค่าเริ่มต้นหลังจาก reset),
     1: ECC logic ถูก enabled.

Bits 5:4 PWID[1:0]: Databus width.
กำหนด the external memory device width.
     00: 8 bits
     01: 16 bits (ค่าเริ่มต้นหลังจาก reset). ค่านี้บังคับสำหรับ PC Cards.
     10: สงวนไว้, ห้านใช้
     11: reserved, do not use

Bit 3 PTYP: Memory type.
กำหนดชนิดของ device ที่ต่อกับ the corresponding memory bank:
     0: PC Card, CompactFlash, CF+ or PCMCIA
     1: NAND Flash (ค่าเริ่มต้นหลังจาก reset)

Bit 2 PBKEN: PC Card/NAND Flash memory bank enable bit.
เปิดการใช้งาน the memory bank. การเข้าถึง a disabled memory bank เป็นเหตุให้เกิด an ERROR บน AHB bus
     0: Corresponding memory bank ถูก disabled (default after reset)
     1: Corresponding memory bank ถูก enabled

Bit 1 PWAITEN: Wait feature enable bit.
เปิดการใช้งาน the Wait feature สำหรับ the PC Card/NAND Flash memory bank:
     0: ถูกปิดการใช้งาน
     1: ถูกเปิดการใช้งาน
Note: สำหรับ a PC Card, เมื่อ the wait feature ถูกเปิดการใช้งาน, the MEMWAITx/ATTWAITx/IOWAITx bits ต้องถูกโปรแกรม
           ด้วยค่าดังต่อไปนี้:
           xxWAITx ≥ 4 + max_wait_assertion_time/HCLK
           ที่ max_wait_assertion_time คือ the maximum time ที่ถูกใช้โดย NWAIT เพื่อไปเป็น low เมื่อ nOE/nWE หรือ
           nIORD/nIOWR เป็น low.

Bit 0 Reserved, must be kept at reset value.
Title: Re: STM32F1 FSMC
Post by: tha on January 06, 2021, 08:45:00 am
FIFO status and interrupt register 2..4 (FSMC_SR2..4)

Address offset: 0xA000 0000 + 0x44 + 0x20 * (x-1), x = 2..4
Reset value: 0x0000 0040

register นี้บรรจุ information เกี่ยวกับ FIFO status และ interrupt. The FSMC มี a FIFO ที่ถูกใช้เมื่อเขียนไปยัง memories เพื่อเก็ยรักษามากถึง16 words ของ data จาก the AHB. นี้ถูกใช้เพื่อเขียนอย่างรวดเร็วไปยัง the AHB และปล่อยเป็นอิสระมันสำหรับ transactions ไปยัง peripherals นอกเหนือจาก the FSMC, ในขณะที่ the FSMC กำลังระบายออก FIFO ของมันลงใน the memory. register มีหนึ่งของบิตของมันที่แสดงให้เห็น the status ของ the FIFO, สำหรับวัตถุประสงค์ ECC .
The ECC ถูกคำนวณขณะที่ the data ถูกเขียนไปยัง the memory, ดังนั้นเพื่ออ่าน the correct ECC the software ต้อง wait จนกระทั่ง the FIFO ว่างเปล่า.

(https://i.imgur.com/dMlaOhX.png)

Bits 31:7 Reserved, must be kept at reset value.

Bit 6 FEMPT: FIFO empty.
บิตที่อ่านได้เพียงอย่างเดียวที่จัดให้มี the status of the FIFO
     0: FIFO ไม่ว่างเปล่า
     1: FIFO ว่างเปล่า

Bit 5 IFEN: Interrupt falling edge detection enable bit
     0: Interrupt falling edge detection request ถูกปิดการใช้งาน
     1: Interrupt falling edge detection request ถูกเปิดการใช้งาน

Bit 4 ILEN: Interrupt high-level detection enable bit
     0: Interrupt high-level detection request ถูกปิดการใช้งาน
     1: Interrupt high-level detection request ถูกเปิดการใช้งาน

Bit 3 IREN: Interrupt rising edge detection enable bit
     0: Interrupt rising edge detection request ถูกปิดการใช้งาน
     1: Interrupt rising edge detection request ถูกเปิดการใช้งาน

Bit 2 IFS: Interrupt falling edge status
The flag ถูก set โดย hardware และ reset โดย software.
     0: ไม่มี interrupt falling edge เกิดขึ้น
     1: Interrupt falling edge เกิดขึ้น
Note: บิตนี้ถูกเซ็ตโดยการโปรแกรมมันเป็น 1 โดย software.

Bit 1 ILS: Interrupt high-level status
The flag ถูก set โดย hardware และ reset โดย software.
     0: ไม่มี Interrupt high-level เกิดขึ้น
     1: Interrupt high-level เกิดขึ้น

Bit 0 IRS: Interrupt rising edge status
The flag ถูก set โดย hardware และ reset โดย software.
     0: ไม่มี interrupt rising edge เกิดขึ้น
     1: Interrupt rising edge เกิดขึ้น
Note: บิตนี้ถูกเซ็ตโดยการโปรแกรมมันเป็น 1 โดย software.
Title: Re: STM32F1 FSMC
Post by: tha on January 06, 2021, 10:38:28 am
Common memory space timing register 2..4 (FSMC_PMEM2..4)

Address offset: Address: 0xA000 0000 + 0x48 + 0x20 * (x – 1), x = 2..4
Reset value: 0xFCFC FCFC

แต่ละ FSMC_PMEMx (x = 2..4) read/write register บรรจุ the timing information สำหรับ PC Card หรือ NAND Flash memory bank x, ถูกใช้เพื่อเข้าถึงไปยัง the common memory space ของ the 16-bit PC Card/CompactFlash, หรือเพื่อเข้าถึง the NAND Flash สำหรับ command, address write access และ data read/write access.

(https://i.imgur.com/jEKPK4r.png)

Bits 31:24 MEMHIZx[7:0]: Common memory x databus HiZ time
กำหนดจำนวนของ HCLK (+1 เฉพาะสำหรับ NAND) clock cycles ในระหว่างที่ the databus ถูกเก็บในไฮอิมพิแด๊นท์(HiZ) หลังจากการสตาร์ทของ a PC Card/NAND Flash write access ไปยัง common memory space บน socket x. ใช้ได้เฉพาะสำหรับ write transaction:
     0000 0000: 1 HCLK cycle
     1111 1110: 255 HCLK cycles
     1111 1111: Reserved

Bits 23:16 MEMHOLDx[7:0]: Common memory x hold time
สำหรับ NAND Flash read accesses ไปยัง the common memory space, บิตเหล่านี้กำหนดจำนวนของ (HCLK+2) clock cycles ในระหว่างที่ the address ถูกยึดไว้หลังจาก the command ถูกยกเลิกการถือสิทธิ์ (NWE, NOE).
สำหรับ NAND Flash write accesses ไปยัง the common memory space, บิตเหล่านี้กำหนดจำนวนของ HCLK clock cycles ในระหว่างที่ the data ถูกยึดไว้หลังจาก the command ถูกยกเลิกการถือสิทธิ์ (NWE, NOE).
     0000 0000: Reserved
     0000 0001: 1 HCLK cycle for write accesses, 3 HCLK cycles for read accesses
     1111 1110: 254 HCLK cycle for write accesses, 256 HCLK cycles for read accesses
     1111 1111: Reserved

Bits 15:8 MEMWAITx[7:0]: Common memory x wait time
กำหนดจำนวนต่ำสุดของ HCLK (+1) clock cycles เพื่อถือสิทธิ์ the command (NWE, NOE), สำหรับ PC Card/NAND Flash read หรือ write access ไปยัง common memory space บน socket x. The duration สำหรับ command assertion ถูกยืดเวลาถ้า the wait signal (NWAIT) is active (low) ที่ the end ของค่าที่โปรแกรมของ HCLK:
     0000 0000: Reserved
     0000 0001: 2 HCLK cycles (+ wait cycle ที่เพิ่มโดยการยกเลิกถือสิทธ์ของ NWAIT)
     1111 1110: 255 HCLK cycles (+ wait cycle ที่เพิ่มโดยการยกเลิกถือสิทธ์ของ NWAIT)
     1111 1111: Reserved.

Bits 7:0 MEMSETx[7:0]: Common memory x setup time
กำหนดจำนวนของ HCLK (+1 for PC Card, +2 for NAND) clock cycles เพื่อจัดตั้ง the address ก่อน the command assertion (NWE, NOE), สำหรับ PC Card/NAND Flash read or write access ไปยัง common memory space บน socket x:
     0000 0000: 1 HCLK cycle
     1111 1110: 255 HCLK cycles
     1111 1111: Reserved
Title: Re: STM32F1 FSMC
Post by: tha on January 06, 2021, 12:35:49 pm
Attribute memory space timing registers 2..4 (FSMC_PATT2..4)

Address offset: 0xA000 0000 + 0x4C + 0x20 * (x – 1), x = 2..4
Reset value: 0xFCFC FCFC

แต่ละ FSMC_PATTx (x = 2..4) read/write register บรรจุ the timing information สำหรับ PC Card/CompactFlash หรือ NAND Flash memory bank x. มันถูกใช้สำหรับ 8-bit เข้าถึงไปยัง the attribute memory space ของ the PC Card/CompactFlash หรือเพื่อเข้าถึง the NAND Flash สำหรับ the last address write access ถ้า the timing ต้องต่างจากที่การเข้าถึงก่อนหน้า (สำหรับ Ready/Busy management, อ้างอิงถึง Section 21.6.5: NAND Flash prewait functionality).

(https://i.imgur.com/U8yaPB9.png)

Bits 31:24 ATTHIZ[7:0]: Attribute memory x databus HiZ time
กำหนจำนวนของ HCLK clock cycles ในระหว่างที่ the databus ถูกเก็บในไฮอิมพิแด๊นท์(HiZ) หลังจากการสตาร์ทของ a PC Card/NAND Flash write access ไปยัง attribute memory space บน socket x. ใช้ได้เฉพาะสำหรับ write transaction:
     0000 0000: 0 HCLK cycle
     1111 1110: 255 HCLK cycles
     1111 1111: Reserved.

Bits 23:16 ATTHOLD[7:0]: Attribute memory x hold time
สำหรับ PC Card/NAND Flash read accesses ไปยัง attribute memory space บน socket x, บิตเหล่านี้กำหนดจำนวนของ HCLK clock cycles (HCLK+2) ในระหว่างที่ the address ถูกยึดไว้หลังจาก the command ถูกยกเลิกการถือสิทธิ์ (NWE, NOE).
สำหรับ PC Card/NAND Flash write accesses ไปยัง attribute memory space บน socket x, บิตเหล่านี้กำหนดจำนวนของ HCLK clock cycles ในระหว่างที่ the data ถูกยึดไว้หลังจาก the command ถูกยกเลิกการถือสิทธิ์ (NWE, NOE).
     0000 0000: reserved
     0000 0001: 1 HCLK cycle for write access, 3 HCLK cycles for read accesses
     1111 1110: 254 HCLK cycle for write access, 256 HCLK cycles for read accesses
     1111 1111: Reserved

Bits 15:8 ATTWAIT[7:0]: Attribute memory x wait time
กำหนดจำนวนต่ำสุดของ HCLK (+1) clock cycles เพื่อถือสิทธิ์ the command (NWE, NOE), สำหรับ PC Card/NAND Flash read หรือ write access ไปยัง attribute memory space บน socket x. The duration สำหรับ command assertion ถูกยืดเวลาถ้า the wait signal (NWAIT) is active (low) ที่ the end ของค่าที่โปรแกรมของ HCLK:
     0000 0000: Reserved
     0000 0001: 2 HCLK cycles (+ wait cycle ที่เพิ่มโดยการยกเลิกถือสิทธ์ของ NWAIT)
     1111 1111: 255 HCLK cycles (+ wait cycle ที่เพิ่มโดยการยกเลิกถือสิทธ์ของ NWAIT)
     1111 1111: Reserved.

Bits 7:0 ATTSET[7:0]: Attribute memory x setup time
กำหนจำนวนของ HCLK (+1 ) clock cycles เพื่อจัดตั้ง the address ก่อน the command assertion (NWE, NOE), สำหรับ PC Card/NAND Flash read หรือ write access ไปยัง attribute memory space บน socket x:
     0000 0000: 1 HCLK cycle
     1111 1110: 255 HCLK cycles
     1111 1111: Reserved.
Title: Re: STM32F1 FSMC
Post by: tha on January 06, 2021, 01:55:47 pm
I/O space timing register 4 (FSMC_PIO4)

Address offset: 0xA000 0000 + 0xB0
Reset value: 0xFCFCFCFC

The FSMC_PIO4 read/write registers บรรจุ the timing information ถูกใช้เพื่อให้บรรลุการเข้าถึงไปยัง the I/O space of the 16-bit PC Card/CompactFlash.

(https://i.imgur.com/B8RFti3.png)

Bits 31:24 IOHIZ[7:0]: I/O x databus HiZ time
กำหนดจำนวนของ HCLK clock cycles ในระหว่างที่ the databus ถูกเก็บในไฮอิมพิแด๊นท์(HiZ) หลังจากการสตาร์ทของ a PC Card write access ไปยัง I/O space บน socket x. ใช้ได้เฉพาะสำหรับ write transaction:
     0000 0000: 0 HCLK cycle
     1111 1111: 255 HCLK cycles (default value after reset)

Bits 23:16 IOHOLD[7:0]: I/O x hold time
กำหนดจำนวนของ HCLK clock cycles เพื่อยึด address (และ data สำหรับ write access) หลังจาก the command deassertion (NWE, NOE), สำหรับ PC Card read หรือ write access ไปยัง I/O space บน socket x:
     0000 0000: reserved
     0000 0001: 1 HCLK cycle
     1111 1111: 255 HCLK cycles (default value after reset)

Bits 15:8 IOWAIT[7:0]: I/O x wait time
กำหนดจำนวนต่ำสุดของ HCLK (+1) clock cycles เพื่อถือสิทธิ์ the command (SMNWE, SMNOE), สำหรับ PC Card read หรือ write access ไปยัง I/O space บน socket x. The duration สำหรับ command assertion ถูกยืดเวลาถ้า the wait signal (NWAIT) is active (low) ที่ the end ของค่าที่โปรแกรมของ HCLK:
     0000 0000: reserved, do not use this value
     0000 0001: 2 HCLK cycles (+ wait cycle ที่เพิ่มโดยการยกเลิกถือสิทธ์ของ NWAIT)
     1111 1111: 256 HCLK cycles (+ wait cycle ที่เพิ่มโดย the Card deasserting NWAIT) (default value after reset)

Bits 7:0 IOSET[7:0]: I/O x setup time
กำหนจำนวนของ HCLK (+1 ) clock cycles เพื่อจัดตั้ง the address ก่อน the command assertion (NWE, NOE), สำหรับ PC Card read หรือ write access ไปยัง I/O space บน socket x:
     0000 0000: 1 HCLK cycle
     1111 1111: 256 HCLK cycles (default value after reset)
Title: Re: STM32F1 FSMC
Post by: tha on January 06, 2021, 03:16:48 pm
ECC result registers 2/3 (FSMC_ECCR2/3)

Address offset: 0xA000 0000 + 0x54 + 0x20 * (x – 1), x = 2 or 3
Reset value: 0x0000 0000

registers เหล่านี้บรรจุ the current error correction code value ที่คำนวณโดย the ECC computation modules ของ the FSMC controller (one module ต่อ NAND Flash memory bank). เมื่อ the CPU อ่าน the data จาก a NAND Flash memory page ที่ the correct address (อ้างอิงถึง Section 21.6.6: Computation of the error correction code (ECC) in NAND Flash memory), the data อ่านจากหรือเขียนถึง the NAND Flash ถูก processed โดยอัตโนมัติโดย ECC computation module. ที่ the end ของ X bytes read (สอดคล้องกันกับ the ECCPS field ใน the FSMC_PCRx registers), the CPU ต้องอ่าน the computed ECC value จาก the FSMC_ECCx registers, และจากนั้นตรวจสอบว่า computed parity data เหล่านี้เป็นอย่างเดียวกันกับ the parity value ที่บันทึกใน the spare area, เพื่อตัดสินว่า a page ใช้ได้, และ, เพื่อถูกต้องมันถ้าใช้ประโยชน์ได้. The FSMC_ECCRx registers ควรถูกเคลียร์หลังจากได้อ่านแล้วโดยการเซ็ต the ECCEN bit เป็นศูนย์. เพื่อคำนวณ a new data block, the ECCEN bit ต้องถูกเซ็ตเป็นหนึ่ง.

(https://i.imgur.com/BLzjg3E.png)

Bits 31:0 ECCx[31:0]: ECC result
field นี้ให้ค่าที่คำนวณโดย the ECC computation logic. Table 135 ต่อจากนี้อธิบายเนื้อหาของฟิลด์บิตเหล่านี้.

(https://i.imgur.com/sQ9TY1G.png)
Title: Re: STM32F1 FSMC
Post by: tha on January 06, 2021, 03:21:07 pm
(https://i.imgur.com/l3WmnqT.png)

(https://i.imgur.com/NicvyQA.png)