This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2652P:RTC 在 BLE 堆栈升级后导致问题

Guru**** 2693225 points

Other Parts Discussed in Thread: CC2652P, BLE-STACK

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1594096/cc2652p-rtc-causes-issue-after-ble-stack-upgrade

器件型号: CC2652P
Thread 中讨论的其他器件: BLE-STACK

尊敬的 TI-Team、

我们进行了以下设置:

  • 通过基于 simple_peripheral、BLE SimpleLink SDK 版本 5.10 的应用运行 CC2652P 的 BLE 节点
  • 所谓的“继电器“、由 LAUNCHXL-CC1352P-4 开发板组成、该开发板运行基于 simple_central、BLE SimpleLink SDK 版本 4.10 的应用
  • 我们实现了一种时间同步机制、该机制使用 RTC 通道 1 和 2 为添加时间戳  
    RFC_GPO3 信号、我们通过引脚路由该信号。 该信号指示对讲机何时发射。
     
    现在我尝试将中继固件更新到 SDK 版本 8.31。 遗憾的是、时间同步机制不再起作用。 当我运行它, CPU 似乎有点卡滞:不在错误旋转处理程序,但它似乎不断地得到中断。 每当我停止它时、它主要位于 Hwi_asm_gcc.s 文件或其他一些与 Hwi 相关的系统文件中。 此外、即使时间已过去、我们设置的超时时时钟也不会被调用。
    作为一个测试,我注释掉了所有的 AONRTC-功能,现在超时确实达到了。
     
    这导致我怀疑、旧 SDK (4.10) 仅使用 RTC 通道 0、我们可以使用通道 1 和 2。 但是、我们使用 RTC 通道 1 和 2 时似乎会干扰新的 SDK (8.31)。
     
    您能否确认 SDK 使用 RTC 的方式有变化? 是否仍有办法将 RTC 模块的某些器件与 BLE-Stack 一起用于精确的时间戳处理? 如果是、在理想情况下不涉及中断和代码执行延迟的情况下、我们应该如何实现精确的时间戳处理?
     
    此致、
    Raphael Fischer
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    从 4.10 迁移到 8.31 是一个重要的迁移、因为您将在一次升级中应用 5 年的更改。 我们的用户指南提供了 迁移指南 来帮助您进行这些升级、并通过 simple_central 等常见示例展示了这些年来发生的重大变化。 这些将是升级 SDK 的良好起点、我建议您逐个遵循每年的迁移指南、以便您可以尝试确定 SDK 的哪个版本会给您带来问题。

    为了直接帮助您解决 RTC 问题、您是否可以通过任何方式共享用于创建和使用时钟的代码片段? 如果您直接使用寄存器、则可以尝试直接使用我们 的时钟 API

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Lea!

    我们完全知道我们正在对 SDK 进行一个非常大的提升、跳过许多中间版本。 我已经看到了非常有用的迁移指南、并尽可能地应用了所有相关的更改。 但是、尝试每个中间 SDK 版本对我们来说都是费劲的。

    根据 simple_central 示例、我将我们的问题简化为一个极小的示例。差异如下:

    SYSCFG:

    • BLE 默认 Tx 功率值= 20
    • BLE 无线电配置> TX 功率 (dBm)= 20
    • BLE 最大 PDU 数量= 6
    • BLE PDU 最大大小(字节)= 255
    • BLE 绑定管理器:
      • MITM 保护=禁用
      • IO 功能=无显示或输入设备
      • LRU 绑定替换=真
    • BLE Advanced Settings > Extended Stack Settings = Guard Time
    • BLE 中央配置:
      • 连接间隔最小值= 7.5ms
      • 连接间隔最大值= 4000ms
    • BLE 观测器配置:
      • 已禁用重复 筛选条件 =
      • 广告报告的最大数量= 0
    • GPIO:添加了 TIME_SYNC_INPUT_PIN:
      • MODE =输入
      • 上拉=上拉
      • 中断触发器=下降沿
      • PinMux > GPIO 引脚= DIO27
    • 看门狗:添加了 CONFIG_WATCHDOG_0(周期= 1000)

    我们配置了应用、使其自动连接到外围器件。 通过 UART、我们可以向 simple_central 设备发送命令、并 在外设和中央设备连接后触发函数 Timesync_failureDemo ():

    #define TIME_SYNC_TIMEOUT_DURATION 5000 //以毫秒为单位
    #define OUTPUT_PIN IOID_22

    void Timesync_timeoutCb (void){
     //我在这里放置一个断点
     timeSyncFSM = SYNC_TIMEOUT;
    }

    void Timesync_failureDemo(){
     Util_startClock (&timeSyncTimeoutClock);

     //如果在函数结束前注释掉以下行、
     // Timesync_timeoutCb 将在 5s 后调用。 如果启用这些线路
     //不会被调用,并且在停止应用程序时,它总是在一些 Hwi 中
     //文件
     AONEventRtcSet (AON_EVENT_RTCSEL_RTC_CH1_CAPT_EV_IOEV_RTC);
     AONRTCModeCh1Set (AON_RTC_MODE_CH1_CAPTURE);
     AONRTCeventClear (AON_RTC_CH1);


     // IOID_22(输出引脚)和 IOID_27(输入引脚)进行电气连接
     IOCPortConfigureSet (OUTPUT_PIN、IOC_PORT_RFC_GPO3、
               IOC_IOMODE_NORMAL | IOC_NO_IOPULL);
     IOCIOEvtSet (TIME_SYNC_INPUT_PIN、IOC_EVT_RTC_ENABLE);

     AONRTCChannelEnable (AON_RTC_CH1);
    }

    //在 main() 函数中调用
    void Timesync_createTask(){
     util_constructClock (&timeSyncTimeoutClock、(timeptr) Clock_Func ync_timeoutCb、
               TIME_SYNC_TIMEOUT_DURATION、0、FALSE、0);
    }

    (抱歉,代码插入功能对我不起作用)

    非常感谢您的帮助!

    此致、
    Raphael Fischer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我不完全了解您在  Timesync_failureDemo 函数中正在执行或尝试执行的操作。 我不建议直接使用 RTC 使用 AON 函数、如果您能准确描述自己想要实现的目标、我可以尝试帮助您使用现代 API 来实现这一点。

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lea:

    我们正在尝试非常精确地在无线电模块开始传输时捕获 RTC 时间。 我们通过 RTC 模块这样做、以避免中断延迟。 我们通过两个 GPIO 来测量此值:我们将 IOID_22 配置为指示无线电何时传输的输出(IOC_PORT_RFC_GPO3 功能) 。 IOID_27 连接到它、并使用 RTC 捕获功能来执行时间戳处理。

    此致、

    Raphael Fischer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的解释、我现在更好地了解您正在尝试做什么。 我想您可以使用 ClockP API 来实现这一目的。 特别是、我认为 ClockP_getSystemTicks64 函数应该能满足您的需求。 您能尝试一下这个功能、看看它是否符合您的需求吗?

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们应该如何使用 ClockP_getSystemTicks64 函数来测量 GPIO 引脚变化的时间、而不会出现任何中断延迟?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我会做一些接近这一点,以适应你的代码:

    #define TIME_SYNC_TIMEOUT_DURATION 5000  // in milliseconds
    #define OUTPUT_PIN IOID_22
    
    void timeSync_timeoutCb(void) {
      // I put a breakpoint here
      timeSyncFSM = SYNC_TIMEOUT;
    }
    
    void timeSync_failureDemo() {
      Util_startClock(&timeSyncTimeoutClock);
    
      uint64_t timestamp = ClockP_getSystemTicks64();
    
    
      // IOID_22 (output pin) and IOID_27 (input pin) are electrically connected
      IOCPortConfigureSet(OUTPUT_PIN, IOC_PORT_RFC_GPO3,
                          IOC_IOMODE_NORMAL | IOC_NO_IOPULL);
      IOCIOEvtSet(TIME_SYNC_INPUT_PIN, IOC_EVT_RTC_ENABLE);
      
      // Do something with your timestamp and radio value here
      // log it, save it, send it through a pin, ...
    }
    
    // Called in the main() function
    void timeSync_createTask() {
      Util_constructClock(&timeSyncTimeoutClock, (Clock_FuncPtr)timeSync_timeoutCb,
                          TIME_SYNC_TIMEOUT_DURATION, 0, false, 0);
    }

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、但这只是给出 GPIO 初始化的时间戳、而不是实际的引脚更改、不是吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我没有看到您希望没有中断延迟。 我尝试通过复制您的代码和设置来重现问题、但我的计时器触发正确。 但是、RTC 捕获没有正确进行。 我认为最好的选择是使用中断、并受到一点延迟的影响。

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在过去的两周中、我们通过高优先级 GPIO 中断实现了完整的功能、该中断运行正常。 在研究外设应用时、我发现这篇文章准确描述了我们需要的内容:  CC1312R:如何将 RTC 通道 1 和 2 与 TI-RTOS7 结合使用? 

    在外设应用上、它现在可以正常工作。 也许我们将再次重写中央应用、以便同时利用 RTC 捕获功能。