临时问题记录

临时问题记录

欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过设置里的修改模板来改变新建文章的内容。

RTC issue 调试过程(已解决)

  • 问题描述
    遥控器工程使用RTC,程序死机。
    RTC 时钟选择 wdt2
    注:

    1. RTC 时钟自己提供,即 RTC update 放到其他定时中断,不会有问题。
    2. demo工程没有问题。
  • 解决过程

    1. debug: 程序没有跑飞,但一直进Timer_CallBack函数。
    2. 在Timer_Callback里加IO口翻转,测出进入callback时间4us。疑似timer中断相关的标志没有清除。
      enter description here
      这里看到这种写法 和 wdt1 不相关的标志是不会清除的。
    3. 检查 wdt 中断设置
      开启RTC 选择WDT2后,在cyfitter_cfg.c会多如下函数:
      enter description here
      函数如下:
      enter description here
      显然这个是 wdt 的总中断函数 wdt0 wdt1 wdt2 都是公用这个函数的。
    4. 奇怪的问题来了:在debug中,我们通过断点运行, 在主程序使能了 RTC后,程序继续运行,使能 timer,然后程序就进了Timer_CallBack,之后一直进 Timer_CallBack,而整个过程一次都没有进CySysWdtIsr。
    5. 那我们就可以继续观察 我们使用的 timer(wdt1) 和 RTC(wdt2) 初始化有什么差别,很快就找到了问题:
      这是 RTC的回调函数设置
      enter description here
      这是timer的回调函数设置
      enter description here
      看到了吧,问题非常清楚,这个timer的书写者,没有用creator 标准的wdt方法书写,直接用 CyIntSetVector,来设置 Timer_CallBack。
      也就是说,这里把 wdt的总中断映射又改成了Timer_CallBack,所以就不会再进CySysWdtIsr,关键问题是,Timer_CallBack又没有清除 wdt1以外的两个标志,导致wdt2置位后一直没有被清除。
  • 解决方法:timer(WDT1)的回调函数设置方法 使用和 RTC(WDT2)一样的声明方式。
    enter description here

Cy 看门狗复位问题

  • 描述
    发现目前程序有死机现象,开了看门狗,却没有复位。

  • 目前看门狗使用的是这种模式 WDT0:
    enter description here
    查了下 PSoC_4_BLE_Architecture_TRM 现在的模式描述如下:
    enter description here

  • 问题
    所以问题就是上面这句话怎么解释,因为程序里 wdt中断 肯定是用了,下面可以看下目前程序对 wdt 中断的使用情况。

  • 问题补充
    我有用到 wdt1 用systick wdt2 做 RTC
    我又查了下我的中断部分,涉及到 wdt 中断的几个地方如下,有三个部分:

    1. 映射看门狗中断
      cyfitter_cfg.c 中 把看门狗中断做了一次映射。
      enter description here
      关于中断函数内容,这里可以看到,wdt0 wdt1 wdt2 的中断处理都在这里,通过标志位分发到 对应的 cySysWdtCallback
      1. /******************************************************************************* 
      2. * Function Name: CySysWdtIsr 
      3. ******************************************************************************** 
      4. * 
      5. * Summary: 
      6. * This is the handler of the WDT interrupt in CPU NVIC. The handler checks 
      7. * which WDT triggered in the interrupt and calls the respective callback 
      8. * functions configured by the user by using CySysWdtSetIsrCallback() API. 
      9. * 
      10. * The order of the callback execution is incremental. Callback-0 is 
      11. * run as the first one and callback-2 is called as the last one. 
      12. * 
      13. * Parameters: 
      14. * None. 
      15. * 
      16. * Return: 
      17. * None. 
      18. * 
      19. * Side Effects: 
      20. * This function clears the WDT interrupt every time when it is called. 
      21. * Reset after the 3rd interrupt does not happen if this function is registered 
      22. * as the interrupt handler even if the "Watchdog with Interrupt" mode is 
      23. * selected on the "Low Frequency Clocks" tab. 
      24. * 
      25. *******************************************************************************/ 
      26. void CySysWdtIsr(void) 

      27. if(0u != (CY_SYS_WDT_COUNTER0_INT & CY_SYS_WDT_CONTROL_REG)) 

      28. if(0u != (CY_SYS_WDT_COUNTER0_INT & wdtIsrMask)) 

      29. wdtIsrMask &= ~(disableServicedIsr & CY_SYS_WDT_COUNTER0_INT); 
      30. disableServicedIsr &= ~CY_SYS_WDT_COUNTER0_INT; 
      31. if(cySysWdtCallback[CY_SYS_WDT_COUNTER0] != (void *) 0

      32. (void)(cySysWdtCallback[CY_SYS_WDT_COUNTER0])(); 


      33. CySysWdtClearInterrupt(CY_SYS_WDT_COUNTER0_INT); 

      34.  
      35. if(0u != (CY_SYS_WDT_COUNTER1_INT & CY_SYS_WDT_CONTROL_REG)) 

      36. if(0u != (CY_SYS_WDT_COUNTER1_INT & wdtIsrMask)) 

      37. wdtIsrMask &= ~(disableServicedIsr & CY_SYS_WDT_COUNTER1_INT); 
      38. disableServicedIsr &= ~CY_SYS_WDT_COUNTER1_INT; 
      39. if(cySysWdtCallback[CY_SYS_WDT_COUNTER1] != (void *) 0

      40. (void)(cySysWdtCallback[CY_SYS_WDT_COUNTER1])(); 


      41. CySysWdtClearInterrupt(CY_SYS_WDT_COUNTER1_INT); 

      42.  
      43. if(0u != (CY_SYS_WDT_COUNTER2_INT & CY_SYS_WDT_CONTROL_REG)) 

      44. if(0u != (CY_SYS_WDT_COUNTER2_INT & wdtIsrMask)) 

      45. if(cySysWdtCallback[CY_SYS_WDT_COUNTER2] != (void *) 0

      46. (void)(cySysWdtCallback[CY_SYS_WDT_COUNTER2])(); 


      47. CySysWdtClearInterrupt(CY_SYS_WDT_COUNTER2_INT); 


      48.  
    2. 重入RTC中断
      RTC 现在程序用的 RTC 1s 会产生中断 用的是WDT2:
      enter description here
      它用到了下面的这个函数,重入了wdt中断函数的 wdt2 部分:
      enter description here
    3. 重入 systick中断
      timer 是用来做 1ms的 systick的 用的是 wdt1:
      enter description here
posted @ 2017-05-11 06:02  zozo825117  阅读(463)  评论(0编辑  收藏  举报