📄 testrtc.c
字号:
//------------------功能说明----------------//
//--实时时钟,并定时到闹铃响,n s后自动关闭--//
//------------------------------------------//
#include "2440lib.h"
#include "2440addr.h"
//--------------声明-----------------//
void SetRTCtime( U8 RTCyear, U8 RTCmon, U8 RTCdate, U8 RTCweek, U8 RTChour, U8 RTCmin, U8 RTCsec);//设置时间
void SetRTCalm(U8 AlmYear, U8 AlmMon, U8 AlmDate, U8 AlmHour, U8 AlmMin, U8 AlmSec);//设置闹铃
void OpenRTC(void);//开始RTC
void CloseRTC(void);//关闭RTC
void OpenAlarm(void);//打开闹铃
void CloseAlarm(void);//关闭闹铃
void GetTime(void);//读取时间
void __irq TickIsr(void);//秒中断
void __irq AlarmIsr(void);//闹铃中断
//--------------定义----------------//
#define FREQ 5000 //freq = 5000
char *week[8] = { "","SUN","MON", "TUES", "WED", "THURS","FRI", "SAT" } ;//指针数组//don't set to "unsigned char"
static U16 year;
static U8 month,date,weekday,hour,min,sec;
void xmain(void)
{
ChangeClockDivider(3,1);
ChangeMPllValue(127,2,1); //405MHZ
Isr_Init();
Uart_Init(0, 115200);
Uart_Select(0);
Uart_Printf("the main is running\n");
//-------------设定时间,闹铃--------------//
SetRTCtime(8,10,30,04,11,55,0x30);//年、月、日、星期、时、分、秒
SetRTCalm(8,10,30,11,55,0x35);//年、月、日、时、分、秒
//--------------打开------------//
OpenRTC();//
OpenAlarm();//开闹铃
while(1);
}
//设定时间
void SetRTCtime( U8 RTCyear, U8 RTCmon, U8 RTCdate, U8 RTCday, U8 RTChour, U8 RTCmin, U8 RTCsec)
{
rRTCCON = 0x01;//RTC control enable
rBCDYEAR = RTCyear;//年
rBCDMON = RTCmon;//月
rBCDDATE = RTCdate;//日
rBCDDAY = RTCday;//星期
rBCDHOUR = RTChour;//时
rBCDMIN = RTCmin;//分
rBCDSEC = RTCsec;//秒
rRTCCON = 0x00;//RTC control disable
}
//设定闹铃,年,月,日,时,分,秒
void SetRTCalm(U8 AlmYear, U8 AlmMon, U8 AlmDate, U8 AlmHour, U8 AlmMin, U8 AlmSec)
{
rRTCCON = 0x01;//RTC control enable(read/write)
rALMYEAR = AlmYear;//年
rALMMON = AlmMon;//月
rALMDATE = AlmDate;//日
rALMHOUR = AlmHour;//时
rALMMIN = AlmMin;//分
rALMSEC = AlmSec;//秒
rRTCCON = 0x00;//RTC control disable
}
//打开时钟
//即设置Tick时钟计数寄存器
void OpenRTC(void)
{
//设置Tick时钟计数寄存器
rTICNT |= (1<<7)//Tick interrput enanle
|127;//Tick time count value = 127
//设置中断,用来输出时间信息
pISR_TICK = (unsigned)TickIsr;//向量地址//don't to "U8",I don't kown.
EnableIrq(BIT_TICK);//使能中断
}
//关闭时钟
void CloseRTC(void)
{
rTICNT &= ~(1<<7);//Tick interupt disable
DisableIrq(BIT_TICK);//disable
}
//打开闹铃
//即设置RTC定时控制寄存器
void OpenAlarm(void)
{
//设置RTC定时控制寄存器
rRTCALM = 0x7f;//all of enable
//设置中断,闹铃到鸣蜂鸣器
ClearPending(BIT_RTC);
pISR_RTC = (unsigned)AlarmIsr;//(U8)AlarmIsr();//向量地址
EnableIrq(BIT_RTC);//enable RTC interrupt
}
//关闭闹铃
void CloseAlarm(void)
{
rRTCALM = 0;//disable all of alarm
DisableIrq(BIT_RTC);//disable
}
//得到时间
void GetTime(void)
{
rRTCCON = 0x01;//enable read
year = rBCDYEAR;//年
month = rBCDMON;//月
date = rBCDDATE;//日
weekday = rBCDDAY;//星期
hour = rBCDHOUR;//时
min = rBCDMIN;//分
sec = rBCDSEC;//秒
rRTCCON = 0x00;//disable read
}
//Tick ISR
void __irq TickIsr(void)
{
ClearPending(BIT_TICK);//Clear
GetTime();//get time
Uart_Printf("RTC TIME : %4d-%02d-%02d - %s - %02d:%02d:%02x\n",year,month,date,week[weekday],hour,min,sec);//显示格式?
}
//Buzzer run
void BuzzerRun(void)
{
//---------------set PWM-----------------//
rGPBCON = ( rGPBCON | (3<<2) ) & ( ~(1<<2) );//GPB1 -> PWM
rTCFG0 = 0x0f;//Prescaler 0
rTCFG1 |= (1<<5);//MUX 1 (0010 = 1/8)
rTCNTB1 = (PCLK>>7)/FREQ;//周期
rTCMPB1 = rTCNTB1>>1; // 占空比50%
//set Timer control register
rTCON |= (1<<11)//auto reload
|(0<<10)//inverter off
|(1<<9)//Updata TCNTB1 & TCMPB1
|(1<<8);//start for Timer1
rTCON &= ~(1<<9);//clear manual update bit
}
//Buzzer stop
void BuzzerStop(void)
{ //set GPB1 as output,and stop for Timer1
rGPBCON = ( rGPBCON | (3<<2) ) & ( ~(2<<2) );//GPB1 -> output
rGPBDAT &= ~(1<<1);//output '0'
rTCON &= ~(1<<8);//stop for Timer1
}
//alarm ISR
void __irq AlarmIsr(void)
{
static U8 FalgBuzzerStop;
ClearPending(BIT_RTC);
if(!FalgBuzzerStop)//as '0',Run Buzzer and reset alarm
{
BuzzerRun();//run
//reset alarm
SetRTCalm(8,10,30,11,55,0x40);//年、月、日、时、分、秒
FalgBuzzerStop = 1;//
Uart_Printf("Run alarm\n");
}
else//as '1',stop Buzzer ,close alarm
{
BuzzerStop();//stop buzzer
CloseAlarm();//close alarm
Uart_Printf("Stop alarm\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -