📄 msd.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 938] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Obj\msd.o --depend=.\Obj\msd.d --device=DARMSTM --apcs=interwork -O3 -I.\Code\FATSystem\INC -I.\Code\Library\INC -I.\Code\SDCard\INC -I.\Code\Speaker\INC -I.\Code\System\INC -I.\Code\USBMassStorage\INC -I.\Code\User\INC -I.\Code\VS1003\INC -ID:\Keil\ARM\INC\ST\STM32F10x --omf_browse=.\Obj\msd.crf Code\SDCard\SRC\msd.c]
THUMB
AREA ||i.MSD_WriteByte||, CODE, READONLY, ALIGN=2
MSD_WriteByte PROC
000000 b570 PUSH {r4-r6,lr}
000002 4c07 LDR r4,|L1.32|
000004 4605 MOV r5,r0
|L1.6|
000006 2102 MOVS r1,#2
000008 4620 MOV r0,r4
00000a f7fffffe BL SPI_I2S_GetFlagStatus
00000e 2800 CMP r0,#0
000010 d0f9 BEQ |L1.6|
000012 4629 MOV r1,r5
000014 4620 MOV r0,r4
000016 e8bd4070 POP {r4-r6,lr}
00001a f7ffbffe B.W SPI_I2S_SendData
ENDP
00001e 0000 DCW 0x0000
|L1.32|
000020 40013000 DCD 0x40013000
AREA ||i.MSD_SendCmd||, CODE, READONLY, ALIGN=1
MSD_SendCmd PROC
;;;518 void MSD_SendCmd(u8 Cmd, u32 Arg, u8 Crc)
;;;519 {
000000 b57c PUSH {r2-r6,lr}
;;;520 u32 i = 0x00;
;;;521 u8 Frame[6];
;;;522
;;;523 /* Construct byte1 */
;;;524 Frame[0] = (Cmd | 0x40);
000002 f0400040 ORR r0,r0,#0x40
000006 f88d0000 STRB r0,[sp,#0]
;;;525 /* Construct byte2 */
;;;526 Frame[1] = (u8)(Arg >> 24);
00000a 0e08 LSRS r0,r1,#24
00000c f88d0001 STRB r0,[sp,#1]
;;;527 /* Construct byte3 */
;;;528 Frame[2] = (u8)(Arg >> 16);
000010 0c08 LSRS r0,r1,#16
000012 2400 MOVS r4,#0 ;520
000014 f88d0002 STRB r0,[sp,#2]
;;;529 /* Construct byte4 */
;;;530 Frame[3] = (u8)(Arg >> 8);
000018 0a08 LSRS r0,r1,#8
;;;531 /* Construct byte5 */
;;;532 Frame[4] = (u8)(Arg);
00001a f88d1004 STRB r1,[sp,#4]
00001e f88d0003 STRB r0,[sp,#3] ;530
;;;533 /* Construct CRC: byte6 */
;;;534 Frame[5] = (Crc);
000022 f88d2005 STRB r2,[sp,#5]
000026 466d MOV r5,sp
|L2.40|
;;;535
;;;536 /* Send the Cmd bytes */
;;;537 for (i = 0; i < 6; i++)
;;;538 {
;;;539 MSD_WriteByte(Frame[i]);
000028 5d28 LDRB r0,[r5,r4]
00002a f7fffffe BL MSD_WriteByte
00002e 1c64 ADDS r4,r4,#1 ;537
000030 2c06 CMP r4,#6 ;537
000032 d3f9 BCC |L2.40|
;;;540 }
;;;541 }
000034 bd7c POP {r2-r6,pc}
;;;542
ENDP
AREA ||i.MSD_ReadByte||, CODE, READONLY, ALIGN=2
MSD_ReadByte PROC
;;;723 u8 MSD_ReadByte(void)
;;;724 {
000000 b510 PUSH {r4,lr}
000002 4c0b LDR r4,|L3.48|
|L3.4|
;;;725 u8 Data = 0;
;;;726
;;;727 /* Wait until the transmit buffer is empty */
;;;728 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
000004 2102 MOVS r1,#2
000006 4620 MOV r0,r4
000008 f7fffffe BL SPI_I2S_GetFlagStatus
00000c 2800 CMP r0,#0
00000e d0f9 BEQ |L3.4|
;;;729 /* Send the byte */
;;;730 SPI_I2S_SendData(SPI1, DUMMY);
000010 21ff MOVS r1,#0xff
000012 4620 MOV r0,r4
000014 f7fffffe BL SPI_I2S_SendData
|L3.24|
;;;731
;;;732 /* Wait until a data is received */
;;;733 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
000018 2101 MOVS r1,#1
00001a 4620 MOV r0,r4
00001c f7fffffe BL SPI_I2S_GetFlagStatus
000020 2800 CMP r0,#0
000022 d0f9 BEQ |L3.24|
;;;734 /* Get the received data */
;;;735 Data = SPI_I2S_ReceiveData(SPI1);
000024 4620 MOV r0,r4
000026 f7fffffe BL SPI_I2S_ReceiveData
00002a b2c0 UXTB r0,r0
;;;736
;;;737 /* Return the shifted data */
;;;738 return Data;
;;;739 }
00002c bd10 POP {r4,pc}
;;;740
ENDP
00002e 0000 DCW 0x0000
|L3.48|
000030 40013000 DCD 0x40013000
AREA ||i.MSD_GetResponse||, CODE, READONLY, ALIGN=1
MSD_GetResponse PROC
000000 b570 PUSH {r4-r6,lr}
000002 4605 MOV r5,r0
000004 f64074ff MOV r4,#0xfff
000008 e000 B |L4.12|
|L4.10|
00000a 1e64 SUBS r4,r4,#1
|L4.12|
00000c f7fffffe BL MSD_ReadByte
000010 42a8 CMP r0,r5
000012 d002 BEQ |L4.26|
000014 2c00 CMP r4,#0
000016 d1f8 BNE |L4.10|
000018 e000 B |L4.28|
|L4.26|
00001a b90c CBNZ r4,|L4.32|
|L4.28|
00001c 20ff MOVS r0,#0xff
00001e bd70 POP {r4-r6,pc}
|L4.32|
000020 2000 MOVS r0,#0
000022 bd70 POP {r4-r6,pc}
ENDP
AREA ||i.MSD_GoIdleState||, CODE, READONLY, ALIGN=2
MSD_GoIdleState PROC
;;;663 u8 MSD_GoIdleState(void)
;;;664 {
000000 b510 PUSH {r4,lr}
;;;665 /* MSD chip select low */
;;;666 MSD_CS_LOW();
000002 4c17 LDR r4,|L5.96|
000004 2108 MOVS r1,#8
000006 4620 MOV r0,r4
000008 f7fffffe BL GPIO_ResetBits
;;;667 /* Send CMD0 (GO_IDLE_STATE) to put MSD in SPI mode */
;;;668 MSD_SendCmd(MSD_GO_IDLE_STATE, 0, 0x95);
00000c 2100 MOVS r1,#0
00000e 2295 MOVS r2,#0x95
000010 4608 MOV r0,r1
000012 f7fffffe BL MSD_SendCmd
;;;669
;;;670 /* Wait for In Idle State Response (R1 Format) equal to 0x01 */
;;;671 if (MSD_GetResponse(MSD_IN_IDLE_STATE))
000016 2001 MOVS r0,#1
000018 f7fffffe BL MSD_GetResponse
00001c b108 CBZ r0,|L5.34|
;;;672 {
;;;673 /* No Idle State Response: return response failue */
;;;674 return MSD_RESPONSE_FAILURE;
00001e 20ff MOVS r0,#0xff
;;;675 }
;;;676 /*----------Activates the card initialization process-----------*/
;;;677 do
;;;678 {
;;;679 /* MSD chip select high */
;;;680 MSD_CS_HIGH();
;;;681 /* Send Dummy byte 0xFF */
;;;682 MSD_WriteByte(DUMMY);
;;;683
;;;684 /* MSD chip select low */
;;;685 MSD_CS_LOW();
;;;686
;;;687 /* Send CMD1 (Activates the card process) until response equal to 0x0 */
;;;688 MSD_SendCmd(MSD_SEND_OP_COND, 0, 0xFF);
;;;689 /* Wait for no error Response (R1 Format) equal to 0x00 */
;;;690 }
;;;691 while (MSD_GetResponse(MSD_RESPONSE_NO_ERROR));
;;;692
;;;693 /* MSD chip select high */
;;;694 MSD_CS_HIGH();
;;;695 /* Send dummy byte 0xFF */
;;;696 MSD_WriteByte(DUMMY);
;;;697
;;;698 return MSD_RESPONSE_NO_ERROR;
;;;699 }
000020 bd10 POP {r4,pc}
|L5.34|
000022 2108 MOVS r1,#8 ;680
000024 4620 MOV r0,r4 ;680
000026 f7fffffe BL GPIO_SetBits
00002a 20ff MOVS r0,#0xff ;682
00002c f7fffffe BL MSD_WriteByte
000030 2108 MOVS r1,#8 ;685
000032 4620 MOV r0,r4 ;685
000034 f7fffffe BL GPIO_ResetBits
000038 22ff MOVS r2,#0xff ;688
00003a 2100 MOVS r1,#0 ;688
00003c 2001 MOVS r0,#1 ;688
00003e f7fffffe BL MSD_SendCmd
000042 2000 MOVS r0,#0 ;691
000044 f7fffffe BL MSD_GetResponse
000048 2800 CMP r0,#0 ;691
00004a d1ea BNE |L5.34|
00004c 2108 MOVS r1,#8 ;694
00004e 4620 MOV r0,r4 ;694
000050 f7fffffe BL GPIO_SetBits
000054 20ff MOVS r0,#0xff ;696
000056 f7fffffe BL MSD_WriteByte
00005a 2000 MOVS r0,#0 ;698
00005c bd10 POP {r4,pc}
;;;700
ENDP
00005e 0000 DCW 0x0000
|L5.96|
000060 40011800 DCD 0x40011800
AREA ||i.SPI_Config||, CODE, READONLY, ALIGN=2
SPI_Config PROC
;;;748 void SPI_Config(u16 BaudRatePrescaler)
;;;749 {
000000 b530 PUSH {r4,r5,lr}
000002 4605 MOV r5,r0
000004 b087 SUB sp,sp,#0x1c
;;;750 GPIO_InitTypeDef GPIO_InitStructure;
;;;751 SPI_InitTypeDef SPI_InitStructure;
;;;752
;;;753 /* GPIOA and GPIOC Periph clock enable */
;;;754 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE, ENABLE);
000006 2101 MOVS r1,#1
000008 2044 MOVS r0,#0x44
00000a f7fffffe BL RCC_APB2PeriphClockCmd
;;;755 /* SPI1 Periph clock enable */
;;;756 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
00000e 2101 MOVS r1,#1
000010 0308 LSLS r0,r1,#12
000012 f7fffffe BL RCC_APB2PeriphClockCmd
;;;757
;;;758 /* Configure SPI1 pins: SCK, MISO and MOSI */
;;;759 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
000016 20e0 MOVS r0,#0xe0
000018 f8ad0018 STRH r0,[sp,#0x18]
;;;760 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
00001c 2403 MOVS r4,#3
00001e f88d401a STRB r4,[sp,#0x1a]
;;;761 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
000022 2018 MOVS r0,#0x18
000024 f88d001b STRB r0,[sp,#0x1b]
;;;762 GPIO_Init(GPIOA, &GPIO_InitStructure);
000028 a906 ADD r1,sp,#0x18
00002a 4819 LDR r0,|L6.144|
00002c f7fffffe BL GPIO_Init
;;;763
;;;764 /* Configure PE3 pin: CS pin */
;;;765 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
000030 2008 MOVS r0,#8
000032 f8ad0018 STRH r0,[sp,#0x18]
;;;766 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
000036 f88d401a STRB r4,[sp,#0x1a]
;;;767 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
00003a 2010 MOVS r0,#0x10
00003c f88d001b STRB r0,[sp,#0x1b]
;;;768 GPIO_Init(GPIOE, &GPIO_InitStructure);
000040 a906 ADD r1,sp,#0x18
000042 4814 LDR r0,|L6.148|
000044 f7fffffe BL GPIO_Init
;;;769
;;;770 /* SPI1 Config */
;;;771 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
000048 2000 MOVS r0,#0
00004a f8ad0004 STRH r0,[sp,#4]
;;;772 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
;;;773 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
00004e f8ad0008 STRH r0,[sp,#8]
000052 f44f7182 MOV r1,#0x104 ;772
000056 f8ad1006 STRH r1,[sp,#6] ;772
;;;774 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
00005a 2102 MOVS r1,#2
00005c f8ad100a STRH r1,[sp,#0xa]
;;;775 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
000060 2101 MOVS r1,#1
;;;776 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
;;;777 SPI_InitStructure.SPI_BaudRatePrescaler = BaudRatePrescaler;
000062 f8ad5010 STRH r5,[sp,#0x10]
000066 f8ad100c STRH r1,[sp,#0xc] ;775
;;;778 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
00006a f8ad0012 STRH r0,[sp,#0x12]
00006e 0249 LSLS r1,r1,#9 ;776
;;;779 SPI_InitStructure.SPI_CRCPolynomial = 7;
000070 2007 MOVS r0,#7
;;;780 SPI_Init(SPI1, &SPI_InitStructure);
000072 4c09 LDR r4,|L6.152|
000074 f8ad100e STRH r1,[sp,#0xe] ;776
000078 f8ad0014 STRH r0,[sp,#0x14] ;779
00007c a901 ADD r1,sp,#4
00007e 4620 MOV r0,r4
000080 f7fffffe BL SPI_Init
;;;781
;;;782 /* SPI1 enable */
;;;783 SPI_Cmd(SPI1, ENABLE);
000084 2101 MOVS r1,#1
000086 4620 MOV r0,r4
000088 f7fffffe BL SPI_Cmd
;;;784 }
00008c b007 ADD sp,sp,#0x1c
00008e bd30 POP {r4,r5,pc}
;;;785
ENDP
|L6.144|
000090 40010800 DCD 0x40010800
|L6.148|
000094 40011800 DCD 0x40011800
|L6.152|
000098 40013000 DCD 0x40013000
AREA ||i.MSD_Init||, CODE, READONLY, ALIGN=2
MSD_Init PROC
;;;57 u8 MSD_Init(void)
;;;58 {
000000 b510 PUSH {r4,lr}
;;;59 u32 i = 0;
000002 2400 MOVS r4,#0
;;;60
;;;61 /* Initialize SPI1 */
;;;62 SPI_Config(SPI_BaudRatePrescaler_32);
000004 2020 MOVS r0,#0x20
000006 f7fffffe BL SPI_Config
;;;63 /* MSD chip select high */
;;;64 MSD_CS_HIGH();
00000a 2108 MOVS r1,#8
00000c 4806 LDR r0,|L7.40|
00000e f7fffffe BL GPIO_SetBits
|L7.18|
;;;65 /* Send dummy byte 0xFF, 10 times with CS high*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -