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

📄 fsmc_nor.txt

📁 stm32.rar
💻 TXT
📖 第 1 页 / 共 2 页
字号:
                  |L3.102|
000066  0680              LSLS     r0,r0,#26             ;401
000068  d501              BPL      |L3.110|
00006a  2002              MOVS     r0,#2                 ;403
00006c  e7f9              B        |L3.98|
                  |L3.110|
00006e  b114              CBZ      r4,|L3.118|
000070  2e00              CMP      r6,#0                 ;375
000072  d1e1              BNE      |L3.56|
000074  e000              B        |L3.120|
                  |L3.118|
000076  2603              MOVS     r6,#3                 ;409
                  |L3.120|
000078  4630              MOV      r0,r6                 ;413
00007a  e7f2              B        |L3.98|
;;;415    
                          ENDP

                  |L3.124|
00007c  40011400          DCD      0x40011400

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

                  FSMC_NOR_EraseBlock PROC
;;;150    NOR_Status FSMC_NOR_EraseBlock(u32 BlockAddr)
;;;151    {
000000  b430              PUSH     {r4,r5}
;;;152      NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA);
000002  490a              LDR      r1,|L4.44|
000004  22aa              MOVS     r2,#0xaa
000006  f8a12556          STRH     r2,[r1,#0x556]
;;;153      NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);
00000a  2355              MOVS     r3,#0x55
00000c  800b              STRH     r3,[r1,#0]
;;;154      NOR_WRITE(ADDR_SHIFT(0x0555), 0x0080);
00000e  2480              MOVS     r4,#0x80
000010  f8a14556          STRH     r4,[r1,#0x556]
;;;155      NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA);
000014  f8a12556          STRH     r2,[r1,#0x556]
;;;156      NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);
000018  800b              STRH     r3,[r1,#0]
;;;157      NOR_WRITE((Bank1_NOR2_ADDR + BlockAddr), 0x30);
00001a  2130              MOVS     r1,#0x30
00001c  f10040c8          ADD      r0,r0,#0x64000000
000020  8001              STRH     r1,[r0,#0]
;;;158    
;;;159      return (FSMC_NOR_GetStatus(BlockErase_Timeout));
000022  bc30              POP      {r4,r5}
000024  f44f0020          MOV      r0,#0xa00000
000028  f7ffbffe          B.W      FSMC_NOR_GetStatus
;;;160    }
;;;161    
                          ENDP

                  |L4.44|
00002c  64000554          DCD      0x64000554

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

                  FSMC_NOR_EraseChip PROC
;;;171    {
;;;172      NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA);
000000  4809              LDR      r0,|L5.40|
000002  21aa              MOVS     r1,#0xaa
000004  f8a01556          STRH     r1,[r0,#0x556]
;;;173      NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);
000008  2255              MOVS     r2,#0x55
00000a  8002              STRH     r2,[r0,#0]
;;;174      NOR_WRITE(ADDR_SHIFT(0x0555), 0x0080);
00000c  2380              MOVS     r3,#0x80
00000e  f8a03556          STRH     r3,[r0,#0x556]
;;;175      NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA);
000012  f8a01556          STRH     r1,[r0,#0x556]
;;;176      NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);
000016  8002              STRH     r2,[r0,#0]
;;;177      NOR_WRITE(ADDR_SHIFT(0x0555), 0x0010);
000018  2110              MOVS     r1,#0x10
00001a  f8a01556          STRH     r1,[r0,#0x556]
;;;178    
;;;179      return (FSMC_NOR_GetStatus(ChipErase_Timeout));
00001e  f04f5040          MOV      r0,#0x30000000
000022  f7ffbffe          B.W      FSMC_NOR_GetStatus
;;;180    }
;;;181    
                          ENDP

000026  0000              DCW      0x0000
                  |L5.40|
000028  64000554          DCD      0x64000554

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

                  FSMC_NOR_WriteHalfWord PROC
000000  4a07              LDR      r2,|L6.32|
000002  23aa              MOVS     r3,#0xaa
000004  f8a23594          STRH     r3,[r2,#0x594]
000008  2355              MOVS     r3,#0x55
00000a  87d3              STRH     r3,[r2,#0x3e]
00000c  23a0              MOVS     r3,#0xa0
00000e  f8a23594          STRH     r3,[r2,#0x594]
000012  f10040c8          ADD      r0,r0,#0x64000000
000016  8001              STRH     r1,[r0,#0]
000018  0158              LSLS     r0,r3,#5
00001a  f7ffbffe          B.W      FSMC_NOR_GetStatus
                          ENDP

00001e  0000              DCW      0x0000
                  |L6.32|
000020  64000516          DCD      0x64000516

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

                  FSMC_NOR_WriteBuffer PROC
;;;212    NOR_Status FSMC_NOR_WriteBuffer(u16* pBuffer, u32 WriteAddr, u32 NumHalfwordToWrite)
;;;213    {
000000  b570              PUSH     {r4-r6,lr}
000002  4604              MOV      r4,r0
000004  460e              MOV      r6,r1
000006  4615              MOV      r5,r2
                  |L7.8|
;;;214      NOR_Status status = NOR_ONGOING; 
;;;215    
;;;216      do
;;;217      {
;;;218        /* Transfer data to the memory */
;;;219        status = FSMC_NOR_WriteHalfWord(WriteAddr, *pBuffer++);
000008  f8341b02          LDRH     r1,[r4],#2
00000c  4630              MOV      r0,r6
00000e  f7fffffe          BL       FSMC_NOR_WriteHalfWord
;;;220        WriteAddr = WriteAddr + 2;
000012  1cb6              ADDS     r6,r6,#2
;;;221        NumHalfwordToWrite--;
000014  1e6d              SUBS     r5,r5,#1
;;;222      }
;;;223      while((status == NOR_SUCCESS) && (NumHalfwordToWrite != 0));
000016  2800              CMP      r0,#0
000018  d101              BNE      |L7.30|
00001a  2d00              CMP      r5,#0
00001c  d1f4              BNE      |L7.8|
                  |L7.30|
;;;224      
;;;225      return (status); 
;;;226    }
00001e  bd70              POP      {r4-r6,pc}
;;;227    
                          ENDP


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

                  FSMC_NOR_ProgramBuffer PROC
;;;241    NOR_Status FSMC_NOR_ProgramBuffer(u16* pBuffer, u32 WriteAddr, u32 NumHalfwordToWrite)
;;;242    {       
000000  b4f0              PUSH     {r4-r7}
;;;243      u32 lastloadedaddress = 0x00;
;;;244      u32 currentaddress = 0x00;
;;;245      u32 endaddress = 0x00;
;;;246    
;;;247      /* Initialize variables */
;;;248      currentaddress = WriteAddr;
;;;249      endaddress = WriteAddr + NumHalfwordToWrite - 1;
000002  188d              ADDS     r5,r1,r2
000004  1e6d              SUBS     r5,r5,#1
;;;250      lastloadedaddress = WriteAddr;
;;;251    
;;;252      /* Issue unlock command sequence */
;;;253      NOR_WRITE(ADDR_SHIFT(0x00555), 0x00AA);
000006  26aa              MOVS     r6,#0xaa
000008  f04f44c8          MOV      r4,#0x64000000
00000c  460b              MOV      r3,r1                 ;250
00000e  f8a46aaa          STRH     r6,[r4,#0xaaa]
;;;254    
;;;255      NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);  
000012  2655              MOVS     r6,#0x55
000014  f8a46554          STRH     r6,[r4,#0x554]
;;;256    
;;;257      /* Write Write Buffer Load Command */
;;;258      NOR_WRITE(ADDR_SHIFT(WriteAddr), 0x0025);
000018  2725              MOVS     r7,#0x25
00001a  eb040641          ADD      r6,r4,r1,LSL #1
00001e  8037              STRH     r7,[r6,#0]
;;;259      NOR_WRITE(ADDR_SHIFT(WriteAddr), (NumHalfwordToWrite - 1));
000020  1e52              SUBS     r2,r2,#1
000022  8032              STRH     r2,[r6,#0]
;;;260    
;;;261      /* Load Data into NOR Buffer */
;;;262      while(currentaddress <= endaddress)
000024  e005              B        |L8.50|
                  |L8.38|
;;;263      {
;;;264        /* Store last loaded address & data value (for polling) */
;;;265        lastloadedaddress = currentaddress;
;;;266     
;;;267        NOR_WRITE(ADDR_SHIFT(currentaddress), *pBuffer++);
000026  f8302b02          LDRH     r2,[r0],#2
00002a  460b              MOV      r3,r1                 ;265
00002c  f8242011          STRH     r2,[r4,r1,LSL #1]
;;;268        currentaddress += 1; 
000030  1c49              ADDS     r1,r1,#1
                  |L8.50|
000032  42a9              CMP      r1,r5                 ;262
000034  d9f7              BLS      |L8.38|
;;;269      }
;;;270    
;;;271      NOR_WRITE(ADDR_SHIFT(lastloadedaddress), 0x29);
000036  2029              MOVS     r0,#0x29
000038  f8240013          STRH     r0,[r4,r3,LSL #1]
;;;272      
;;;273      return(FSMC_NOR_GetStatus(Program_Timeout));
00003c  bcf0              POP      {r4-r7}
00003e  f44f50a0          MOV      r0,#0x1400
000042  f7ffbffe          B.W      FSMC_NOR_GetStatus
;;;274    }
;;;275    
                          ENDP


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

                  FSMC_NOR_ReadHalfWord PROC
;;;284    {
;;;285      NOR_WRITE(ADDR_SHIFT(0x00555), 0x00AA); 
000000  4905              LDR      r1,|L9.24|
000002  22aa              MOVS     r2,#0xaa
000004  f8a12594          STRH     r2,[r1,#0x594]
;;;286      NOR_WRITE(ADDR_SHIFT(0x002AA), 0x0055);  
000008  2255              MOVS     r2,#0x55
00000a  87ca              STRH     r2,[r1,#0x3e]
;;;287      NOR_WRITE((Bank1_NOR2_ADDR + ReadAddr), 0x00F0 );
00000c  21f0              MOVS     r1,#0xf0
00000e  f10040c8          ADD      r0,r0,#0x64000000
000012  8001              STRH     r1,[r0,#0]
;;;288    
;;;289      return (*(vu16 *)((Bank1_NOR2_ADDR + ReadAddr)));
000014  8800              LDRH     r0,[r0,#0]
;;;290    }
000016  4770              BX       lr
;;;291    
                          ENDP

                  |L9.24|
000018  64000516          DCD      0x64000516

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

                  FSMC_NOR_ReadBuffer PROC
;;;302    void FSMC_NOR_ReadBuffer(u16* pBuffer, u32 ReadAddr, u32 NumHalfwordToRead)
;;;303    {
000000  b510              PUSH     {r4,lr}
;;;304      NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA);
000002  4b0b              LDR      r3,|L10.48|
000004  24aa              MOVS     r4,#0xaa
000006  f8a34594          STRH     r4,[r3,#0x594]
;;;305      NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);
00000a  2455              MOVS     r4,#0x55
00000c  87dc              STRH     r4,[r3,#0x3e]
;;;306      NOR_WRITE((Bank1_NOR2_ADDR + ReadAddr), 0x00F0);
00000e  24f0              MOVS     r4,#0xf0
000010  f04f43c8          MOV      r3,#0x64000000
000014  525c              STRH     r4,[r3,r1]
;;;307    
;;;308      for(; NumHalfwordToRead != 0x00; NumHalfwordToRead--) /* while there is data to read */
000016  2a00              CMP      r2,#0
000018  d009              BEQ      |L10.46|
;;;309      {
;;;310        /* Read a Halfword from the NOR */
;;;311        *pBuffer++ = *(vu16 *)((Bank1_NOR2_ADDR + ReadAddr));
00001a  bf00              NOP      
                  |L10.28|
00001c  f04f43c8          MOV      r3,#0x64000000
000020  5a5c              LDRH     r4,[r3,r1]
000022  4603              MOV      r3,r0
000024  1c80              ADDS     r0,r0,#2
;;;312        ReadAddr = ReadAddr + 2; 
000026  1c89              ADDS     r1,r1,#2
000028  801c              STRH     r4,[r3,#0]            ;311
00002a  1e52              SUBS     r2,r2,#1              ;308
00002c  d1f6              BNE      |L10.28|
                  |L10.46|
;;;313      }  
;;;314    }
00002e  bd10              POP      {r4,pc}
;;;315    
                          ENDP

                  |L10.48|
000030  64000516          DCD      0x64000516

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

                  FSMC_NOR_ReturnToReadMode PROC
;;;324    {
;;;325      NOR_WRITE(Bank1_NOR2_ADDR, 0x00F0);
000000  20f0              MOVS     r0,#0xf0
000002  f04f41c8          MOV      r1,#0x64000000
000006  8008              STRH     r0,[r1,#0]
;;;326    
;;;327      return (NOR_SUCCESS);
000008  2000              MOVS     r0,#0
;;;328    }
00000a  4770              BX       lr
;;;329    
                          ENDP


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

                  FSMC_NOR_Reset PROC
;;;339    {
;;;340      NOR_WRITE(ADDR_SHIFT(0x00555), 0x00AA); 
000000  21aa              MOVS     r1,#0xaa
000002  f04f40c8          MOV      r0,#0x64000000
000006  f8a01aaa          STRH     r1,[r0,#0xaaa]
;;;341      NOR_WRITE(ADDR_SHIFT(0x002AA), 0x0055); 
00000a  2155              MOVS     r1,#0x55
00000c  f8a01554          STRH     r1,[r0,#0x554]
;;;342      NOR_WRITE(Bank1_NOR2_ADDR, 0x00F0); 
000010  21f0              MOVS     r1,#0xf0
000012  8001              STRH     r1,[r0,#0]
;;;343    
;;;344      return (NOR_SUCCESS);
000014  2000              MOVS     r0,#0
;;;345    }
000016  4770              BX       lr
;;;346    
                          ENDP

⌨️ 快捷键说明

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