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

📄 fsmc_nor.txt

📁 STM32外部SRAM用作datamemery的程序 开发环境MDK
💻 TXT
📖 第 1 页 / 共 2 页
字号:
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(0x05555), 0x00AA);
000002  4909              LDR      r1,|L4.40|
000004  22aa              MOVS     r2,#0xaa
000006  800a              STRH     r2,[r1,#0]
;;;153      NOR_WRITE(ADDR_SHIFT(0x02AAA), 0x0055);
000008  4c08              LDR      r4,|L4.44|
00000a  2355              MOVS     r3,#0x55
00000c  8023              STRH     r3,[r4,#0]
;;;154      NOR_WRITE(ADDR_SHIFT(0x05555), 0x0080);
00000e  2580              MOVS     r5,#0x80
000010  800d              STRH     r5,[r1,#0]
;;;155      NOR_WRITE(ADDR_SHIFT(0x05555), 0x00AA);
000012  800a              STRH     r2,[r1,#0]
;;;156      NOR_WRITE(ADDR_SHIFT(0x02AAA), 0x0055);
000014  8023              STRH     r3,[r4,#0]
;;;157      NOR_WRITE((Bank1_NOR2_ADDR + BlockAddr), 0x30);
000016  2130              MOVS     r1,#0x30
000018  f100f100          ADD      r0,r0,#0x64000000
00001c  8001              STRH     r1,[r0,#0]
;;;158    
;;;159      return (FSMC_NOR_GetStatus(BlockErase_Timeout));
00001e  bc30              POP      {r4,r5}
000020  f44ff44f          MOV      r0,#0xa00000
000024  f7fff7ff          B.W      FSMC_NOR_GetStatus
;;;160    }
;;;161    
                          ENDP

                  |L4.40|
000028  6400aaaa          DCD      0x6400aaaa
                  |L4.44|
00002c  64005554          DCD      0x64005554

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

                  FSMC_NOR_EraseChip PROC
;;;170    NOR_Status FSMC_NOR_EraseChip(void)
;;;171    {
000000  b430              PUSH     {r4,r5}
;;;172      NOR_WRITE(ADDR_SHIFT(0x05555), 0x00AA);
000002  4808              LDR      r0,|L5.36|
000004  23aa              MOVS     r3,#0xaa
000006  8003              STRH     r3,[r0,#0]
;;;173      NOR_WRITE(ADDR_SHIFT(0x02AAA), 0x0055);
000008  4a07              LDR      r2,|L5.40|
00000a  2155              MOVS     r1,#0x55
00000c  8011              STRH     r1,[r2,#0]
;;;174      NOR_WRITE(ADDR_SHIFT(0x05555), 0x0080);
00000e  2480              MOVS     r4,#0x80
000010  8004              STRH     r4,[r0,#0]
;;;175      NOR_WRITE(ADDR_SHIFT(0x05555), 0x00AA);
000012  8003              STRH     r3,[r0,#0]
;;;176      NOR_WRITE(ADDR_SHIFT(0x02AAA), 0x0055);
000014  8011              STRH     r1,[r2,#0]
;;;177      NOR_WRITE(ADDR_SHIFT(0x05555), 0x0010);
000016  2110              MOVS     r1,#0x10
000018  8001              STRH     r1,[r0,#0]
;;;178    
;;;179      return (FSMC_NOR_GetStatus(ChipErase_Timeout));
00001a  bc30              POP      {r4,r5}
00001c  f04ff04f          MOV      r0,#0x30000000
000020  f7fff7ff          B.W      FSMC_NOR_GetStatus
;;;180    }
;;;181    
                          ENDP

                  |L5.36|
000024  6400aaaa          DCD      0x6400aaaa
                  |L5.40|
000028  64005554          DCD      0x64005554

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

                  FSMC_NOR_WriteHalfWord PROC
000000  b430              PUSH     {r4,r5}
000002  4a08              LDR      r2,|L6.36|
000004  23aa              MOVS     r3,#0xaa
000006  8013              STRH     r3,[r2,#0]
000008  4c07              LDR      r4,|L6.40|
00000a  2355              MOVS     r3,#0x55
00000c  f8a4f8a4          STRH     r3,[r4,#0x554]
000010  23a0              MOVS     r3,#0xa0
000012  8013              STRH     r3,[r2,#0]
000014  f100f100          ADD      r0,r0,#0x64000000
000018  8001              STRH     r1,[r0,#0]
00001a  bc30              POP      {r4,r5}
00001c  0158              LSLS     r0,r3,#5
00001e  f7fff7ff          B.W      FSMC_NOR_GetStatus
                          ENDP

000022  0000              DCW      0x0000
                  |L6.36|
000024  6400aaaa          DCD      0x6400aaaa
                  |L6.40|
000028  64005000          DCD      0x64005000

                          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  f834f834          LDRH     r1,[r4],#2
00000c  4630              MOV      r0,r6
00000e  f7fff7ff          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=2

                  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(0x005555), 0x00AA);
000006  4e10              LDR      r6,|L8.72|
000008  24aa              MOVS     r4,#0xaa
00000a  460b              MOV      r3,r1                 ;250
00000c  8034              STRH     r4,[r6,#0]
;;;254    
;;;255      NOR_WRITE(ADDR_SHIFT(0x02AAA), 0x0055);  
00000e  4e0f              LDR      r6,|L8.76|
000010  2455              MOVS     r4,#0x55
000012  f8a6f8a6          STRH     r4,[r6,#0x554]
;;;256    
;;;257      /* Write Write Buffer Load Command */
;;;258      NOR_WRITE(ADDR_SHIFT(WriteAddr), 0x0025);
000016  f04ff04f          MOV      r4,#0x64000000
00001a  2725              MOVS     r7,#0x25
00001c  eb04eb04          ADD      r6,r4,r1,LSL #1
000020  8037              STRH     r7,[r6,#0]
;;;259      NOR_WRITE(ADDR_SHIFT(WriteAddr), (NumHalfwordToWrite - 1));
000022  1e52              SUBS     r2,r2,#1
000024  8032              STRH     r2,[r6,#0]
;;;260    
;;;261      /* Load Data into NOR Buffer */
;;;262      while(currentaddress <= endaddress)
000026  e005              B        |L8.52|
                  |L8.40|
;;;263      {
;;;264        /* Store last loaded address & data value (for polling) */
;;;265        lastloadedaddress = currentaddress;
;;;266     
;;;267        NOR_WRITE(ADDR_SHIFT(currentaddress), *pBuffer++);
000028  f830f830          LDRH     r2,[r0],#2
00002c  460b              MOV      r3,r1                 ;265
00002e  f824f824          STRH     r2,[r4,r1,LSL #1]
;;;268        currentaddress += 1; 
000032  1c49              ADDS     r1,r1,#1
                  |L8.52|
000034  42a9              CMP      r1,r5                 ;262
000036  d9f7              BLS      |L8.40|
;;;269      }
;;;270    
;;;271      NOR_WRITE(ADDR_SHIFT(lastloadedaddress), 0x29);
000038  2029              MOVS     r0,#0x29
00003a  f824f824          STRH     r0,[r4,r3,LSL #1]
;;;272      
;;;273      return(FSMC_NOR_GetStatus(Program_Timeout));
00003e  bcf0              POP      {r4-r7}
000040  f44ff44f          MOV      r0,#0x1400
000044  f7fff7ff          B.W      FSMC_NOR_GetStatus
;;;274    }
;;;275    
                          ENDP

                  |L8.72|
000048  6400aaaa          DCD      0x6400aaaa
                  |L8.76|
00004c  64005000          DCD      0x64005000

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

                  FSMC_NOR_ReadHalfWord PROC
;;;284    {
;;;285      NOR_WRITE(ADDR_SHIFT(0x005555), 0x00AA); 
000000  4a06              LDR      r2,|L9.28|
000002  21aa              MOVS     r1,#0xaa
000004  8011              STRH     r1,[r2,#0]
;;;286      NOR_WRITE(ADDR_SHIFT(0x002AAA), 0x0055);  
000006  4a06              LDR      r2,|L9.32|
000008  2155              MOVS     r1,#0x55
00000a  f8a2f8a2          STRH     r1,[r2,#0x554]
;;;287      NOR_WRITE((Bank1_NOR2_ADDR + ReadAddr), 0x00F0 );
00000e  21f0              MOVS     r1,#0xf0
000010  f100f100          ADD      r0,r0,#0x64000000
000014  8001              STRH     r1,[r0,#0]
;;;288    
;;;289      return (*(vu16 *)((Bank1_NOR2_ADDR + ReadAddr)));
000016  8800              LDRH     r0,[r0,#0]
;;;290    }
000018  4770              BX       lr
;;;291    
                          ENDP

00001a  0000              DCW      0x0000
                  |L9.28|
00001c  6400aaaa          DCD      0x6400aaaa
                  |L9.32|
000020  64005000          DCD      0x64005000

                          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(0x05555), 0x00AA);
000002  4c0b              LDR      r4,|L10.48|
000004  23aa              MOVS     r3,#0xaa
000006  8023              STRH     r3,[r4,#0]
;;;305      NOR_WRITE(ADDR_SHIFT(0x02AAA), 0x0055);
000008  4c0a              LDR      r4,|L10.52|
00000a  2355              MOVS     r3,#0x55
00000c  f8a4f8a4          STRH     r3,[r4,#0x554]
;;;306      NOR_WRITE((Bank1_NOR2_ADDR + ReadAddr), 0x00F0);
000010  24f0              MOVS     r4,#0xf0
000012  f04ff04f          MOV      r3,#0x64000000
000016  525c              STRH     r4,[r3,r1]
;;;307    
;;;308      for(; NumHalfwordToRead != 0x00; NumHalfwordToRead--) /* while there is data to read */
000018  2a00              CMP      r2,#0
00001a  d008              BEQ      |L10.46|
                  |L10.28|
;;;309      {
;;;310        /* Read a Halfword from the NOR */
;;;311        *pBuffer++ = *(vu16 *)((Bank1_NOR2_ADDR + ReadAddr));
00001c  f04ff04f          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  6400aaaa          DCD      0x6400aaaa
                  |L10.52|
000034  64005000          DCD      0x64005000

                          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  f04ff04f          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=2

                  FSMC_NOR_Reset PROC
;;;339    {
;;;340      NOR_WRITE(ADDR_SHIFT(0x005555), 0x00AA); 
000000  4906              LDR      r1,|L12.28|
000002  20aa              MOVS     r0,#0xaa
000004  8008              STRH     r0,[r1,#0]
;;;341      NOR_WRITE(ADDR_SHIFT(0x002AAA), 0x0055); 
000006  4906              LDR      r1,|L12.32|
000008  2055              MOVS     r0,#0x55
00000a  f8a1f8a1          STRH     r0,[r1,#0x554]
;;;342      NOR_WRITE(Bank1_NOR2_ADDR, 0x00F0); 
00000e  20f0              MOVS     r0,#0xf0
000010  f04ff04f          MOV      r1,#0x64000000
000014  8008              STRH     r0,[r1,#0]
;;;343    
;;;344      return (NOR_SUCCESS);
000016  2000              MOVS     r0,#0
;;;345    }
000018  4770              BX       lr
;;;346    
                          ENDP

00001a  0000              DCW      0x0000
                  |L12.28|
00001c  6400aaaa          DCD      0x6400aaaa
                  |L12.32|
000020  64005000          DCD      0x64005000

⌨️ 快捷键说明

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