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提供了返回值,检查返回值以确认操作是否成功。