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