金牌会员
- 积分
- 1562
- 威望
- 699
- 贡献
- 619
- 兑换币
- 463
- 注册时间
- 2014-7-13
- 在线时间
- 122 小时
- 毕业学校
- 江苏科技大学
|
3#
楼主 |
发表于 2014-7-31 09:54:29
|
只看该作者
我自己搞定了
但是由于最小系统上的VBAT未上电,所以只能进时间无效中断,32768的晶振就没有起振,龙邱的板子有点坑爹,看原理图上明明是接上了的,可是用外用表测一下却发现,VBAT没有电!
附上我修改后的程序
主要区别是将开启中断的位置提前了
——————————华丽的分割线————————————————————————————————
void rtc_init(uint32 alarm);
//全局变量声明
//uint8 aa = 1;
//主函数
void main(void)
{
//1 主程序使用的变量定义
uint32 runcount; // 运行计数器
//2 关中断
DisableInterrupts; //禁止总中断
SIM_SCGC5 = SIM_SCGC5_PORTA_MASK;
//3 模块初始化
light_init(Light_Run_PORT,Light_Run1,Light_OFF); //指示灯初始化
light_init(Light_Run_PORT,Light_Run2,Light_OFF); //指示灯初始化
light_init(Light_Run_PORT,Light_Run3,Light_ON); //指示灯初始化
light_init(Light_Run_PORT,Light_Run4,Light_ON); //指示灯初始化
rtc_init(0);
//4 开中断
EnableInterrupts; //开总中断
//主循环
while(1)
{
runcount++;
if(runcount >= 5000000)
{
light_change(Light_Run_PORT,Light_Run1);//指示灯的亮、暗状态切换
runcount = 0;
}
}
}
void rtc_init(uint32 alarm)
{
uint32 i;
SIM_SCGC6 |= SIM_SCGC6_RTC_MASK; //打开RTC时钟
RTC_CR = RTC_CR_SWR_MASK; //复位所有RTC寄存器值(除了SWR位)
RTC_CR &= ~RTC_CR_SWR_MASK; //将SWR位清零(清除复位标志)
RTC_CR |= RTC_CR_OSCE_MASK; //开启振荡器
for(i = 0;i < 0x600000;i++); //延时让晶振稳定振动
EnableInterrupts; //开总中断
enable_irq(66); //使能RTC中断
//设置补偿时间间隔为0
//设置溢出时钟周期 32768 clock cycles
RTC_TCR = RTC_TCR_CIR(0) | RTC_TCR_TCR(0);
//当时间计数器开启时,每当TAR[TAR]等于TSR[TSR]
//并且TSR[TSR]增加时,SR[TAF]设置。写TAR清除SR[TAF]。
RTC_TSR = 0; //TSR初始值,即清空RTC时间秒寄存器
RTC_TAR = alarm; //设置TAR初始值
RTC_SR |= RTC_SR_TCE_MASK; //开秒计数器
RTC_SR &= ~RTC_SR_TAF_MASK;
// EnableInterrupts; //开总中断
}
void rtc_isr(void)
{
DisableInterrupts; //禁止总中断
if((RTC_SR & RTC_SR_TIF_MASK) == 0x01) //无效
{
// RTC_SR &= 0x07;
// RTC_TSR = 0x00;
// light_change(Light_Run_PORT,Light_Run1);//指示灯的亮、暗状态切换
light_change(Light_Run_PORT,Light_Run2);//指示灯的亮、暗状态切换
RTC_SR |= RTC_SR_TIF_MASK; //清除中断标志位
}
else if((RTC_SR & RTC_SR_TOF_MASK) == 0x02) //溢出
{
// RTC_SR &= 0x07;
// RTC_TSR = 0x00; //计数器关闭 可以读取或写入
light_change(Light_Run_PORT,Light_Run3);//指示灯的亮、暗状态切换
light_change(Light_Run_PORT,Light_Run4);//指示灯的亮、暗状态切换
RTC_SR |= RTC_SR_TOF_MASK; //清除中断标志位
}
else if((RTC_SR & RTC_SR_TAF_MASK) == 0x04) //报警
{
// light_change(Light_Run_PORT,Light_Run1);//指示灯的亮、暗状态切换
light_change(Light_Run_PORT,Light_Run2);//指示灯的亮、暗状态切换
light_change(Light_Run_PORT,Light_Run3);//指示灯的亮、暗状态切换
light_change(Light_Run_PORT,Light_Run4);//指示灯的亮、暗状态切换
// RTC_TAR = RTC_TSR; //TAR == TSR TSR增加触发
RTC_SR |= RTC_SR_TAF_MASK; //清除中断标志位
}
// RTC_TAR += 1;
EnableInterrupts; //开总中断
}
|
|