微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > CC2530中断寄存器问题

CC2530中断寄存器问题

时间:10-02 整理:3721RD 点击:
IRCON是中断标志寄存器,为什么出中断了该寄存器相应位还是为1?不是应该清0吗?为什么程序运行到T1CCTL0 |=0x04;时,IRCON中的T1IF会被置1?

图片忘加了
#include<ioCC2530.h>
int i=0;
void timer_config()
{
T1CTL |= 0x02;
T1CCTL0 |=0x04;
T1CC0L = 0x40;
T1CC0H = 0x1F;
T1IE = 1;
}
void main()
{
timer_config();
P0DIR |= 0x02;
P0_1=0;
EA = 1;
//int i=0;
while(1)
{
if(i>=1000)
{
P0_1=P0_1;
i=0;
}
}
}
#pragma vector = T1_VECTOR
__interrupt void ISR_Timer1(void)
{
i++;
}


你的中断服务程序注意清除标志,初始化也要注意先清中断标志再去开启中断

不能自动清零吗?

清不掉,IRCON = 0x00;

T1STAT中断标志,IRCON是进入中断服务函数自动清除
你调试也不用关心 和你断点调试有关系 只要确保中断的进入正常

我看了一下是那个定时器1的0通道一直有中断标志,这是为什么?我选的是模模式,应该是溢出中断才对呀

http://bbs.eeworld.com.cn/thread-477653-1-1.html
参考这个tinyos的2530源码 定时器部分 用系统点灯部分 要简单很多
可以去看看转成c文件后的timer1中断函数写法,主要是一个比较通道还有overflow,虚拟定时器可同时注册n个
分为周期性,一次性

也可以看看这个视频
视频地址:http://v.youku.com/v_show/id_XMTM5MDM0MDk1Mg==.html?from=y1.7-1.2
blnk部分和2530例程是一样的,看看代码的简单性



你注意看寄存器的复位 允许

你现在设置的比较器通道
T1CCT0H:T1CCT0L
确定不是
T1CNTH:T1CNTL

是T1CC0H:T1CC0L,没有T1CCT0H:T1CCT0L

我写的tinyos底层部分,虚拟定时器基础驱动两个部分:
1,定时器溢出初始化 只开启溢出中断
static error_t HplCC2530Timer1AlarmCounterP__0__Init__init(void )
{
T1CTL = 0x00;
T1CCTL0 = 0;
T1CCTL1 = 0;
T1CCTL2 = 0;

T1CNTL = 0;
T1CNTH = 0;
T1CTL = (T1CTL & CC2530_T1CTL_DIV_MASK) | CC2530_TIMER1_DIV_128;

T1IE = 1;
TIMIF |= 1 << CC2530_TIMIF_OVFIM;
T1CTL = (T1CTL & CC2530_T1CTL_MODE_MASK) | CC2530_TIMER1_MODE_FREE;
return SUCCESS;
}
2,不关心比较跳过;设定比较起通道1,你不用去关心的是那些中间的赋值计算,那是我的系统计算出来的时间剩余值
static void HplCC2530Timer1AlarmCounterP__0__Alarm0__startAt(uint16_t t0, uint16_t dt)
{
uint16_t set;
uint16_t now;
uint16_t elapsed;

/* atomic removed: atomic calls only */
{
((uint8_t *)&now)[0] = T1CNTL;
(
(uint8_t *)&now)[1] = T1CNTH;

elapsed = now - t0;

if (elapsed >= dt) {
set = now + 5;
}
else
{
uint16_t remaining = dt - elapsed;
if (remaining <= 5) {
set = now + 5;
}
else
{
set = remaining + now;
}
}
T1CC1L = (uint8_t )((uint8_t *)&set)[0];
T1CC1H = (uint8_t )((uint8_t *)&set)[1];

T1CCTL1 |= 1 << CC2530_T1CCTLx_MODE;
T1CCTL1 |= 1 << CC2530_T1CCTLx_IM;
}
return;
}

3,中断函数:
//# 265 "/opt/tinyos-2.x/tos/chips/cc2530/timer_hpl/HplCC2530Timer1AlarmCounterP.nc"
#pragma vector = 75
__interrupt void T__vector_75(void)
{
{ __nesc_atomic_t __nesc_atomic = __nesc_atomic_start();
{
if (* (uint8_t __xdata *)0x62A3 & (1 << CC2530_T1CCTLx_IM) && T1STAT & (1 << CC2530_T1CTL_CH3IF)) {
//比较器通道3中断
* (uint8_t __xdata *)0x62A3 = 0X0;
T1STAT &= (1 << CC2530_T1CTL_CH3IF);
HplCC2530Timer1AlarmCounterP__0__Alarm2__fired();
}
if (T1CCTL2 & (1 << CC2530_T1CCTLx_IM) && T1STAT & (1 << CC2530_T1CTL_CH2IF)) {
//比较器通道2中断
T1CCTL2 = 0X0;
T1STAT &= (1 << CC2530_T1CTL_CH2IF);
HplCC2530Timer1AlarmCounterP__0__Alarm1__fired();
}
if (T1CCTL1 & (1 << CC2530_T1CCTLx_IM) && T1STAT & (1 << CC2530_T1CTL_CH1IF)) {
//比较器通道1中断

T1CCTL1 = 0X0;
T1STAT &= (1 << CC2530_T1CTL_CH1IF);
HplCC2530Timer1AlarmCounterP__0__Alarm0__fired();
}

if (T1STAT & (1 << CC2530_T1CTL_OVFIF)) { //溢出中断
T1STAT &= (1 << CC2530_T1CTL_OVFIF);
HplCC2530Timer1AlarmCounterP__0__Counter__overflow();
}
}
__nesc_atomic_end(__nesc_atomic); }
}

对于* (uint8_t __xdata *)0x62A3这种也是操作寄存器,这个是tinyos转成c文件后的代码,也是肯定能用的驱动,

对于比较起通道 上面已经说过注意芯片 上电初始化默认是开启的,再者就算不开启中断,屏蔽中断发生了该中断事件标志仍然会 置位;
添加中断服务函数标志判断,断点打开看看你进去的是那个中断,反过去查找手册了
T1CNTH:T1CNTL freemode的寄存器计数
通过看函数2已经能看出来假设我要在freemode中断 不影响T1CNTH:T1CNTL计数那就是读取当前T1CNTH:T1CNTL的值加上我要比较起通道定时的值设置
T1CCxH:T1CCxL
然后开启比较起通道
T1CCTLx |= 1 << CC2530_T1CCTLx_MODE;
T1CCTLx |= 1 << CC2530_T1CCTLx_IM;
看不看得懂将不再多说

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top