新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GNU ARM匯編--(十)s3c2440的RTC

        GNU ARM匯編--(十)s3c2440的RTC

        作者: 時間:2016-11-26 來源:網絡 收藏
        RTC


        概述
        在系統電源關掉時RTC可以在備份電池的支持下來工作.RTC可以使用STRB/LDRB指令傳輸8bit的BCD值到CPU.數據包括秒,分,時,日期,天,月和年.RTC工作在外部32.768KHz的晶振下,而且有報警功能.


        屬性
        BCD:秒,分,時,日期,天,月和年
        閏年產生器
        報警功能:報警中斷 從power-off模式喚醒
        獨立的電源管腳(RTCVDD)
        為RTOS kernel time tick支持毫秒級的tick.


        閏年產生器
        閏年產生器通過BCDDATA,BCDMON和BCDYEAR來決定每個月最后一天的日期.一個8bit的計數器只能表示兩個BCD碼,所以無法決定00年是否是閏年.舉個例子,它不能區分1900和2000.為了解決這個問題,s3c2440的RTC模塊在硬件邏輯上支持閏年是2000.1900不是閏年而2000時閏年.因此s3c2440的00表示2000,而不是1900.


        READ/WRITE REGISTERS
        為了寫BCD寄存器,RTCCON寄存器的第0位必須置高.為了顯示秒,分,時,日期,月和年,CPU從BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR寄存器中讀數據.然而,在讀取多個寄存器時,可能會有1秒的偏移.比如,當user讀數據的時候,假設結果是2059(Year),12(Month),31(Date),23(Hour)和59(Minute).當user讀BCDSEC寄存器,值的范圍是1--59s,到這沒有問題,但是,如果這個值是0s,由于剛才提到的那一s的偏移,年月日時分就會變為2060(year),1(Month),1(Date),0(Hour)和0(Minute).在這種情況下,如果BCDSEC是0 user應該重讀各個寄存器.


        BACKUP BATTERY OPERATION
        RTC由備份電池驅動,及時系統電源斷了,備份電池可以通過RTCVDD管腳向RTC模塊供電.當系統關閉,CPU和RTC邏輯之間的接口是封閉的,備份電池只是驅動晶振電路和BCD計數器來減少電源消耗.


        ALARM FUNCTION
        在power-off模式或者正常操作模式下,RTC可以在一個指定的時間產生一個報警信號.在正常操作模式下,報警中斷(INT_RTC)是激活的.在power-off模式,電源管理喚醒信號(PMWKUP)和INT_RTC都是激活的.RTC報警寄存器(RTCALM)決定是否開啟報警狀態和報警時間的設置.


        TICK TIME INTERRUPT
        RTC的tick time用于中斷請求.TICNT寄存器有中斷使能位和中斷的計數值.當tick time中斷產生計數值為0.中斷的周期:
        Period = (n+1)/128 second
        n:Tick time count value(1~127)


        REAL TIME CLOCK SPECIAL REGISTERS
        RTCCON
        RTCCON控制4個bits,比如RTCEN控制BCD寄存器的讀寫使能,CLKSEL,CNTSEL和CLKRST是用于測試的.
        RTCEN bit控制CPU與RTC之間的所有接口,所以在系統重啟后應該在RTC控制程序中將其設為1來使能數據的讀寫.在電源關閉前,RTCEN應該清0來防止對RTC寄存器的不經意的寫入.
        Register Address R/W Description Reset Value
        RTCCON 0x57000040(L)/0x57000043(B) R/W RTC control register 0x0


        RTCCON Bit Description Initial State
        RTCEN [0] RTC控制使能 0
        注意:所有的RTC寄存器都要以字節為單位來訪問,可以用STRB和LDRB匯編指令或者char類型的指針.


        TICNT
        Register Address R/W Description Reset Value
        TICNT 0x57000044(L)/0x57000047(B) R/W(by byte) Tick time count register 0x0


        TICNT BIT Description Initial State
        TICK INT ENABLE [7] tick time 中斷使能 0
        TICK TIME COUNT [6:0] tick time 計數值(1~127) 000000


        RTCALM
        RTCALM決定alarm使能和alarm時間.在power-off模式下RTCALM寄存器通過INT_RTC和PWMKUP產生報警信號,而在正常模式下只通過INT_RTC.


        Register Address R/W Description Reset Value
        RTCALM 0x57000050(L)/0x57000053(B) R/W(by type) RTC報警控制寄存器 0x0


        RTCALM Bit Description Initial State
        ALMEN [6] 報警總開關 0
        YEAREN [5] Year報警開關 0
        MONREN [4] Month報警開關 0
        DATEEN [3] Date報警開關 0
        HOUREN [2] Hour報警開關 0
        MINEN [1] Minute報警開關 0
        SECEN [0] Second報警開關 0


        ALMSEC
        設置Second報警的具體秒數
        ALMMIN
        設置Minute報警的具體分鐘數
        ALMHOUR
        設置Hour報警的具體小時數
        ALMDATE
        設置Date報警的具體日期
        ALMMON
        設置Mon報警的具體月份
        ALMYEAR
        設置Year報警的具體年份


        BCDSEC BCDMIN BCDHOUR BCDDATE BCDMON BCDYEAR

        用BCD碼表示的秒 分 時 日期 月份 年

        本文引用地址:http://www.104case.com/article/201611/321721.htm

        給出報警中斷的rtc匯編和c代碼如下,在報警中斷時是調用PWM的蜂鳴器來做鬧鐘的:

        start.S:

        [cpp]view plaincopy
        1. /*
        2. watchdogtimerwithdisablereset
        3. copyleft@dndxhej@gmail.com
        4. */
        5. .equNOINT,0xc0
        6. .equGPBCON,0x56000010@led
        7. .equGPBDAT,0x56000014@led
        8. .equGPBUP,0x56000018@led
        9. .equGPFCON,0x56000050@interruptconfig
        10. .equEINTMASK,0x560000a4
        11. .equEXTINT0,0x56000088
        12. .equEXTINT1,0x5600008c
        13. .equEXTINT2,0x56000090
        14. .equINTMSK,0x4A000008
        15. .equEINTPEND,0x560000a8
        16. .equSUBSRCPND,0x4a000018
        17. .equINTSUBMSK,0x4a00001c
        18. .equSRCPND,0X4A000000
        19. .equINTPND,0X4A000010
        20. .equGPHCON,0x56000070
        21. .equGPHDAT,0x56000074
        22. .equGPB5_out,(1<<(5*2))
        23. .equGPB6_out,(1<<(6*2))
        24. .equGPB7_out,(1<<(7*2))
        25. .equGPB8_out,(1<<(8*2))
        26. .equGPBVALUE,(GPB5_out|GPB6_out|GPB7_out|GPB8_out)
        27. .equLOCKTIME,0x4c000000
        28. .equMPLLCON,0x4c000004
        29. .equUPLLCON,0x4c000008
        30. .equM_MDIV,92
        31. .equM_PDIV,1
        32. .equM_SDIV,1
        33. .equU_MDIV,56
        34. .equU_PDIV,2
        35. .equU_SDIV,2
        36. .equCLKDIVN,0x4c000014
        37. .equDIVN_UPLL,0
        38. .equHDIVN,1
        39. .equPDIVN,1@FCLK:HCLK:PCLK=1:2:4
        40. .equWTCON,0x53000000
        41. .equPre_scaler,249
        42. .equwd_timer,1
        43. .equclock_select,00@316
        44. .equint_gen,1@開中斷
        45. .equreset_enable,0@關掉重啟信號
        46. .equWTDAT,0x53000004
        47. .equCount_reload,50000@定時器定為2SPCLK=100MPCLK/(Pre_scaler+1)/clock_select=100M/(249+1)/16=25k50000/25k=2s
        48. .equWTCNT,0x53000008
        49. .equCount,50000
        50. .equTCFG0,0x51000000
        51. .equPrescaler1,0x00@[15:8]Timer234
        52. .equPrescaler0,249@[7:0]Timer01
        53. .equTCFG1,0x51000004
        54. .equDMA_MODE,0x0@[23:20]nodmachannal
        55. .equMUX0,0x2@[3:0]1/8
        56. @定時器輸入時鐘周期=PCLK/(prescaler+1)/(dividervalue)
        57. @clk=100M/(249+1)/8=25k
        58. .equTCON,0x51000008
        59. .equDZ_eable,0@[4]關閉死區的操作
        60. .equauto_reload,1@[3]auto_reload
        61. .equinverter,1@[2]打開電平反轉
        62. .equman_update,1@[1]手動更新
        63. .equclear_man_update,0
        64. .equstart,1@[0]開始
        65. .equstop,0@[0]停止
        66. .equTCNTB0,0x5100000c
        67. .equTCMPB0,0x51000010
        68. .equTCNTO0,0x51000014
        69. .equULCON0,0x50000000
        70. .equIR_MODE,0x0@[6]正常模式
        71. .equParity_Mode,0x0@[5:3]無校驗位
        72. .equNum_of_stop_bit,0x0@[2]一個停止位
        73. .equWord_length,0b11@[1:0]8個數據位
        74. .equUCON0,0x50000004
        75. .equFCLK_Div,0@[15:12]時鐘源選擇用PCLK,所以這里用默認值
        76. .equClk_select,0b00@[11:10]時鐘源選擇使用PCLK
        77. .equTx_Int_Type,1@[9]中斷請求類型為Level
        78. .equRx_Int_Type,0@1@[8]中斷請求類型為Level
        79. .equRx_Timeout,0@[7]
        80. .equRx_Error_Stat_Int,1@[6]
        81. .equLoopback_Mode,0@[5]正常模式
        82. .equBreak_Sig,0@[4]不發送終止信號
        83. .equTx_Mode,0b01@[3:2]中斷請求或輪循模式
        84. .equRx_Mode,0b01@[1:0]中斷請求或輪循模式
        85. .equUFCON0,0x50000008
        86. .equTx_FIFO_Trig_Level,0b00@[7:6]
        87. .equRx_FIFO_Trig_Level,0b00@[5:4]
        88. .equTx_FIFO_Reset,0b0@[2]
        89. .equRx_FIFO_Reset,0b0@[1]
        90. .equFIFO_Enable,0b0@[0]非FIFO模式
        91. .equUMCON0,0x5000000C@這個寄存器可以不管的
        92. .equUTRSTAT0,0x50000010
        93. .equUERSTAT0,0x50000014
        94. .equUFSTAT0,0x50000018
        95. .equUMSTAT0,0x5000001C
        96. .equUTXH0,0x50000020@(L小端)
        97. .equURXH0,0x50000024@(L小端)
        98. .equUBRDIV0,0x50000028
        99. .equUBRDIV,0x35@PCLK=400M/4=100MUBRDIV=(int)(100M/115200/16)-1=53=0x35
        100. .equBCDMIN,0x57000074
        101. .equBCDSEC,0x57000070
        102. //.globalBuzzer_Freq_Set
        103. .global_start
        104. _start:breset
        105. ldrpc,_undefined_instruction
        106. ldrpc,_software_interrupt
        107. ldrpc,_prefetch_abort
        108. ldrpc,_data_abort
        109. ldrpc,_not_used
        110. @birq
        111. ldrpc,_irq
        112. ldrpc,_fiq
        113. _undefined_instruction:.wordundefined_instruction
        114. _software_interrupt:.wordsoftware_interrupt
        115. _prefetch_abort:.wordprefetch_abort
        116. _data_abort:.worddata_abort
        117. _not_used:.wordnot_used
        118. _irq:.wordirq
        119. _fiq:.wordfiq
        120. .balignl16,0xdeadbeef
        121. reset:

        122. 上一頁 1 2 3 下一頁

        關鍵詞: ARM匯編s3c2440RT

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 高陵县| 龙山县| 乡城县| 塘沽区| 台北市| 平原县| 荥经县| 山阳县| 哈尔滨市| 黔西县| 西城区| 镇赉县| 卫辉市| 富平县| 西乡县| 原平市| 漾濞| SHOW| 突泉县| 霍山县| 阳曲县| 安新县| 毕节市| 平武县| 泗阳县| 嘉义市| 若羌县| 夹江县| 阿拉善左旗| 贺州市| 萝北县| 姚安县| 湘阴县| 延庆县| 定远县| 百色市| 加查县| 平山县| 鸡东县| 沂源县| 福建省|