智能车制作
标题:
K60 RTC进不了中断
[打印本页]
作者:
justlxy
时间:
2014-7-30 18:05
标题:
K60 RTC进不了中断
K60 RTC进不了中断
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(1);
//4 开中断
//主循环
while(1)
{
}
}
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++); //延时让晶振稳定振动
//设置补偿时间间隔为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; //开秒计数器
enable_irq(66); //使能RTC中断
}
void rtc_isr(void)
{
// #define VECTOR_082 0x0000_0148
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 += 2;
}
求解决
作者:
justlxy
时间:
2014-7-30 18:06
谁有K60 的RTC的例程的???
作者:
justlxy
时间:
2014-7-31 09:54
我自己搞定了
但是由于最小系统上的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; //开总中断
}
作者:
justlxy
时间:
2014-7-31 09:55
如有问题,还望各位大神多多指教!
作者:
yandld
时间:
2014-11-7 22:42
K60的RTC目前只有一个终端叫做 溢出错误终端,意思是TSR溢出(N万千年之后),所以你等不到了。 看看这个帖子
http://www.znczz.com/thread-202246-1-1.html
作者:
justlxy
时间:
2014-11-9 00:51
yandld 发表于 2014-11-7 22:42
K60的RTC目前只有一个终端叫做 溢出错误终端,意思是TSR溢出(N万千年之后),所以你等不到了。 看看这个帖 ...
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2