• 临时问题记录


    临时问题记录

    欢迎使用 小书匠(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
  • 相关阅读:
    浅析Java CompletionService
    经验总结13--EF配置
    消息摘要算法-HMAC算法
    03012_预处理对象executeQuery方法(实现数据库的查询)
    GO学习笔记:函数defer
    GO学习笔记:函数传值与传指针
    GO学习笔记:函数作为值、类型
    GO学习笔记:函数Panic和Recover
    GO学习笔记:import
    GO学习笔记:struct类型
  • 原文地址:https://www.cnblogs.com/zozo825117/p/6839092.html
Copyright © 2020-2023  润新知