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

📄 smartcard.txt

📁 基于cortex arm stm32f103RB的智能卡(SmartCard)程序。编译通过
💻 TXT
📖 第 1 页 / 共 4 页
字号:
;;;647    /* USART3 configuration ------------------------------------------------------*/
;;;648      /* USART3 configured as follow:
;;;649            - Word Length = 9 Bits
;;;650            - 0.5 Stop Bit
;;;651            - Even parity
;;;652            - BaudRate = 12096 baud
;;;653            - Hardware flow control disabled (RTS and CTS signals)
;;;654            - Tx and Rx enabled
;;;655            - USART Clock enabled
;;;656      */
;;;657    
;;;658      /* USART Clock set to 3.6 MHz (PCLK1 (36 MHZ) / 10) */
;;;659      USART_SetPrescaler(USART3, 0x05);
00007a  4f23              LDR      r7,|L6.264|
00007c  2105              MOVS     r1,#5
00007e  4638              MOV      r0,r7
000080  f7fff7ff          BL       USART_SetPrescaler
;;;660      
;;;661      /* USART Guard Time set to 16 Bit */
;;;662      USART_SetGuardTime(USART3, 16);
000084  2110              MOVS     r1,#0x10
000086  4638              MOV      r0,r7
000088  f7fff7ff          BL       USART_SetGuardTime
;;;663      
;;;664      USART_StructInit(&USART_InitStructure);
00008c  a801              ADD      r0,sp,#4
00008e  f7fff7ff          BL       USART_StructInit
;;;665      USART_InitStructure.USART_BaudRate = 9677;
000092  f242f242          MOV      r0,#0x25cd
;;;666      USART_InitStructure.USART_WordLength = USART_WordLength_9b;
000096  9001              STR      r0,[sp,#4]
000098  f8adf8ad          STRH     r6,[sp,#8]
;;;667      USART_InitStructure.USART_StopBits = USART_StopBits_1_5;
00009c  f44ff44f          MOV      r0,#0x3000
0000a0  f8adf8ad          STRH     r0,[sp,#0xa]
;;;668      USART_InitStructure.USART_Parity = USART_Parity_Even;
0000a4  f8adf8ad          STRH     r5,[sp,#0xc]
;;;669      USART_InitStructure.USART_Clock = USART_Clock_Enable;
0000a8  f8adf8ad          STRH     r4,[sp,#0x12]
;;;670      
;;;671      USART_Init(USART3, &USART_InitStructure);
0000ac  a901              ADD      r1,sp,#4
0000ae  4638              MOV      r0,r7
0000b0  f7fff7ff          BL       USART_Init
;;;672    
;;;673      /* Enable the USART3 Parity Error Interrupt */
;;;674      USART_ITConfig(USART3, USART_IT_PE, ENABLE);
0000b4  2201              MOVS     r2,#1
0000b6  2128              MOVS     r1,#0x28
0000b8  4638              MOV      r0,r7
0000ba  f7fff7ff          BL       USART_ITConfig
;;;675    
;;;676      /* Enable the USART3 Framing Error Interrupt */
;;;677      USART_ITConfig(USART3, USART_IT_ERR, ENABLE);
0000be  2201              MOVS     r2,#1
0000c0  2160              MOVS     r1,#0x60
0000c2  4638              MOV      r0,r7
0000c4  f7fff7ff          BL       USART_ITConfig
;;;678    
;;;679      /* Enable USART3 */
;;;680      USART_Cmd(USART3, ENABLE);
0000c8  2101              MOVS     r1,#1
0000ca  4638              MOV      r0,r7
0000cc  f7fff7ff          BL       USART_Cmd
;;;681    
;;;682      /* Enable the NACK Transmission */
;;;683      USART_SmartCardNACKCmd(USART3, ENABLE);
0000d0  2101              MOVS     r1,#1
0000d2  4638              MOV      r0,r7
0000d4  f7fff7ff          BL       USART_SmartCardNACKCmd
;;;684    
;;;685      /* Enable the Smartcard Interface */
;;;686      USART_SmartCardCmd(USART3, ENABLE);
0000d8  2101              MOVS     r1,#1
0000da  4638              MOV      r0,r7
0000dc  f7fff7ff          BL       USART_SmartCardCmd
;;;687      
;;;688      /* Set RSTIN HIGH */  
;;;689      SC_Reset(Bit_SET);
0000e0  2001              MOVS     r0,#1
0000e2  f7fff7ff          BL       SC_Reset
0000e6  4621              MOV      r1,r4
0000e8  4640              MOV      r0,r8
0000ea  f7fff7ff          BL       GPIO_SetBits
;;;690      
;;;691      /* Select 5V */ 
;;;692      SC_VoltageConfig(SC_Voltage_5V);
;;;693      
;;;694      /* Disable CMDVCC */
;;;695      SC_PowerCmd(DISABLE);
0000ee  2000              MOVS     r0,#0
0000f0  f7fff7ff          BL       SC_PowerCmd
;;;696    }
0000f4  b008              ADD      sp,sp,#0x20
0000f6  e8bde8bd          POP      {r4-r8,pc}
                          ENDP

0000fa  0000              DCW      0x0000
                  |L6.252|
0000fc  40010c00          DCD      0x40010c00
                  |L6.256|
000100  40011400          DCD      0x40011400
                  |L6.260|
000104  40011800          DCD      0x40011800
                  |L6.264|
000108  40004800          DCD      0x40004800

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

                  SC_Handler PROC
;;;62     void SC_Handler(SC_State *SCState, SC_ADPU_Commands *SC_ADPU, SC_ADPU_Responce *SC_Response)
;;;63     {
000000  b570              PUSH     {r4-r6,lr}
000002  4605              MOV      r5,r0
;;;64       u32 i = 0;
;;;65     
;;;66       switch(*SCState)
000004  782b              LDRB     r3,[r5,#0]
000006  4608              MOV      r0,r1
000008  2400              MOVS     r4,#0
00000a  2605              MOVS     r6,#5
00000c  4611              MOV      r1,r2
00000e  2b06              CMP      r3,#6
000010  d25e              BCS      |L7.208|
000012  e8dfe8df          TBB      [pc,r3]
000016  03235d38          DCB      0x03,0x23,0x5d,0x38
00001a  4246              DCB      0x42,0x46
;;;67       {
;;;68         case SC_POWER_ON:
;;;69           if (SC_ADPU->Header.INS == SC_GET_A2R)
00001c  7840              LDRB     r0,[r0,#1]
00001e  2800              CMP      r0,#0
000020  d130              BNE      |L7.132|
;;;70           {
;;;71             /* Smartcard intialization ------------------------------------------*/
;;;72             SC_Init();
000022  f7fff7ff          BL       SC_Init
000026  482b              LDR      r0,|L7.212|
000028  2200              MOVS     r2,#0
                  |L7.42|
;;;73     
;;;74             /* Reset Data from SC buffer -----------------------------------------*/
;;;75             for (i = 0; i < 40; i++)
;;;76             {
;;;77               SC_ATR_Table[i] = 0;
00002a  5502              STRB     r2,[r0,r4]
00002c  1c64              ADDS     r4,r4,#1
00002e  2c28              CMP      r4,#0x28
000030  d3fb              BCC      |L7.42|
;;;78             }
;;;79             
;;;80             /* Reset SC_A2R Structure --------------------------------------------*/
;;;81             SC_A2R.TS = 0;
000032  4928              LDR      r1,|L7.212|
000034  392c              SUBS     r1,r1,#0x2c
000036  700a              STRB     r2,[r1,#0]  ; SC_A2R
;;;82             SC_A2R.T0 = 0;
000038  704a              STRB     r2,[r1,#1]  ; SC_A2R
;;;83             for (i = 0; i < SETUP_LENGTH; i++)
00003a  2000              MOVS     r0,#0
                  |L7.60|
;;;84             {
;;;85               SC_A2R.T[i] = 0;
00003c  180b              ADDS     r3,r1,r0
00003e  1c40              ADDS     r0,r0,#1
000040  709a              STRB     r2,[r3,#2]
000042  2814              CMP      r0,#0x14
000044  d3fa              BCC      |L7.60|
;;;86             }
;;;87             for (i = 0; i < HIST_LENGTH; i++)
000046  2000              MOVS     r0,#0
                  |L7.72|
;;;88             {
;;;89               SC_A2R.H[i] = 0;
000048  180b              ADDS     r3,r1,r0
00004a  1c40              ADDS     r0,r0,#1
00004c  759a              STRB     r2,[r3,#0x16]
00004e  2814              CMP      r0,#0x14
000050  d3fa              BCC      |L7.72|
;;;90             }
;;;91             SC_A2R.Tlength = 0;
000052  f801f801          STRB     r2,[r1,#0x2a]!  ; SC_A2R
;;;92             SC_A2R.Hlength = 0;
000056  704a              STRB     r2,[r1,#1]  ; SC_A2R
;;;93             
;;;94             /* Next State --------------------------------------------------------*/
;;;95             *SCState = SC_RESET_LOW;
000058  2001              MOVS     r0,#1
00005a  e01c              B        |L7.150|
;;;96           }
;;;97         break;
;;;98     
;;;99         case SC_RESET_LOW:
;;;100          if(SC_ADPU->Header.INS == SC_GET_A2R)
00005c  7840              LDRB     r0,[r0,#1]
00005e  2800              CMP      r0,#0
000060  d110              BNE      |L7.132|
000062  f44ff44f          MOV      r1,#0x4000
000066  481c              LDR      r0,|L7.216|
000068  f7fff7ff          BL       GPIO_ReadInputDataBit
;;;101          {
;;;102            /* If card is detected then Power ON, Card Reset and wait for an answer) */
;;;103            if (SC_Detect())
00006c  b380              CBZ      r0,|L7.208|
00006e  e004              B        |L7.122|
                  |L7.112|
;;;104            {
;;;105              while(((*SCState) != SC_POWER_OFF) && ((*SCState) != SC_ACTIVE))
;;;106              {
;;;107                SC_AnswerReq(SCState, &SC_ATR_Table[0], 40); /* Check for answer to reset */
000070  2228              MOVS     r2,#0x28
000072  4918              LDR      r1,|L7.212|
000074  4628              MOV      r0,r5
000076  f7fff7ff          BL       SC_AnswerReq
                  |L7.122|
00007a  7828              LDRB     r0,[r5,#0]
00007c  2805              CMP      r0,#5
00007e  d001              BEQ      |L7.132|
000080  2803              CMP      r0,#3
000082  d1f5              BNE      |L7.112|
                  |L7.132|
;;;108              }
;;;109            }
;;;110            else
;;;111            {
;;;112              (*SCState) = SC_POWER_OFF;
;;;113            } 
;;;114          }
;;;115        break;
;;;116    
;;;117        case SC_ACTIVE:
;;;118          if (SC_ADPU->Header.INS == SC_GET_A2R)
;;;119          {
;;;120            if(SC_decode_Answer2reset(&SC_ATR_Table[0]) == T0_PROTOCOL)
;;;121            {
;;;122              (*SCState) = SC_ACTIVE_ON_T0;
;;;123            }
;;;124            else
;;;125            {
;;;126              (*SCState) = SC_POWER_OFF; 
;;;127            }
;;;128          }
;;;129        break;
;;;130    
;;;131        case SC_ACTIVE_ON_T0:
;;;132          SC_SendData(SC_ADPU, SC_Response);
;;;133        break;
;;;134    
;;;135        case SC_POWER_OFF:
;;;136          SC_DeInit(); /* Disable Smartcard interface */
;;;137        break;
;;;138    
;;;139        default: (*SCState) = SC_POWER_OFF;
;;;140      }
;;;141    }
000084  bd70              POP      {r4-r6,pc}
000086  7840              LDRB     r0,[r0,#1]
000088  2800              CMP      r0,#0
00008a  d1fb              BNE      |L7.132|
00008c  4811              LDR      r0,|L7.212|
00008e  f7fff7ff          BL       SC_decode_Answer2reset
000092  b9e8              CBNZ     r0,|L7.208|
000094  2004              MOVS     r0,#4
                  |L7.150|
000096  7028              STRB     r0,[r5,#0]
000098  bd70              POP      {r4-r6,pc}
00009a  e8bde8bd          POP      {r4-r6,lr}
00009e  f7fff7ff          B.W      SC_SendData
0000a2  2001              MOVS     r0,#1
0000a4  f7fff7ff          BL       SC_PowerCmd
0000a8  480c              LDR      r0,|L7.220|
0000aa  f7fff7ff          BL       USART_DeInit
0000ae  480c              LDR      r0,|L7.224|
0000b0  f7fff7ff          BL       GPIO_DeInit
0000b4  480b              LDR      r0,|L7.228|
0000b6  f7fff7ff          BL       GPIO_DeInit
0000ba  2100              MOVS     r1,#0
0000bc  2028              MOVS     r0,#0x28
0000be  f7fff7ff          BL       RCC_APB2PeriphClockCmd
0000c2  e8bde8bd          POP      {r4-r6,lr}
0000c6  2100              MOVS     r1,#0
0000c8  f44ff44f          MOV      r0,#0x40000
0000cc  f7fff7ff          B.W      RCC_APB1PeriphClockCmd
                  |L7.208|
0000d0  702e              STRB     r6,[r5,#0]
0000d2  bd70              POP      {r4-r6,pc}
                          ENDP

                  |L7.212|
0000d4  0000002c          DCD      ||.bss||+0x2c
                  |L7.216|
0000d8  40011800          DCD      0x40011800
                  |L7.220|
0000dc  40004800          DCD      0x40004800
                  |L7.224|
0000e0  40010c00          DCD      0x40010c00
                  |L7.228|
0000e4  40011400          DCD      0x40011400

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

                  SC_ParityErrorHandler PROC
;;;187    void SC_ParityErrorHandler(void)
;;;188    {
000000  b510              PUSH     {r4,lr}
;;;189      USART_SendData(USART3, SCData);
000002  4806              LDR      r0,|L8.28|
000004  7801              LDRB     r1,[r0,#0]  ; SCData
000006  4c06              LDR      r4,|L8.32|
000008  4620              MOV      r0,r4
00000a  f7fff7ff          BL       USART_SendData
                  |L8.14|
;;;190      while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
00000e  2140              MOVS     r1,#0x40
000010  4620              MOV      r0,r4
000012  f7fff7ff          BL       USART_GetFlagStatus
000016  2800              CMP      r0,#0
000018  d0f9              BEQ      |L8.14|
;;;191      {
;;;192      } 
;;;193    }
00001a  bd10              POP      {r4,pc}
                          ENDP

                  |L8.28|
00001c  00000000          DCD      ||.data||
                  |L8.32|
000020  40004800          DCD      0x40004800

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

                  SC_PTSConfig PROC
;;;202    void SC_PTSConfig(void)
;;;203    {
000000  e92de92d          PUSH     {r4-r8,lr}
000004  b08c              SUB      sp,sp,#0x30
;;;204      RCC_ClocksTypeDef RCC_ClocksStatus;
;;;205      u32 workingbaudrate = 0, apbclock = 0;
;;;206      u8 locData = 0, PTSConfirmStatus = 1;
000006  2000              MOVS     r0,#0
;;;207      USART_InitTypeDef USART_InitStructure;
;;;208    
;;;209      /* Reconfigure the USART Baud Rate -------------------------------------------*/
;;;210      RCC_GetClocksFreq(&RCC_ClocksStatus);
000008  9006              STR      r0,[sp,#0x18]
00000a  2401              MOVS     r4,#1
00000c  a807              ADD      r0,sp,#0x1c
00000e  f7fff7ff          BL       RCC_GetClocksFreq
;;;211      apbclock = RCC_ClocksStatus.PCLK1_Frequency;
000012  4959              LDR      r1,|L9.376|
;;;212      apbclock /= ((USART3->GTPR & (u16)0x00FF) * 2);
000014  9809              LDR      r0,[sp,#0x24]
000016  8809              LDRH     r1,[r1,#0]
;;;213    
;;;214      /* Enable the DMA Receive (Set DMAR bit only) to enable interrupt generation
;;;215         in case of a framing error FE */  

⌨️ 快捷键说明

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