📄 fsmc_nor.txt
字号:
|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 + -