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

📄 main.txt

📁 STM32的RTC例程
💻 TXT
📖 第 1 页 / 共 3 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 938] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\output\main.o --depend=.\output\main.d --device=DARMSTM --apcs=interwork -O0 -I.\ -ID:\Keil\ARM\INC\ST\STM32F10x --omf_browse=.\output\main.crf main.c]
                          THUMB

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  Time_Display PROC
;;;365    void Time_Display(u32 TimeVar)
;;;366    { 
000000  e92d41f0          PUSH     {r4-r8,lr}
000004  4604              MOV      r4,r0
;;;367      u32 THH = 0, TMM = 0, TSS = 0;
000006  2500              MOVS     r5,#0
000008  2600              MOVS     r6,#0
00000a  2700              MOVS     r7,#0
;;;368    
;;;369      /* Compute  hours */
;;;370      THH = TimeVar/3600;
00000c  f44f6061          MOV      r0,#0xe10
000010  fbb4f5f0          UDIV     r5,r4,r0
;;;371      /* Compute minutes */
;;;372      TMM = (TimeVar % 3600)/60;
000014  fbb4f1f0          UDIV     r1,r4,r0
000018  fb004011          MLS      r0,r0,r1,r4
00001c  213c              MOVS     r1,#0x3c
00001e  fbb0f6f1          UDIV     r6,r0,r1
;;;373      /* Compute seconds */
;;;374      TSS = (TimeVar % 3600)% 60;
000022  f44f6061          MOV      r0,#0xe10
000026  fbb4f1f0          UDIV     r1,r4,r0
00002a  fb004011          MLS      r0,r0,r1,r4
00002e  213c              MOVS     r1,#0x3c
000030  fbb0f2f1          UDIV     r2,r0,r1
000034  fb010712          MLS      r7,r1,r2,r0
;;;375    
;;;376      printf("Time: %0.2d:%0.2d:%0.2d\r",THH, TMM, TSS);
000038  463b              MOV      r3,r7
00003a  4632              MOV      r2,r6
00003c  4629              MOV      r1,r5
00003e  a0d9              ADR      r0,|L1.932|
000040  f7fffffe          BL       __1printf
;;;377    }
000044  e8bd81f0          POP      {r4-r8,pc}
;;;378    
                          ENDP

                  Time_Show PROC
;;;386    void Time_Show(void)
;;;387    {
000048  b510              PUSH     {r4,lr}
;;;388      printf("\n\r");
00004a  a0dd              ADR      r0,|L1.960|
00004c  f7fffffe          BL       __1printf
;;;389      
;;;390      /* Infinite loop */ 
;;;391      while(1)
000050  e00b              B        |L1.106|
                  |L1.82|
;;;392      {
;;;393        /* If 1s has paased */
;;;394        if(TimeDisplay == 1)
000052  48dc              LDR      r0,|L1.964|
000054  6800              LDR      r0,[r0,#0]  ; TimeDisplay
000056  2801              CMP      r0,#1
000058  d107              BNE      |L1.106|
;;;395        {    
;;;396          /* Display current time */
;;;397          Time_Display(RTC_GetCounter());
00005a  f7fffffe          BL       RTC_GetCounter
00005e  4604              MOV      r4,r0
000060  f7fffffe          BL       Time_Display
;;;398          TimeDisplay = 0;
000064  2000              MOVS     r0,#0
000066  49d7              LDR      r1,|L1.964|
000068  6008              STR      r0,[r1,#0]  ; TimeDisplay
                  |L1.106|
00006a  e7f2              B        |L1.82|
;;;399        }
;;;400      }
;;;401    }
;;;402    
                          ENDP

                  USART_Scanf PROC
;;;488    u8 USART_Scanf(u32 value)
;;;489    {
00006c  b57c              PUSH     {r2-r6,lr}
00006e  4605              MOV      r5,r0
;;;490      u32 index = 0;
000070  2400              MOVS     r4,#0
;;;491      u32 tmp[2] = {0, 0};     
000072  4668              MOV      r0,sp
000074  2100              MOVS     r1,#0
000076  460a              MOV      r2,r1
000078  c006              STM      r0!,{r1,r2}
;;;492      
;;;493      while(index < 2)
00007a  e01e              B        |L1.186|
                  |L1.124|
;;;494      {
;;;495        /* Loop until RXNE = 1 */
;;;496        while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
00007c  bf00              NOP      
                  |L1.126|
00007e  2120              MOVS     r1,#0x20
000080  48d1              LDR      r0,|L1.968|
000082  f7fffffe          BL       USART_GetFlagStatus
000086  2800              CMP      r0,#0
000088  d0f9              BEQ      |L1.126|
;;;497        {
;;;498        }
;;;499        tmp[index++] = (USART_ReceiveData(USART1));
00008a  48cf              LDR      r0,|L1.968|
00008c  f7fffffe          BL       USART_ReceiveData
000090  4621              MOV      r1,r4
000092  1c64              ADDS     r4,r4,#1
000094  466a              MOV      r2,sp
000096  f8420021          STR      r0,[r2,r1,LSL #2]
;;;500        if((tmp[index - 1] < 0x30) || (tmp[index - 1] > 0x39))
00009a  1e60              SUBS     r0,r4,#1
00009c  4669              MOV      r1,sp
00009e  f8510020          LDR      r0,[r1,r0,LSL #2]
0000a2  2830              CMP      r0,#0x30
0000a4  d305              BCC      |L1.178|
0000a6  1e60              SUBS     r0,r4,#1
0000a8  4669              MOV      r1,sp
0000aa  f8510020          LDR      r0,[r1,r0,LSL #2]
0000ae  2839              CMP      r0,#0x39
0000b0  d903              BLS      |L1.186|
                  |L1.178|
;;;501        {
;;;502          printf("\n\rPlease enter valid number between 0 and 9");
0000b2  a0c6              ADR      r0,|L1.972|
0000b4  f7fffffe          BL       __1printf
;;;503          index--;
0000b8  1e64              SUBS     r4,r4,#1
                  |L1.186|
0000ba  2c02              CMP      r4,#2                 ;493
0000bc  d3de              BCC      |L1.124|
;;;504        }
;;;505      }
;;;506      /* Calculate the Corresponding value */
;;;507      index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10); 
0000be  9801              LDR      r0,[sp,#4]
0000c0  3830              SUBS     r0,r0,#0x30
0000c2  9900              LDR      r1,[sp,#0]
0000c4  3930              SUBS     r1,r1,#0x30
0000c6  eb010181          ADD      r1,r1,r1,LSL #2
0000ca  eb000441          ADD      r4,r0,r1,LSL #1
;;;508      /* Checks */
;;;509      if(index > value)
0000ce  42ac              CMP      r4,r5
0000d0  d905              BLS      |L1.222|
;;;510      {
;;;511        printf("\n\rPlease enter valid number between 0 and %d", value);
0000d2  4629              MOV      r1,r5
0000d4  a0c8              ADR      r0,|L1.1016|
0000d6  f7fffffe          BL       __1printf
;;;512        return 0xFF;
0000da  20ff              MOVS     r0,#0xff
                  |L1.220|
;;;513      }
;;;514      return index;
;;;515    }
0000dc  bd7c              POP      {r2-r6,pc}
                  |L1.222|
0000de  b2e0              UXTB     r0,r4                 ;514
0000e0  e7fc              B        |L1.220|
;;;516    
                          ENDP

                  Time_Regulate PROC
;;;312    u32 Time_Regulate(void)
;;;313    {
0000e2  b570              PUSH     {r4-r6,lr}
;;;314      u32 Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF;
0000e4  24ff              MOVS     r4,#0xff
0000e6  25ff              MOVS     r5,#0xff
0000e8  26ff              MOVS     r6,#0xff
;;;315    
;;;316      printf("\r\n==============Time Settings=====================================");
0000ea  48cf              LDR      r0,|L1.1064|
0000ec  f7fffffe          BL       __1printf
;;;317      printf("\r\n  Please Set Hours");
0000f0  a0ce              ADR      r0,|L1.1068|
0000f2  f7fffffe          BL       __1printf
;;;318      
;;;319      while(Tmp_HH == 0xFF)
0000f6  e003              B        |L1.256|
                  |L1.248|
;;;320      {
;;;321        Tmp_HH = USART_Scanf(23);
0000f8  2017              MOVS     r0,#0x17
0000fa  f7fffffe          BL       USART_Scanf
0000fe  4604              MOV      r4,r0
                  |L1.256|
000100  2cff              CMP      r4,#0xff              ;319
000102  d0f9              BEQ      |L1.248|
;;;322      }
;;;323      printf(":  %d", Tmp_HH); 
000104  4621              MOV      r1,r4
000106  a0cf              ADR      r0,|L1.1092|
000108  f7fffffe          BL       __1printf
;;;324      printf("\r\n  Please Set Minutes");
00010c  a0cf              ADR      r0,|L1.1100|
00010e  f7fffffe          BL       __1printf
;;;325      while(Tmp_MM == 0xFF)
000112  e003              B        |L1.284|
                  |L1.276|
;;;326      {
;;;327        Tmp_MM = USART_Scanf(59);
000114  203b              MOVS     r0,#0x3b
000116  f7fffffe          BL       USART_Scanf
00011a  4605              MOV      r5,r0
                  |L1.284|
00011c  2dff              CMP      r5,#0xff              ;325
00011e  d0f9              BEQ      |L1.276|
;;;328      }
;;;329      printf(":  %d", Tmp_MM); 
000120  4629              MOV      r1,r5
000122  a0c8              ADR      r0,|L1.1092|
000124  f7fffffe          BL       __1printf
;;;330      printf("\r\n  Please Set Seconds");
000128  a0ce              ADR      r0,|L1.1124|
00012a  f7fffffe          BL       __1printf
;;;331      while(Tmp_SS == 0xFF)
00012e  e003              B        |L1.312|
                  |L1.304|
;;;332      {
;;;333        Tmp_SS = USART_Scanf(59);
000130  203b              MOVS     r0,#0x3b
000132  f7fffffe          BL       USART_Scanf
000136  4606              MOV      r6,r0
                  |L1.312|
000138  2eff              CMP      r6,#0xff              ;331
00013a  d0f9              BEQ      |L1.304|
;;;334      }
;;;335      printf(":  %d", Tmp_SS); 
00013c  4631              MOV      r1,r6
00013e  a0c1              ADR      r0,|L1.1092|
000140  f7fffffe          BL       __1printf
;;;336    
;;;337      /* Return the value to store in RTC counter register */
;;;338      return((Tmp_HH*3600 + Tmp_MM*60 + Tmp_SS));
000144  f44f6061          MOV      r0,#0xe10
000148  4360              MULS     r0,r4,r0
00014a  ebc51105          RSB      r1,r5,r5,LSL #4
00014e  eb000081          ADD      r0,r0,r1,LSL #2
000152  4430              ADD      r0,r0,r6
;;;339    }
000154  bd70              POP      {r4-r6,pc}
;;;340    
                          ENDP

                  Time_Adjust PROC
;;;348    void Time_Adjust(void)
;;;349    {
000156  b510              PUSH     {r4,lr}
;;;350      /* Wait until last write operation on RTC registers has finished */
;;;351      RTC_WaitForLastTask(); 
000158  f7fffffe          BL       RTC_WaitForLastTask
;;;352      /* Change the current time */
;;;353      RTC_SetCounter(Time_Regulate());
00015c  f7fffffe          BL       Time_Regulate
000160  4604              MOV      r4,r0
000162  f7fffffe          BL       RTC_SetCounter
;;;354      /* Wait until last write operation on RTC registers has finished */
;;;355      RTC_WaitForLastTask();   
000166  f7fffffe          BL       RTC_WaitForLastTask
;;;356    }
00016a  bd10              POP      {r4,pc}
;;;357    
                          ENDP

                  RTC_Configuration PROC
;;;235    void RTC_Configuration(void)
;;;236    {
00016c  b510              PUSH     {r4,lr}
;;;237      /* Enable PWR and BKP clocks */
;;;238      RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
00016e  2101              MOVS     r1,#1
000170  f04f50c0          MOV      r0,#0x18000000
000174  f7fffffe          BL       RCC_APB1PeriphClockCmd
;;;239      
;;;240      /* Allow access to BKP Domain */
;;;241      PWR_BackupAccessCmd(ENABLE);
000178  2001              MOVS     r0,#1
00017a  f7fffffe          BL       PWR_BackupAccessCmd
;;;242    
;;;243      /* Reset Backup Domain */
;;;244      BKP_DeInit();
00017e  f7fffffe          BL       BKP_DeInit
;;;245    
;;;246    #ifdef RTCClockSource_LSI
;;;247      /* Enable LSI */ 
;;;248      RCC_LSICmd(ENABLE);
;;;249      /* Wait till LSI is ready */
;;;250      while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
;;;251      {
;;;252      }
;;;253    
;;;254      /* Select LSI as RTC Clock Source */
;;;255      RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);  
;;;256    #elif defined	RTCClockSource_LSE  
;;;257      /* Enable LSE */
;;;258      RCC_LSEConfig(RCC_LSE_ON);
000182  2001              MOVS     r0,#1
000184  f7fffffe          BL       RCC_LSEConfig
;;;259      /* Wait till LSE is ready */

⌨️ 快捷键说明

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