TI中文支持网
TI专业的中文技术问题搜集分享网站

CC1310: RTC CH0和CH1 的compare事件是否有冲突

Part Number:CC1310

请问CC1310的RTC CH0和CH1的compare定时器事件是否存在冲突,如下是我的在CC1310_LAUNCHXL开发板上跑的测试代码,我用了RTC CH1的compare定时器,已经实现了红灯一秒闪烁,但是发现绿灯没有1秒闪烁,程序好像一直卡在INT_AON_RTC_COMB的中断回调函数里面出不来,这是什么原因呢?是程序正常运行的时候开了RTC CH0的compare,所以我现在用RTC CH1的compare,影响到程序正常运行了吗?

//rtc channel1 compare事件中断回调函数
void rtc_ch1_interrupt_handler(void)
{  //清除事件标志
  AONRTCEventClear(AON_RTC_CH1);
  IntPendClear(INT_AON_RTC_COMB);  //开发板绿灯引脚电平转换
  GPIO_toggleDio(IOID_6);  //重新生成1秒事件
  AONRTCCompareValueSet(AON_RTC_CH1, (AONRTCCurrentCompareValueGet() + FACTOR_SEC_TO_COMP_VAL_FORMAT));}

void rtc_ch1_compare_timer_init(void)
{
  AONRTCChannelEnable(AON_RTC_CH1); //启用通道1
  AONRTCModeCh1Set(AON_RTC_MODE_CH1_COMPARE); //启用CH1捕获模式
  AONRTCCompareValueSet(AON_RTC_CH1, FACTOR_SEC_TO_COMP_VAL_FORMAT); // 1秒后生成事件
  AONRTCCombinedEventConfig(AON_RTC_CH1);  IntRegister(INT_AON_RTC_COMB, rtc_ch1_interrupt_handler);  IntEnable(INT_AON_RTC_COMB); //开启compare事件中断}

int main(void)
{
  //CC1310 Nortos启动
  Power_init();
  PIN_init(BoardGpioInitTable);
  NoRTOS_start();  //开发板红灯引脚初始化为输出低
  GPIO_setOutputEnableDio(IOID_6, GPIO_OUTPUT_ENABLE);  GPIO_writeDio(IOID_6, PIN_LOW);

  //开发板绿灯引脚初始化为输出低  GPIO_setOutputEnableDio(IOID_7, GPIO_OUTPUT_ENABLE);  GPIO_writeDio(IOID_7, PIN_LOW);  //初始化RTC channel 1 compare事件
  rtc_ch1_compare_timer_init();
  while(1)
  {
    //绿灯间隔一秒闪烁
    GPIO_toggleDio(IOID_7);
    sleep(1);  }
}

Galaxy Yue:

你好,

理论上是不会有冲突的。

在你的函数 rtc_ch1_interrupt_handler()中,你进行操作的是绿灯IOID6,

wei zhang 说:  //开发板绿灯引脚电平转换  GPIO_toggleDio(IOID_6);

而在主循环中通过sleep(1)直接操作绿灯(IDIO7),这种情况下两处都在绿灯

另外,考虑中断事件的状态未清除完全

可以参考一下这个link

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1158141/cc1312r-how-to-use-rtc-channel-1-and-2-with-ti-rtos7

,

wei zhang:

中断服务函数里面那个注释写错了,IOID_6就是红灯,另外中断服务函数里面我已经作了中断事件状态清除( AONRTCEventClear(AON_RTC_CH1);  IntPendClear(INT_AON_RTC_COMB);)请问还有哪些事件状态需要清除呢?以及初始化配置有没有问题?

,

Galaxy Yue:

wei zhang 说:IOID_6就是红灯

好的 

wei zhang 说:( AONRTCEventClear(AON_RTC_CH1);  IntPendClear(INT_AON_RTC_COMB);)

一般来说这两个够了 我再看一下

,

Galaxy Yue:

1.可能是因为你没有正确地处理嵌套的中断。当一个中断正在处理时,如果另一个中断发生,它通常会被挂起,直到当前的中断处理完成。在你的代码中,如果rtc_ch1_interrupt_handler函数正在执行并且另一个rtc_ch1_interrupt_handler事件发生,那么这个事件将被挂起,等待当前的处理完成。

你可以添加优先级,或者挂起当前的中断

,

Galaxy Yue:

2.可以通过读取相关的状态寄存器来验证中断标志是否真正被清除。如果API提供了返回值,检查返回值以确认操作是否成功。

赞(0)
未经允许不得转载:TI中文支持网 » CC1310: RTC CH0和CH1 的compare事件是否有冲突
分享到: 更多 (0)