GNU ARM匯編--(十)s3c2440的RTC
概述
在系統電源關(guān)掉時(shí)RTC可以在備份電池的支持下來(lái)工作.RTC可以使用STRB/LDRB指令傳輸8bit的BCD值到CPU.數據包括秒,分,時(shí),日期,天,月和年.RTC工作在外部32.768KHz的晶振下,而且有報警功能.
屬性
BCD:秒,分,時(shí),日期,天,月和年
閏年產(chǎn)生器
報警功能:報警中斷 從power-off模式喚醒
獨立的電源管腳(RTCVDD)
為RTOS kernel time tick支持毫秒級的tick.
閏年產(chǎn)生器
閏年產(chǎn)生器通過(guò)BCDDATA,BCDMON和BCDYEAR來(lái)決定每個(gè)月最后一天的日期.一個(gè)8bit的計數器只能表示兩個(gè)BCD碼,所以無(wú)法決定00年是否是閏年.舉個(gè)例子,它不能區分1900和2000.為了解決這個(gè)問(wèn)題,s3c2440的RTC模塊在硬件邏輯上支持閏年是2000.1900不是閏年而2000時(shí)閏年.因此s3c2440的00表示2000,而不是1900.
READ/WRITE REGISTERS
為了寫(xiě)BCD寄存器,RTCCON寄存器的第0位必須置高.為了顯示秒,分,時(shí),日期,月和年,CPU從BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR寄存器中讀數據.然而,在讀取多個(gè)寄存器時(shí),可能會(huì )有1秒的偏移.比如,當user讀數據的時(shí)候,假設結果是2059(Year),12(Month),31(Date),23(Hour)和59(Minute).當user讀BCDSEC寄存器,值的范圍是1--59s,到這沒(méi)有問(wèn)題,但是,如果這個(gè)值是0s,由于剛才提到的那一s的偏移,年月日時(shí)分就會(huì )變?yōu)?060(year),1(Month),1(Date),0(Hour)和0(Minute).在這種情況下,如果BCDSEC是0 user應該重讀各個(gè)寄存器.
BACKUP BATTERY OPERATION
RTC由備份電池驅動(dòng),及時(shí)系統電源斷了,備份電池可以通過(guò)RTCVDD管腳向RTC模塊供電.當系統關(guān)閉,CPU和RTC邏輯之間的接口是封閉的,備份電池只是驅動(dòng)晶振電路和BCD計數器來(lái)減少電源消耗.
ALARM FUNCTION
在power-off模式或者正常操作模式下,RTC可以在一個(gè)指定的時(shí)間產(chǎn)生一個(gè)報警信號.在正常操作模式下,報警中斷(INT_RTC)是激活的.在power-off模式,電源管理喚醒信號(PMWKUP)和INT_RTC都是激活的.RTC報警寄存器(RTCALM)決定是否開(kāi)啟報警狀態(tài)和報警時(shí)間的設置.
TICK TIME INTERRUPT
RTC的tick time用于中斷請求.TICNT寄存器有中斷使能位和中斷的計數值.當tick time中斷產(chǎn)生計數值為0.中斷的周期:
Period = (n+1)/128 second
n:Tick time count value(1~127)
REAL TIME CLOCK SPECIAL REGISTERS
RTCCON
RTCCON控制4個(gè)bits,比如RTCEN控制BCD寄存器的讀寫(xiě)使能,CLKSEL,CNTSEL和CLKRST是用于測試的.
RTCEN bit控制CPU與RTC之間的所有接口,所以在系統重啟后應該在RTC控制程序中將其設為1來(lái)使能數據的讀寫(xiě).在電源關(guān)閉前,RTCEN應該清0來(lái)防止對RTC寄存器的不經(jīng)意的寫(xiě)入.
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寄存器都要以字節為單位來(lái)訪(fǎng)問(wèn),可以用STRB和LDRB匯編指令或者char類(lèi)型的指針.
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時(shí)間.在power-off模式下RTCALM寄存器通過(guò)INT_RTC和PWMKUP產(chǎn)生報警信號,而在正常模式下只通過(guò)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] 報警總開(kāi)關(guān) 0
YEAREN [5] Year報警開(kāi)關(guān) 0
MONREN [4] Month報警開(kāi)關(guān) 0
DATEEN [3] Date報警開(kāi)關(guān) 0
HOUREN [2] Hour報警開(kāi)關(guān) 0
MINEN [1] Minute報警開(kāi)關(guān) 0
SECEN [0] Second報警開(kāi)關(guān) 0
ALMSEC
設置Second報警的具體秒數
ALMMIN
設置Minute報警的具體分鐘數
ALMHOUR
設置Hour報警的具體小時(shí)數
ALMDATE
設置Date報警的具體日期
ALMMON
設置Mon報警的具體月份
ALMYEAR
設置Year報警的具體年份
BCDSEC BCDMIN BCDHOUR BCDDATE BCDMON BCDYEAR
用BCD碼表示的秒 分 時(shí) 日期 月份 年
本文引用地址:http://dyxdggzs.com/article/201611/321721.htm給出報警中斷的rtc匯編和c代碼如下,在報警中斷時(shí)是調用PWM的蜂鳴器來(lái)做鬧鐘的:
start.S:
[cpp]view plaincopy
- /*
- watchdogtimerwithdisablereset
- copyleft@dndxhej@gmail.com
- */
- .equNOINT,0xc0
- .equGPBCON,0x56000010@led
- .equGPBDAT,0x56000014@led
- .equGPBUP,0x56000018@led
- .equGPFCON,0x56000050@interruptconfig
- .equEINTMASK,0x560000a4
- .equEXTINT0,0x56000088
- .equEXTINT1,0x5600008c
- .equEXTINT2,0x56000090
- .equINTMSK,0x4A000008
- .equEINTPEND,0x560000a8
- .equSUBSRCPND,0x4a000018
- .equINTSUBMSK,0x4a00001c
- .equSRCPND,0X4A000000
- .equINTPND,0X4A000010
- .equGPHCON,0x56000070
- .equGPHDAT,0x56000074
- .equGPB5_out,(1<<(5*2))
- .equGPB6_out,(1<<(6*2))
- .equGPB7_out,(1<<(7*2))
- .equGPB8_out,(1<<(8*2))
- .equGPBVALUE,(GPB5_out|GPB6_out|GPB7_out|GPB8_out)
- .equLOCKTIME,0x4c000000
- .equMPLLCON,0x4c000004
- .equUPLLCON,0x4c000008
- .equM_MDIV,92
- .equM_PDIV,1
- .equM_SDIV,1
- .equU_MDIV,56
- .equU_PDIV,2
- .equU_SDIV,2
- .equCLKDIVN,0x4c000014
- .equDIVN_UPLL,0
- .equHDIVN,1
- .equPDIVN,1@FCLK:HCLK:PCLK=1:2:4
- .equWTCON,0x53000000
- .equPre_scaler,249
- .equwd_timer,1
- .equclock_select,00@316
- .equint_gen,1@開(kāi)中斷
- .equreset_enable,0@關(guān)掉重啟信號
- .equWTDAT,0x53000004
- .equCount_reload,50000@定時(shí)器定為2SPCLK=100MPCLK/(Pre_scaler+1)/clock_select=100M/(249+1)/16=25k50000/25k=2s
- .equWTCNT,0x53000008
- .equCount,50000
- .equTCFG0,0x51000000
- .equPrescaler1,0x00@[15:8]Timer234
- .equPrescaler0,249@[7:0]Timer01
- .equTCFG1,0x51000004
- .equDMA_MODE,0x0@[23:20]nodmachannal
- .equMUX0,0x2@[3:0]1/8
- @定時(shí)器輸入時(shí)鐘周期=PCLK/(prescaler+1)/(dividervalue)
- @clk=100M/(249+1)/8=25k
- .equTCON,0x51000008
- .equDZ_eable,0@[4]關(guān)閉死區的操作
- .equauto_reload,1@[3]auto_reload
- .equinverter,1@[2]打開(kāi)電平反轉
- .equman_update,1@[1]手動(dòng)更新
- .equclear_man_update,0
- .equstart,1@[0]開(kāi)始
- .equstop,0@[0]停止
- .equTCNTB0,0x5100000c
- .equTCMPB0,0x51000010
- .equTCNTO0,0x51000014
- .equULCON0,0x50000000
- .equIR_MODE,0x0@[6]正常模式
- .equParity_Mode,0x0@[5:3]無(wú)校驗位
- .equNum_of_stop_bit,0x0@[2]一個(gè)停止位
- .equWord_length,0b11@[1:0]8個(gè)數據位
- .equUCON0,0x50000004
- .equFCLK_Div,0@[15:12]時(shí)鐘源選擇用PCLK,所以這里用默認值
- .equClk_select,0b00@[11:10]時(shí)鐘源選擇使用PCLK
- .equTx_Int_Type,1@[9]中斷請求類(lèi)型為L(cháng)evel
- .equRx_Int_Type,0@1@[8]中斷請求類(lèi)型為L(cháng)evel
- .equRx_Timeout,0@[7]
- .equRx_Error_Stat_Int,1@[6]
- .equLoopback_Mode,0@[5]正常模式
- .equBreak_Sig,0@[4]不發(fā)送終止信號
- .equTx_Mode,0b01@[3:2]中斷請求或輪循模式
- .equRx_Mode,0b01@[1:0]中斷請求或輪循模式
- .equUFCON0,0x50000008
- .equTx_FIFO_Trig_Level,0b00@[7:6]
- .equRx_FIFO_Trig_Level,0b00@[5:4]
- .equTx_FIFO_Reset,0b0@[2]
- .equRx_FIFO_Reset,0b0@[1]
- .equFIFO_Enable,0b0@[0]非FIFO模式
- .equUMCON0,0x5000000C@這個(gè)寄存器可以不管的
- .equUTRSTAT0,0x50000010
- .equUERSTAT0,0x50000014
- .equUFSTAT0,0x50000018
- .equUMSTAT0,0x5000001C
- .equUTXH0,0x50000020@(L小端)
- .equURXH0,0x50000024@(L小端)
- .equUBRDIV0,0x50000028
- .equUBRDIV,0x35@PCLK=400M/4=100MUBRDIV=(int)(100M/115200/16)-1=53=0x35
- .equBCDMIN,0x57000074
- .equBCDSEC,0x57000070
- //.globalBuzzer_Freq_Set
- .global_start
- _start:breset
- ldrpc,_undefined_instruction
- ldrpc,_software_interrupt
- ldrpc,_prefetch_abort
- ldrpc,_data_abort
- ldrpc,_not_used
- @birq
- ldrpc,_irq
- ldrpc,_fiq
- _undefined_instruction:.wordundefined_instruction
- _software_interrupt:.wordsoftware_interrupt
- _prefetch_abort:.wordprefetch_abort
- _data_abort:.worddata_abort
- _not_used:.wordnot_used
- _irq:.wordirq
- _fiq:.wordfiq
- .balignl16,0xdeadbeef
- reset:
-
關(guān)鍵詞:
ARM匯編s3c2440RT
相關(guān)推薦
技術(shù)專(zhuān)區
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線(xiàn)
- 開(kāi)關(guān)電源
- 單片機
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機控制
- 藍牙
- PLC
- PWM
- 汽車(chē)電子
- 轉換器
- 電源管理
- 信號放大器
評論