⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nand_if.txt

📁 STM32外部SRAM用作datamemery的程序 开发环境MDK
💻 TXT
📖 第 1 页 / 共 3 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Obj\nand_if.o --depend=.\Obj\nand_if.d --device=DARMSTM --apcs=interwork -O3 -I..\..\include -I..\..\..\FWLib\library\inc -I..\..\..\USBLib\library\inc -I..\..\SRAM -I"D:\Program Files\MDK KEIL\ARM\INC\ST\STM32F10x" -D__MICROLIB --omf_browse=.\Obj\nand_if.crf ..\..\source\nand_if.c]
                          THUMB

                          AREA ||i.NAND_ConvertPhyAddress||, CODE, READONLY, ALIGN=1

                  NAND_ConvertPhyAddress PROC
;;;447    static NAND_ADDRESS NAND_ConvertPhyAddress (u32 Address)
;;;448    {
000000  b51c              PUSH     {r2-r4,lr}
;;;449      NAND_ADDRESS Address_t;
;;;450    
;;;451      Address_t.Page  = Address & (NAND_BLOCK_SIZE - 1);
000002  f001f001          AND      r2,r1,#0x1f
;;;452      Address_t.Block = Address / NAND_BLOCK_SIZE;
000006  0949              LSRS     r1,r1,#5
000008  f8adf8ad          STRH     r1,[sp,#2]
00000c  f8adf8ad          STRH     r2,[sp,#4]            ;451
;;;453      Address_t.Zone = 0;
000010  2100              MOVS     r1,#0
000012  f8adf8ad          STRH     r1,[sp,#0]
000016  f44ff44f          MOV      r2,#0x400
00001a  e008              B        |L1.46|
                  |L1.28|
;;;454    
;;;455      while (Address_t.Block >= MAX_PHY_BLOCKS_PER_ZONE)
;;;456      {
;;;457        Address_t.Block -= MAX_PHY_BLOCKS_PER_ZONE;
00001c  f5a1f5a1          SUB      r1,r1,#0x400
000020  f8adf8ad          STRH     r1,[sp,#2]
;;;458        Address_t.Zone++;
000024  f8bdf8bd          LDRH     r1,[sp,#0]
000028  1c49              ADDS     r1,r1,#1
00002a  f8adf8ad          STRH     r1,[sp,#0]
                  |L1.46|
00002e  f8bdf8bd          LDRH     r1,[sp,#2]            ;455
000032  4291              CMP      r1,r2                 ;455
000034  d2f2              BCS      |L1.28|
;;;459      }
;;;460      return Address_t;
000036  2206              MOVS     r2,#6
000038  4669              MOV      r1,sp
00003a  f7fff7ff          BL       __aeabi_memcpy
;;;461    }
00003e  bd1c              POP      {r2-r4,pc}
;;;462    
                          ENDP


                          AREA ||i.ReadSpareArea||, CODE, READONLY, ALIGN=1

                  ReadSpareArea PROC
;;;323    SPARE_AREA ReadSpareArea (u32 address)
;;;324    {
000000  b510              PUSH     {r4,lr}
000002  b088              SUB      sp,sp,#0x20
000004  4604              MOV      r4,r0
;;;325      SPARE_AREA t;
;;;326      u8 Buffer[16];
;;;327      NAND_ADDRESS address_s;
;;;328      address_s = NAND_ConvertPhyAddress(address);
000006  4668              MOV      r0,sp
000008  f7fff7ff          BL       NAND_ConvertPhyAddress
;;;329      FSMC_NAND_ReadSpareArea(Buffer , address_s, 1) ;
00000c  e9dde9dd          LDRD     r1,r2,[sp,#0]
000010  2301              MOVS     r3,#1
000012  a802              ADD      r0,sp,#8
000014  f7fff7ff          BL       FSMC_NAND_ReadSpareArea
;;;330    
;;;331      t = *(SPARE_AREA *)Buffer;
000018  e9dde9dd          LDRD     r0,r1,[sp,#8]
;;;332    
;;;333      return t;
00001c  e9cde9cd          STRD     r0,r1,[sp,#0x18]
000020  2206              MOVS     r2,#6
000022  a906              ADD      r1,sp,#0x18
000024  4620              MOV      r0,r4
000026  f7fff7ff          BL       __aeabi_memcpy
;;;334    }
00002a  b008              ADD      sp,sp,#0x20
00002c  bd10              POP      {r4,pc}
;;;335    
                          ENDP


                          AREA ||i.NAND_BuildLUT||, CODE, READONLY, ALIGN=2

                  NAND_BuildLUT PROC
;;;471    static u16 NAND_BuildLUT (u8 ZoneNbr)
;;;472    {
000000  e92de92d          PUSH     {r2-r8,lr}
000004  4680              MOV      r8,r0
;;;473    
;;;474      u16  pBadBlock, pCurrentBlock, pFreeBlock;
;;;475      SPARE_AREA  SpareArea;
;;;476      /*****************************************************************************
;;;477                                      1st step : Init.
;;;478      *****************************************************************************/
;;;479      /*Init the LUT (assume all blocks free) */
;;;480      for (pCurrentBlock = 0 ; pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE ; pCurrentBlock++)
000006  2000              MOVS     r0,#0
000008  f44ff44f          MOV      r1,#0x1000
00000c  4e31              LDR      r6,|L3.212|
00000e  108f              ASRS     r7,r1,#2
                  |L3.16|
;;;481      {
;;;482        LUT[pCurrentBlock] = FREE_BLOCK;  /* 12th bit is set to 1 */
000010  f826f826          STRH     r1,[r6,r0,LSL #1]
000014  1c40              ADDS     r0,r0,#1              ;480
000016  b280              UXTH     r0,r0                 ;480
000018  42b8              CMP      r0,r7                 ;480
00001a  d3f9              BCC      |L3.16|
;;;483      }
;;;484    
;;;485      /* Init Pointers */
;;;486      pBadBlock    = MAX_PHY_BLOCKS_PER_ZONE - 1;
00001c  f240f240          MOV      r5,#0x3ff
;;;487      pCurrentBlock = 0;
000020  2400              MOVS     r4,#0
                  |L3.34|
;;;488    
;;;489      /*****************************************************************************
;;;490                             2nd step : locate used and bad blocks
;;;491      *****************************************************************************/
;;;492    
;;;493      while (pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE)
;;;494      {
;;;495    
;;;496        SpareArea = ReadSpareArea(pCurrentBlock * NAND_BLOCK_SIZE + (ZoneNbr * NAND_BLOCK_SIZE * MAX_PHY_BLOCKS_PER_ZONE));
000022  0160              LSLS     r0,r4,#5
000024  eb00eb00          ADD      r1,r0,r8,LSL #15
000028  4668              MOV      r0,sp
00002a  f7fff7ff          BL       ReadSpareArea
;;;497    
;;;498        if ((SpareArea.DataStatus == 0) || (SpareArea.BlockStatus == 0))
00002e  f8bdf8bd          LDRH     r0,[sp,#2]
000032  b110              CBZ      r0,|L3.58|
000034  f8bdf8bd          LDRH     r0,[sp,#4]
000038  b9a0              CBNZ     r0,|L3.100|
                  |L3.58|
;;;499        {
;;;500    
;;;501          LUT[pBadBlock--]    |= pCurrentBlock | (u16)BAD_BLOCK ;
00003a  f836f836          LDRH     r0,[r6,r5,LSL #1]
00003e  f444f444          ORR      r1,r4,#0x2000
000042  4308              ORRS     r0,r0,r1
000044  f826f826          STRH     r0,[r6,r5,LSL #1]
;;;502          LUT[pCurrentBlock] &= (u16)~FREE_BLOCK;
000048  f836f836          LDRH     r0,[r6,r4,LSL #1]
00004c  1e6d              SUBS     r5,r5,#1              ;501
00004e  b2ad              UXTH     r5,r5                 ;501
000050  f420f420          BIC      r0,r0,#0x1000
000054  f826f826          STRH     r0,[r6,r4,LSL #1]
;;;503          if (pBadBlock == MAX_LOG_BLOCKS_PER_ZONE)
000058  f5b5f5b5          CMP      r5,#0x3e8
00005c  d117              BNE      |L3.142|
;;;504          {
;;;505            return NAND_FAIL;
00005e  2001              MOVS     r0,#1
                  |L3.96|
;;;506          }
;;;507        }
;;;508        else if (SpareArea.LogicalIndex != 0xFFFF)
;;;509        {
;;;510    
;;;511          LUT[SpareArea.LogicalIndex & 0x3FF] |= pCurrentBlock | VALID_BLOCK | USED_BLOCK;
;;;512          LUT[pCurrentBlock] &= (u16)( ~FREE_BLOCK);
;;;513        }
;;;514        pCurrentBlock++ ;
;;;515      }
;;;516    
;;;517      /*****************************************************************************
;;;518         3rd step : locate Free Blocks by scanning the LUT already built partially
;;;519      *****************************************************************************/
;;;520      pFreeBlock = 0;
;;;521      for (pCurrentBlock = 0 ; pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE ; pCurrentBlock++ )
;;;522      {
;;;523    
;;;524        if ( !(LUT[pCurrentBlock]& USED_BLOCK))
;;;525        {
;;;526          do
;;;527          {
;;;528            if (LUT[pFreeBlock] & FREE_BLOCK)
;;;529            {
;;;530    
;;;531              LUT [pCurrentBlock] |= pFreeBlock;
;;;532              LUT [pFreeBlock]   &= ~FREE_BLOCK;
;;;533              break;
;;;534            }
;;;535            pFreeBlock++;
;;;536          }
;;;537          while ( pFreeBlock < MAX_PHY_BLOCKS_PER_ZONE );
;;;538        }
;;;539      }
;;;540      return NAND_OK;
;;;541    }
000060  e8bde8bd          POP      {r2-r8,pc}
                  |L3.100|
000064  f8bdf8bd          LDRH     r0,[sp,#0]            ;508
000068  f5a0f5a0          SUB      r1,r0,#0xff00         ;508
00006c  39ff              SUBS     r1,r1,#0xff           ;508
00006e  d00e              BEQ      |L3.142|
000070  f3c0f3c0          UBFX     r0,r0,#0,#10          ;511
000074  f836f836          LDRH     r1,[r6,r0,LSL #1]     ;511
000078  f444f444          ORR      r2,r4,#0xc000         ;511
00007c  4311              ORRS     r1,r1,r2              ;511
00007e  f826f826          STRH     r1,[r6,r0,LSL #1]     ;511
000082  f836f836          LDRH     r0,[r6,r4,LSL #1]     ;512
000086  f420f420          BIC      r0,r0,#0x1000         ;512
00008a  f826f826          STRH     r0,[r6,r4,LSL #1]     ;512
                  |L3.142|
00008e  1c64              ADDS     r4,r4,#1              ;514
000090  b2a4              UXTH     r4,r4                 ;514
000092  42bc              CMP      r4,r7                 ;493
000094  d3c5              BCC      |L3.34|
000096  2000              MOVS     r0,#0                 ;520
000098  ea4fea4f          MOV.W    r1,r0                 ;521
                  |L3.156|
00009c  f836f836          LDRH     r2,[r6,r1,LSL #1]     ;524
0000a0  0413              LSLS     r3,r2,#16             ;524
0000a2  d411              BMI      |L3.200|
                  |L3.164|
0000a4  f836f836          LDRH     r3,[r6,r0,LSL #1]     ;528
0000a8  04db              LSLS     r3,r3,#19             ;528
0000aa  d509              BPL      |L3.192|
0000ac  4302              ORRS     r2,r2,r0              ;531
0000ae  f826f826          STRH     r2,[r6,r1,LSL #1]     ;531
0000b2  f836f836          LDRH     r2,[r6,r0,LSL #1]     ;532
0000b6  f422f422          BIC      r2,r2,#0x1000         ;532
0000ba  f826f826          STRH     r2,[r6,r0,LSL #1]     ;532
0000be  e003              B        |L3.200|
                  |L3.192|
0000c0  1c40              ADDS     r0,r0,#1              ;535
0000c2  b280              UXTH     r0,r0                 ;535
0000c4  42b8              CMP      r0,r7                 ;537
0000c6  d3ed              BCC      |L3.164|
                  |L3.200|
0000c8  1c49              ADDS     r1,r1,#1              ;521
0000ca  b289              UXTH     r1,r1                 ;521
0000cc  42b9              CMP      r1,r7                 ;521
0000ce  d3e5              BCC      |L3.156|
0000d0  2000              MOVS     r0,#0                 ;540
0000d2  e7c5              B        |L3.96|
;;;542    
                          ENDP

                  |L3.212|
0000d4  00000000          DCD      ||.bss||

                          AREA ||i.NAND_Init||, CODE, READONLY, ALIGN=2

                  NAND_Init PROC
;;;55     u16 NAND_Init(void)
;;;56     {
000000  b510              PUSH     {r4,lr}
;;;57       u16 Status = NAND_OK;
;;;58     
;;;59       FSMC_NAND_Init();
000002  f7fff7ff          BL       FSMC_NAND_Init
;;;60       Status = NAND_BuildLUT(0);
000006  2000              MOVS     r0,#0
000008  f7fff7ff          BL       NAND_BuildLUT
;;;61       Write_State = WRITE_IDLE;
00000c  4a01              LDR      r2,|L4.20|
00000e  2100              MOVS     r1,#0
000010  7011              STRB     r1,[r2,#0]  ; Write_State
;;;62       return Status;
;;;63     }
000012  bd10              POP      {r4,pc}
;;;64     
                          ENDP

                  |L4.20|
000014  00000000          DCD      ||.data||

                          AREA ||i.NAND_Copy||, CODE, READONLY, ALIGN=1

                  NAND_Copy PROC
;;;343    static u16 NAND_Copy (NAND_ADDRESS Address_Src, NAND_ADDRESS Address_Dest, u16 PageToCopy)
;;;344    {
000000  b51f              PUSH     {r0-r4,lr}
000002  f5adf5ad          SUB      sp,sp,#0x200
000006  9c86              LDR      r4,[sp,#0x218]
000008  e013              B        |L5.50|
                  |L5.10|
;;;345      u8 Copybuff[512];
;;;346      for ( ; PageToCopy > 0 ; PageToCopy-- )
;;;347      {
;;;348        FSMC_NAND_ReadSmallPage  ((u8 *)Copybuff, Address_Src , 1 );
00000a  2301              MOVS     r3,#1
00000c  4668              MOV      r0,sp
00000e  9a81              LDR      r2,[sp,#0x204]
000010  9980              LDR      r1,[sp,#0x200]
000012  f7fff7ff          BL       FSMC_NAND_ReadSmallPage
;;;349        FSMC_NAND_WriteSmallPage ((u8 *)Copybuff, Address_Dest, 1);
000016  2301              MOVS     r3,#1
000018  4668              MOV      r0,sp
00001a  9a83              LDR      r2,[sp,#0x20c]
00001c  9982              LDR      r1,[sp,#0x208]
00001e  f7fff7ff          BL       FSMC_NAND_WriteSmallPage
;;;350        FSMC_NAND_AddressIncrement(&Address_Src);
000022  a880              ADD      r0,sp,#0x200
000024  f7fff7ff          BL       FSMC_NAND_AddressIncrement
;;;351        FSMC_NAND_AddressIncrement(&Address_Dest);
000028  a882              ADD      r0,sp,#0x208
00002a  f7fff7ff          BL       FSMC_NAND_AddressIncrement
00002e  1e64              SUBS     r4,r4,#1              ;346
000030  b2a4              UXTH     r4,r4                 ;346
                  |L5.50|
000032  2c00              CMP      r4,#0                 ;346
000034  d1e9              BNE      |L5.10|
;;;352      }
;;;353    
;;;354      return NAND_OK;
000036  2000              MOVS     r0,#0
;;;355    }
000038  f50df50d          ADD      sp,sp,#0x210
00003c  bd10              POP      {r4,pc}
;;;356    
                          ENDP


                          AREA ||i.NAND_Write_Cleanup||, CODE, READONLY, ALIGN=2

                  NAND_Write_Cleanup PROC
;;;390    static u16 NAND_Write_Cleanup (void)
;;;391    {
000000  e92de92d          PUSH     {r4-r10,lr}
;;;392      u16  tempSpareArea [8];
;;;393      u16  Page_Back;
;;;394    
;;;395      if ( Block_State == OLD_BLOCK )
000004  f8dff8df          LDR      r9,|L6.268|
000008  2400              MOVS     r4,#0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -