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码表明的秒 分 时 日期 月份 年
给出报警中止的rtc汇编和c代码如下,在报警中止时是调用PWM的蜂鸣器来做闹钟的:
start.S:
- /*
- 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@开中止
- .equreset_enable,0@关掉重启信号
- .equWTDAT,0x53000004
- .equCount_reload,50000@定时器定为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
- @定时器输入时钟周期=PCLK/(prescaler+1)/(dividervalue)
- @clk=100M/(249+1)/8=25k
- .equTCON,0x51000008
- .equDZ_eable,0@[4]封闭死区的操作
- .equauto_reload,1@[3]auto_reload
- .equinverter,1@[2]翻开电平回转
- .equman_update,1@[1]手动更新
- .equclear_man_update,0
- .equstart,1@[0]开端
- .equstop,0@[0]中止
- .equTCNTB0,0x5100000c
- .equTCMPB0,0x51000010
- .equTCNTO0,0x51000014
- .equULCON0,0x50000000
- .equIR_MODE,0x0@[6]正常形式
- .equParity_Mode,0x0@[5:3]无校验位
- .equNum_of_stop_bit,0x0@[2]一个中止位
- .equWord_length,0b11@[1:0]8个数据位
- .equUCON0,0x50000004
- .equFCLK_Div,0@[15:12]时钟源挑选用PCLK,所以这儿用默认值
- .equClk_select,0b00@[11:10]时钟源挑选运用PCLK
- .equTx_Int_Type,1@[9]中止请求类型为Level
- .equRx_Int_Type,0@1@[8]中止请求类型为Level
- .equRx_Timeout,0@[7]
- .equRx_Error_Stat_Int,1@[6]
- .equLoopback_Mode,0@[5]正常形式
- .equBreak_Sig,0@[4]不发送停止信号
- .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@这个寄存器能够不论的
- .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:
-