临时问题记录
欢迎使用 小书匠编辑器,您可以通过设置里的修改模板来改变新建文章的内容。
RTC issue 调试过程(已解决)
-
问题描述
遥控器工程使用RTC,程序死机。
RTC 时钟选择 wdt2
注:- RTC 时钟自己提供,即 RTC update 放到其他定时中断,不会有问题。
- demo工程没有问题。
-
解决过程
- debug: 程序没有跑飞,但一直进Timer_CallBack函数。
- 在Timer_Callback里加IO口翻转,测出进入callback时间4us。疑似timer中断相关的标志没有清除。
这里看到这种写法 和 wdt1 不相关的标志是不会清除的。 - 检查 wdt 中断设置
开启RTC 选择WDT2后,在cyfitter_cfg.c会多如下函数:
函数如下:
显然这个是 wdt 的总中断函数 wdt0 wdt1 wdt2 都是公用这个函数的。 - 奇怪的问题来了:在debug中,我们通过断点运行, 在主程序使能了 RTC后,程序继续运行,使能 timer,然后程序就进了Timer_CallBack,之后一直进 Timer_CallBack,而整个过程一次都没有进CySysWdtIsr。
- 那我们就可以继续观察 我们使用的 timer(wdt1) 和 RTC(wdt2) 初始化有什么差别,很快就找到了问题:
这是 RTC的回调函数设置
这是timer的回调函数设置
看到了吧,问题非常清楚,这个timer的书写者,没有用creator 标准的wdt方法书写,直接用CyIntSetVector
,来设置 Timer_CallBack。
也就是说,这里把 wdt的总中断映射又改成了Timer_CallBack,所以就不会再进CySysWdtIsr
,关键问题是,Timer_CallBack又没有清除 wdt1以外的两个标志,导致wdt2置位后一直没有被清除。
-
解决方法:timer(WDT1)的回调函数设置方法 使用和 RTC(WDT2)一样的声明方式。
Cy 看门狗复位问题
-
描述
发现目前程序有死机现象,开了看门狗,却没有复位。 -
目前看门狗使用的是这种模式 WDT0:
查了下 PSoC_4_BLE_Architecture_TRM 现在的模式描述如下:
-
问题
所以问题就是上面这句话怎么解释,因为程序里 wdt中断 肯定是用了,下面可以看下目前程序对 wdt 中断的使用情况。 -
问题补充
我有用到 wdt1 用systick wdt2 做 RTC
我又查了下我的中断部分,涉及到 wdt 中断的几个地方如下,有三个部分:- 映射看门狗中断
cyfitter_cfg.c 中 把看门狗中断做了一次映射。
关于中断函数内容,这里可以看到,wdt0 wdt1 wdt2 的中断处理都在这里,通过标志位分发到 对应的cySysWdtCallback
:- /*******************************************************************************
- * Function Name: CySysWdtIsr
- ********************************************************************************
- *
- * Summary:
- * This is the handler of the WDT interrupt in CPU NVIC. The handler checks
- * which WDT triggered in the interrupt and calls the respective callback
- * functions configured by the user by using CySysWdtSetIsrCallback() API.
- *
- * The order of the callback execution is incremental. Callback-0 is
- * run as the first one and callback-2 is called as the last one.
- *
- * Parameters:
- * None.
- *
- * Return:
- * None.
- *
- * Side Effects:
- * This function clears the WDT interrupt every time when it is called.
- * Reset after the 3rd interrupt does not happen if this function is registered
- * as the interrupt handler even if the "Watchdog with Interrupt" mode is
- * selected on the "Low Frequency Clocks" tab.
- *
- *******************************************************************************/
- void CySysWdtIsr(void)
- {
- if(0u != (CY_SYS_WDT_COUNTER0_INT & CY_SYS_WDT_CONTROL_REG))
- {
- if(0u != (CY_SYS_WDT_COUNTER0_INT & wdtIsrMask))
- {
- wdtIsrMask &= ~(disableServicedIsr & CY_SYS_WDT_COUNTER0_INT);
- disableServicedIsr &= ~CY_SYS_WDT_COUNTER0_INT;
- if(cySysWdtCallback[CY_SYS_WDT_COUNTER0] != (void *) 0)
- {
- (void)(cySysWdtCallback[CY_SYS_WDT_COUNTER0])();
- }
- }
- CySysWdtClearInterrupt(CY_SYS_WDT_COUNTER0_INT);
- }
-
- if(0u != (CY_SYS_WDT_COUNTER1_INT & CY_SYS_WDT_CONTROL_REG))
- {
- if(0u != (CY_SYS_WDT_COUNTER1_INT & wdtIsrMask))
- {
- wdtIsrMask &= ~(disableServicedIsr & CY_SYS_WDT_COUNTER1_INT);
- disableServicedIsr &= ~CY_SYS_WDT_COUNTER1_INT;
- if(cySysWdtCallback[CY_SYS_WDT_COUNTER1] != (void *) 0)
- {
- (void)(cySysWdtCallback[CY_SYS_WDT_COUNTER1])();
- }
- }
- CySysWdtClearInterrupt(CY_SYS_WDT_COUNTER1_INT);
- }
-
- if(0u != (CY_SYS_WDT_COUNTER2_INT & CY_SYS_WDT_CONTROL_REG))
- {
- if(0u != (CY_SYS_WDT_COUNTER2_INT & wdtIsrMask))
- {
- if(cySysWdtCallback[CY_SYS_WDT_COUNTER2] != (void *) 0)
- {
- (void)(cySysWdtCallback[CY_SYS_WDT_COUNTER2])();
- }
- }
- CySysWdtClearInterrupt(CY_SYS_WDT_COUNTER2_INT);
- }
- }
-
- /*******************************************************************************
- 重入RTC中断
RTC 现在程序用的 RTC 1s 会产生中断 用的是WDT2:
它用到了下面的这个函数,重入了wdt中断函数的 wdt2 部分:
- 重入 systick中断
timer 是用来做 1ms的 systick的 用的是 wdt1:
- 映射看门狗中断