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.

[参考译文] RTOS/CC2640:计时器莫名停止

Guru**** 2589245 points
Other Parts Discussed in Thread: CC2640, SYSBIOS, CC2650, CC1350

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/585363/rtos-cc2640-timer-mysteriously-stopped

器件型号:CC2640
Thread 中讨论的其他器件: SYSBIOSCC2650CC1350

工具/软件:TI-RTOS

我们在 CC2640上有一个运行 TI-RTOS 的 BLE 应用。 它运行良好、只是在某些情况下会冻结、唯一的方法是通过取出电池进行循环供电。

我想我已经把问题缩小到 RTC 计时器莫名停止。 下面是我能够收集的信息、主要是从 CCS 寄存器和 POV 视图中收集的信息:


-我有两种“好”和“坏”模式。 在良好模式下、所有器件都运行良好、但 在某些情况 下 CC2640会进入不良模式并冻结。
-在错误模式下、CCS 调试器显示时钟模块中的 tick 字段被卡住、在暂停和恢复调试器后不会移动。 在良好模式下、当我暂停/恢复调试器时、节拍域会正常上升。
-在良好模式下、我始终会看到 ISRPEND1和 VECTPEND010000 (16)
-在不良模式下、我始终会看到 ISRPEND1和 VECTPENDING 000000 (0)
-调试器还显示 tickSource = ti.sysbios.kl.Clock.TickSource_timer
-我很确定我们在中断20处使用 AON_RTC (常开定时器)
-我认为我不使用内置 SysTick 计时器、因为 STCSR 中的 ENABLE 位设置为0、并且 STRVR 和 STCVR 也设置为0。
-在良好模式下、Hwi 显示所有中断都已启用、其中一个中断正暂挂16
-在错误模式中、Hwi 显示所有中断被启用、无挂起
-在坏模式下,我们始终会看到1个或2个 IRP 指向 ROM
在良好模式下,我们很少看到 IRP 指向 ROM
- Hwi 显示所有中断都以相同的优先级255运行
-在正常和模式下、中断20处的定时器在定时器模块中显示为禁用
-我们使用地址0x400092000处的 AON_RTC (始终运行的定时器)
-在良好模式下,定时器模块显示了“前推阈值”字段,但该字段没有变化
-在错误模式下,定时器模块显示前推阈值字段被卡住


问题:
1) 1)为什么计时器模块在良好和不良模式下都显示"禁用"状态? 是因为调试器停止时钟?
2) 2)什么会导致计时器卡住?
3) 3)我们是否有可能获得过多的堆栈式中断、并且我们正在中断堆栈或从 ISR 中获取错误的返回?

非常感谢您的帮助!

P.S.这是我 在 BLE 论坛上发布的一个问题的 DUP、但我认为最好在这里讨论。 我将关闭另一个帖子、抱歉交叉发布。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 1)定时器模块的 ROV 视图损坏并误导。 几个月前就出现了一个有关此问题的错误、下一版 TI-RTOS 中将包含对此问题的修复。
    2) 2)我不知道 RTC 应该停止的原因。 除了将 RTC 用作时钟和秒模块的时基之外、您的应用程序是否在内部使用 RTC 的某些其他功能?
    3) 3) Hwi 模块旨在避免与始终挂起中断相关联的堆栈问题。 在发生故障的情况下、您可以查看任务详细 ROV 视图和 Hwi 模块 ROV 视图、以确定任何任务堆栈或中断堆栈是否溢出。

    我认为 BLE 用户可能必须对此进行跟踪。 RTC 停止可能是它们所意识到的硬件动态混合的结果。

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

    刚刚查看了 Hwi 模块 ROV 并看到三个 hwiStack*字段都是红色的、没有内容。 好的和失败的情况都是如此。 这是否暗示某件事是不对的?

    谢谢、Hector
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。 如果将鼠标悬停在红色字段上、则会显示一条消息、如"Overfify"(溢出!) 应显示。
    您应该增加 Hwi 堆栈大小。 Hwi 堆栈继承自 C main()堆栈。
    如果使用 TI/CCS 编译器工具、则使用.cfg 文件中的"Program.stack"设置来设置主堆栈大小。
    如果使用 IAR 工具、则会在.ICF 文件中设置主堆栈大小。

    Alan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我之前已将程序栈的大小加倍、但没有效果。 我将再次尝试提高它

    当我将鼠标悬停在 hwiStack*上时,我会看到“获取 Hwi 堆栈信息时出错!” 而不是溢出消息。 我看到这是成功运行还是失败后运行。 什么可能导致无法获取堆栈信息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯。 报告的错误表示内存损坏。 应用程序中的某些内容似乎在 Hwi 模块的内部状态结构上划线。

    如果您打开一个内存视图并键入"&ti_sysbios_family_arm_m3/Hwi_Module_state__V_V"、您应该会看到如下所示的内容:

    0x2000011C00000000200022E8
    0x200001300000000020000134200001342000013C2000013C
    0x20000144ti_SysBIOS_family_ARM_m3/Hwi_Module_state__V
    0x200001440000000020002272200022E0200022E420004FF8
    0x2000015820004C0000000400200000000000010120001C80
    0x2000016C000000000000000000000000

    请注意、值0x20004c00是 Hwi 堆栈的基地址、值0x00000400是 Hwi 堆栈的大小(1024字节)。

    在内存视图中、有意义的值应该位于 Hwi 模块状态中的相应位置。 如果不是、则应用程序中会出现严重错误。

    在对 Hwi 堆栈基址的写入上放置一个硬件观察点可能有助于揭示出罪魁祸首是谁。 请记住、在启动时、C 初始化代码将写入此地址一次、因此观察点将始终触发一次。 但绝不应再次写入。

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

    这是您建议的转储、对我来说似乎是可以的。 你看到了什么鱼吗?

    TI_SYSBIOS_family_ARM_m3/Hwi_Module_state___V
    0x000000000x20000CB20x20000D7C0x20000D800x20004360
    0x20003F680x000004000x200000000x000001010x20002BDC
    0x000000000x000000000x00000000
    TI_SYSBIOS_KNL_Clock_Module_state__V
    0x0035F21A0x000000000x200009600x20000A100x00000007
    0x0035F2210xC11F404E0x000000000x000000010x20000AD8
    0x20001E60
    TI_SYSBIOS_BIOS_Module_state___V
    0x000000000x02DC6C000x000000000x000000000x200009C4
    0x000000020x000000000x0000D5690x0000E249
    TI_SYSBIOS_KNL_Swi_Module_State__V
    0x000000000x000000000x000000000x00000000 0x000000000x00000000
    0x200009E00x00000000
    TI_SYSBIOS_family_ARM_cc26xx_Timer_Module_state___V
    0x000000000x20000960
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我没有看到模块状态结构的内容有什么问题。 不确定为什么会收到该错误报告。 ROV 在内部抱怨无法读取 Hwi 堆栈内存。 当您执行此内存转储时、Hwi 模块视图是否报告了错误?

    是否可以转储从地址0x20003f68开始的存储器? 这是 Hwi 堆栈的基地址。

    "任务详细信息"视图是否正确显示了任务堆栈深度?

    Alan

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

    是的、当我读取内存时、Hwi 模块视图报告了 hwiStack*字段上的"错误获取"。 这是堆栈转储。 刚刚注意到我的堆栈基地址与您的堆栈基地址没有完全对齐、我的起始地址为0x20003F68、您的起始地址为0x20004C00。 这可能是个问题吗?

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

    抱歉、这里是堆栈转储。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您询问了详细的堆栈视图,该视图正确显示了所有 stack*字段。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是一个外观精美的堆栈。 只需8字节对齐即可。 "bebebebebebe"模式在启动时编写、以帮助我们确定堆栈的深度。 您有大量未使用的堆栈空间。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    应用程序是否可能已禁用中断并且从未重新启用中断? 在错误情况下、使用 CCS 内核寄存器视图转储 CTRL_FAULT_BASE_PRI 寄存器的内容:

    CTRL_FAULT_BASE_PRI0x00000000cm3特殊寄存器[内核]

    它应该全部为零。 如果 BASEPRI 或 PRIMASK 域不为零、那么中断将被禁用。 如果是这种情况,您需要分析代码,以找出在没有匹配的 Hwi_restore()调用的情况下调用 Hwi_disable()的位置。

    Alan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想我以前可能已经找到了、但没有遇到问题。 冻结前后、我都看到:

    CTRL_FAULT_BASE_PRI0x02000000cm3特殊寄存器[内核]
    控制00000010控制
    FAULTMASK00000000Faultmask
    BASEPRI00000000基底
    PRIMASK00000000掩码

    我认为控制器件中的1位是可以的、还是应该为0?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我错误地说它全为零。 10的控制值是可以的。 其他字段很好。 中断被启用。
    今天我几乎没有想法。 您可能应该向 BLE 团队寻求帮助、因为他们应该知道在什么条件下 RTC 会停止。
    您可能需要在内存写入 RTC 控制寄存器时放置一个硬件观察点、以查看是否正被恶意线程写入。
    我必须深入探究以弄清哪个寄存器位启用计数器。 也许您已经知道...

    Alan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Alan! 如果你在科罗拉多,我应该来这里吃午餐
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alan:

    我们认为我们发现了问题。 以下是我的共同开发人员 Dave Beal 的描述:

    我想我已经修复了错误。  问题出现在 TI-RTOS 文件 ti_tirtos_cc13xx_cc26xx_2_18_00_03\products\BIOS_6_45_02_31\packages/ti\SysBIOS\family\arm\ccc26xx\Timer.c 的 Timer_setThreshold ()函数中。  这是将超时值写入 RTC 以实现 Task_sleep()函数的代码。  这里有代码可处理要求设置超时时间的情况、即在过去或未来小于每秒4/65536;如果是、它会编程一个未来为4/65536秒的值。  但是、硬件手册指出、实际写入寄存器可能需要两个32KHz 时钟周期、因此小于4/65536秒的裕度是不够的。  我添加了全局变量以保存最近的超时值和当前时间值、当问题发生时、请求的超时在将来始终小于4/65536秒。  我将页边距更改为6/65536秒、远程设备已运行一个多小时。  以前、它会在几分钟内持续失败。  不过、我还是有点困惑、因为硬件手册说、即使之前设置的超时值长达一秒、硬件也会生成中断; 我不明白为什么这不能阻止问题的发生、但可能是 RTOS 作者没有选择依赖这种情况的原因。

    自从我们实施变革以来,他和我都没有看到冻结。 你有什么想法? 这是否是冻结的根本原因?

    谢谢、Hector

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该代码经过仔细检查、以处理您遇到的情况。 您能否向我们提供您在上面看到问题清单的确切 CC2640器件型号? 我是说芯片背面打印的信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我的芯片背面的东西:
    CC2640
    F128
    TI 5CI
    AL06 G4
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alan!  我是与 Hector 合作的人。  我的芯片具有与他完全相同的标记。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢! 我们已要求芯片设计团队来看看。 这个主题有很多历史。

    Alan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、Alan。 感谢您深入探讨这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们希望您使用"SmartRF Flash Programmer 2"应用程序来帮助我们识别器件上的芯片版本。

    如果您尚未安装该工具、可在此处获取该工具:

      http://www.ti.com/tool/flash-programr

    我们需要的信息显示在下面的"阅读"框中:

     

    Alan

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

    Hector、Dave、

    您能否澄清一下您是否看到 RTC 计数器停止、或者您是否看到 RTC 继续计数、但软件错过了超时事件?

    查看这一点的快速方法是打开 CCS 寄存器视图(View->Registers),展开“AON_RTC”寄存器集,并查看 SEC 和亚秒寄存器。   例如:



    对于应用程序停止的情况(在增加 Compar_Margin 之前)、您是否看到这些寄存器继续更新、即使应用程序已停止?  

    谢谢、
    Scott

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

    这是我从闪存编程器2获得的信息。 我将检查这些 RTC 寄存器。

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

    我检查了 SEC 和亚秒寄存器、即使我们被挂起、它们也会继续更新。

    此外、我想我之前提到过、当我们被停止时、ROV 中时钟模块中的节拍域会保持冻结。

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

    您好、Scott。  在将 COMPARE_MARGIN 从4增加到6之前、当我们的应用程序停止运行时、我们看到 RTC 的 SEC 和亚秒寄存器仍在递增、但 CH0CMP 过去是 w.r.t (小于) SEC.subsec、并且不会改变。  现在我们已将 Compar_MARGIN 增加到6、我们的应用不再停顿、我们看到所有三个寄存器都在变化、CH0CMP 在未来始终为 w.r.t SEC.subsec。

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

    Hector、Dave、您好

    感谢您的澄清。  这些症状指向 CPU 未收到 RTC 超时事件。

    我有几个问题:

    您是在定制板上运行还是在 TI 开发板上运行?  您将什么用于低频(LF)时钟源?

    您是否可以在程序中直接对 RTC 进行编程?

    您是否修改了 ccfg.c 文件中的默认配置设置?  如果是、您可以附加该文件吗?

    此外、您是否移动了此配置结构的默认位置?

    您是否可能更改了应用程序配置(.cfg)文件中的 Hwi.disablePriority 设置?  或者以某种方式更改了中断优先级设置、以便中断触发的优先级高于 Hwi.disablePriority 设置?

    是否可以将应用程序.cfg 文件发布到此线程中?

    如果您不想将这些文件发布到论坛,您可以向我发送朋友请求,然后您可以直接将这些文件发送给我,以便我们可以查看这些文件…

    谢谢、
    Scott

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

    您好、Scott -

    它是定制板。  对于32KHz 时钟、我们将使用外部晶体。  原理图显示"32.768kHz +/- 100ppm"。  我们没有在代码中明确使用 RTC。  我们使用几个 GPIO 作为中断源、但我认为我们没有对默认中断优先级进行任何更改。  下面粘贴的 cfg 文件。  更改(可能)用我的首字母(DDB)进行标记。

    - Dave

    /*********
     @文件 cc2640.cfg
     @CC26xx 的 TI RTOS 配置文件简介
        导入的符号
        注意:这些符号是在--cfgArgs 选项之后定义的。
        在 IAR 中、这是在预编译步骤的末尾完成的。  在 CCS 中、这是
        在 Properties->Build->XDCtools-Advanced options->Configuration 中完成
        脚本参数。  可以使用多个符号将它们分隔为
        逗号("、")。
        默认情况下、TI RTOS 在 ROM 中以 RTOS 构建、中断向量启动
        地址0x0处、并且仅使用 ROM 内核模块。
        NO_ROM:  当设置为非零值时、RTOS 会在闪存中生成
              ROM
        OAD_IMG_A: 设置为非零值时、中断向量设置为
              其片上 OAD 映像 A 的预期位置
        OAD_IMG_B: 设置为非零值时、中断向量设置为
              其片上 OAD 映像 B 的预期位置
        OAD_IMG_E: 设置为非零值时、中断向量设置为
              外部闪存 OAD 的预期位置。
        USE_Events:生成 RTOS 内核事件模块。
     组:WCS、BTS
     目标器件:CC2650、CC2640、CC1350
     秘书长的报告
     
     版权所有(c) 2013-2016、德州仪器(TI)公司
     保留所有权利。
     以源代码和二进制形式重新分发和使用、有无
     允许进行修改、前提是满足以下条件
     符合:
     * 源代码的重新分发必须保留上述版权
      声明、此条件列表和以下免责声明。
     * 二进制形式的再发行必须复制上述版权
      注意、本条件列表和中的以下免责声明
      分发时提供的文档和/或其他材料。
     * 德州仪器公司的名称和名称均不相同
      其贡献者可用于认可或推广衍生产品
      未经特定的事先书面许可。
     本软件由版权所有者和贡献者"按原样"提供
     以及任何明示或暗示的保证、包括但不限于
     对特定适销性和适用性的隐含保证
     不承认目的。 在任何情况下、版权所有者不得或
     任何直接、间接、偶然、特殊、
     惩罚性或后果性损害(包括但不限于
     采购替代货物或服务;丧失使用、数据或利润;
     或业务中断)、无论原因是什么以及任何责任理论、
     无论是合同、严格责任还是侵权行为(包括疏忽或)
     否则)因使用本软件而以任何方式产生、
     即使被告知可能会发生此类损坏。
     秘书长的报告
     版本名称:BLE_SDK_2_02_00_31
     发布日期:2016年6月16日18:57:29
     (小部分 /
    /*========================= ROM 配置======================== *
    /*
     *要在闪存中使用 BIOS,请注释掉下面的代码块。
     *
    /* DDB、10/22/16 *
    if (typeof no_rom =='undefined'||(typeof no_rom!='undefined'&& no_ROM = 0))
     VAR ROM = xdc.useModule('ti.sysbios.rom.ROM');
     if (Program.cpu.deviceName.match(/CC26/)){
       rom.romName = ROM.CC2650;
     }
     否则(Program.cpu.deviceName.match(/CC13/)){
       rom.romName = ROM.CC1350;
     }
    /**//
    /*========================= 引导配置=================== *
    if (typeof no_rom =='undefined'||(typeof no_rom!='undefined'&& no_ROM = 0))
     VAR Boot = xdc.useModule('ti.sysbios.family.arm.cc26xx.Boot');
    /*
     *此模块包含特定于系列的引导 API 和配置设置。
     *有关更多信息、请参阅 SYS/BIOS API 指南。
     *
    if (typeof no_rom =='undefined'||(typeof no_rom!='undefined'&& no_ROM = 0))
     boot.driverlibVersion = 2;
     boot.customerConfig = false;
    /*========================= 时钟配置======================== *
    VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
    /*
     *当使用 Power 和 calibrateRCOSC 设置为 true 时、应将其设置为10。
     *时钟模块使用的计时器支持 TickMode_dynamic。 这使我们能够做到
     *将节拍周期设置为10us、而不产生额外的开销
     *中断。
     *
     *注意:calibrateRCOSC 参数在电源配置中设置
     *  "Board.c"文件中的结构。
     *
    clock.tickPeriod = 10;
    Clock.swiPriority = 5;
    /*========================= 类型配置=================== *
    VAR 类型= xdc.useModule('xdc.runtime.Types');
    /*
     *此模块定义了在中使用的基本常量和类型
     * xdc.runtime 软件包。
     *
    /*========================= 默认值(模块)配置=================== *
    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    /*
     *允许在目标上加载模块名称的标志。 模块名称
     出于调试目的、*字符串放置在.const 段中。
     *
     *选择一项:
     * - true (默认值)
     *   将此参数设置为 true 将在.const 中包含名称字符串
     *   部分、以便更轻松地调试错误和断言。
     *- 错
     *   将此参数设置为 false 将减小.const 中的占用空间
     *   部分。 因此、错误和断言消息将包含
     *   "未知模块"前缀、而不是实际的模块名称。
     *
     * 在 ROM 中使用 BIOS 时:
     *   此选项必须设置为 false。
     *
    // Defaults.common$.namedModule = true;
    Defaults.common$.namedModule = false;
    /*编译所有断言的*/
    //Defaults.common$.diags_ASSERT = Diags.always_off;
    /*允许 Mod_create()和 Mod_construct(),但不允许删除()或析构()*/
    Defaults.common$.memoryPolicy = types.create_policy;
    /*========================= 错误配置=================== *
    VAR 错误= xdc.useModule('xdc.runtime.Error');
    /*
     *调用此函数是为了处理所有产生的错误,但与不同
     * Error.raiseHook、此函数负责完全处理
     带有适当初始化的 Error_Block 的*错误。
     *
     *选择一项:
     * - Error.policyDefault (默认值)
     *   使用已初始化的 Error_Block 结构和日志调用 Error.raiseHook
     *   使用模块的记录器时出错。
     * - Error.PolicySpin
     *   在 while (1)循环中捕获以最小化目标的简单替代方案
        *占用空间。
     *   使用 Error.PolicySpin 时,将不会调用 Error.raiseHook。
     *
    // DDB,10/24/16
    error.policyFxn =错误。policyDefault;
    // Error.PolicyFxn = Error.PolicySpin;
    /*
     *如果 Error.policyFxn 设置为 Error.policyDefault,则调用此函数
     *每当错误模块引起错误时。
     *
     *选择一项:
     * - Error.print (默认值)
     *   为方便,错误通过 System_printf()进行格式化和输出
     *   调试。
     *- 空
     *   错误由 while (1)存根函数捕获。 该选项会减小
     *   代码占用量。
     * -非空函数
     *   错误调用自定义用户函数。 请参阅错误模块文档
     *   以了解更多详细信息。
     *
    error.raiseHook =错误。打印;
    // DDB,11/7/16
    // Error.raiseHook =空;
    // Error.raiseHook ="&smallErrorHook";
    /*
     *如果 Error.policyFxn 设置为 Error.policyDefault,则此选项适用于
     * Error.raiseHook 函数可递归的最大次数
     *已调用。 此选项限制无限递归的可能性
     *可能导致堆栈溢出。
     *默认值为16。
     *
    error.maxDepth = 2;
    /*========================= Hwi 配置=================== *
    var halHwi = xdc.useModule('ti.sysbios.hal.Hwi');
    var m3Hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
    /*
     *在空闲循环中检查 Hwi (系统)堆栈溢出。
     *
     *选择一项:
     * - true (默认值)
     *   检查系统堆栈在空闲循环期间溢出的顶字和
     *   如果检测到一个错误,则会发出一个错误。
     *- 错
     *   禁用运行时检查可提高运行时性能并得到
     *   减小了闪存尺寸。
     *
    // DDB,10/24/16
    halHwi.checkStackFlag = true;
    // halHwi.checkStackFlag = false;
    /*
     *以下选项会在发生硬件异常时改变系统的行为
     检测到*。
     *
     *选择一项:
     * - Hwi.enableException = true
     *   此选项会使默认的 m3Hwi.excHandlerFunc 函数完全启用
     *   解码异常并将寄存器转储到系统控制台。
     *   此选项会在错误模块中引发错误并显示
     *   ROV 中出现异常。
     * - Hwi.enableException = false
     *   此选项通过不解码或打印来减少代码占用空间
     *   系统控制台异常。
     但是   、它仍会在错误模块中引发错误并显示
     *   ROV 中出现异常。
     * - Hwi.exHandlerFunc =空
     *   这是节省代码空间的最积极的选择;但它是最有效的选择
     *   很难调试异常。 它将闪存占用空间减小了
     *   发生异常时插入默认 while (1)陷阱。 此选项
     *   不会引起错误模块的错误。
     *
    // m3Hwi.enableException = true;
    m3Hwi.enableException = false;
    // DDB,10/24/16
    m3Hwi.exeHookFunc ="&excHandlerHook";
    // m3Hwi.exHandlerFunc =空;
    /*
     *在除以0时启用硬件异常生成。
     *
     *选择一项:
     * - 0 (默认值)
     *   在除以0时禁用硬件异常
     * - 1.
     *   除以0时启用硬件异常
     *
    m3Hwi.nvicCCR.DIV_0_TRP = 0;
    //m3Hwi.nvicCCR.DIV_0_TRP = 1;
    /*
     *为无效数据对齐启用硬件异常生成。
     *
     *选择一项:
     * - 0 (默认值)
     *   禁用数据对齐的硬件异常
     * - 1.
     *   为数据对齐启用硬件异常
     *
    m3Hwi.nvicCCR.UNALIGN_TRP = 0;
    //m3Hwi.nvicCCR.UNALIGN_TRP = 1;
    /*将复位矢量置于闪存的开头*/
    if (类型 OAD_IMG_A!='未定义'&& OAD_IMG_A = 1)
     m3Hwi.resetVectorAddress = 0x0610;
    否则(类型 OAD_IMG_B!='未定义'&& OAD_IMG_B = 1)
     m3Hwi.resetVectorAddress = 0x6010;
    否则(类型 OAD_IMG_E!='未定义'&& OAD_IMG_E = 1)
     m3Hwi.resetVectorAddress = 0x1010;
    其他
     m3Hwi.resetVectorAddress = 0x0;
    /*将中断矢量置于 RAM 的开头、以便在运行时配置中断*/
    m3Hwi.vectorTableAddress = 0x20000000;
    /* CC2650具有50个中断*/
    m3Hwi.NUM_INTERRUPTS = 50;
    /*========================= 空闲配置========================= *
    VAR 空闲= xdc.useModule('ti.sysbios.knl.Idle');
    /*
     *空闲模块用于指定在无时要调用的函数列表
     *系统中正在运行其他任务。
     *
     *此处添加的函数将在空闲任务内连续运行。
     *
     *函数签名:
     *  void func (void);
     *
    // Idle.addFunc (&MyIdleFunction);
    /*========================= 内核(SYS/BIOS)配置=================== *
    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    /*
     *在 BIOS 库中启用断言。
     *
     *选择一项:
     * - true (默认值)
     *   启用断言以进行调试。
     *- 错
     *   禁用断言以减小代码占用空间并提高性能。
     *
     * 在 ROM 中使用 BIOS 时:
     *   此选项必须设置为 false。
     *
    // DDB,10/22/16 -启用此选项会导致超出内存限制
    // BIOS.sertsEnabled = true;
    BIOS.sertsEnabled = false;
    /*
     *为 BIOS 指定默认堆大小。
     *
    if (typeof no_rom =='undefined'||(typeof no_rom!='undefined'&& no_ROM = 0))
     BIOS.heapSize = 1668;
    /*
     *用于确定 xdc.runtime 源是否包含在自定义中的标志
     *构建的 BIOS 库。
     *
     *选择一项:
     * - false (默认值)
     *   预构建的 xdc.runtime 库由相应的目标提供
     *   用于构建应用程序。
     * -正确
     *   xdc.runtime 库源代码将包含在自定义 BIOS 中
     *   库。 此选项在两个代码中生成最高效的库
        *占用空间和运行时性能。
     *
    //BIOS.includeXdcRuntime = false;
    BIOS.includeXdcRuntime = true;
    /*
     * SYS/BIOS 运行时以链接的库的形式提供
     *与应用程序一起使用。 随提供了该库的几种形式
     * SYS/BIOS 产品。
     *
     *选择一项:
     * - BIOS.LibType_Custom
     *   针对代码大小和进行了高度优化的定制构建库
        *运行时性能。
     * - BIOS.LibType_Debug
     *   可用于的非优化自定义构建库
     *   使用调试器单步执行 API。
     *
     *
    BIOS.libType = BIOS.LibType_Custom;
    //BIOS.libType = BIOS.LibType_Debug;
    /*
     *运行时实例创建使能标志。
     *
     *选择一项:
     * - true (默认值)
     *   允许在运行时调用 Mod_create()和 Mod_delete ()
     *   需要一个默认堆用于动态内存分配。
     *- 错
     *   通过禁止 Modo_create()和 Mod_delete ()来减少代码占用空间
     *   在运行时调用。 对象实例是通过构建的
     *   Mod_construct()并通过 Mod_析 构函数()析构。
     *
     * 在 ROM 中使用 BIOS 时:
     *   此选项必须设置为 true。
     *
    BIOS.runtimeCreatesEnabled = true;
    //BIOS.runtimeCreatesEnabled = false;
    /*
     *在 BIOS 库中启用日志。
     *
     *选择一项:
     * - true (默认值)
     *   启用日志以进行调试。
     *- 错
     *   禁用日志记录以减少代码占用空间并改善运行时间
     性能。    
     *
     * 在 ROM 中使用 BIOS 时:
     *   此选项必须设置为 false。
     *
    // DDB,10/22/16 -启用此选项会导致超出内存限制
    // BIOS.logsEnabled = true;
    BIOS.logsEnabled = false;
    BIOS.swiEnabled = true;
    /*========================= 内存配置=================== *
    VAR 内存= xdc.useModule('xdc.runtime.Memory');
    /*
     *内存模块本身只为任何一个提供一个通用接口
     *各种系统和应用特定的内存管理策略
     *由 IHeap 模块实现(例如、 HeapMem、HeapBuf)。
     *
    /*创建一个小的"只分配"堆*/
    if (typeof no_rom!='undefined'&& no_rom!= 0)
     VAR HeapMin = xdc.useModule('xdc.runtime.HeapMin');
     var heapMinParams = new HeapMin.Params;
     heapMinParams.size = 1668;
     var myHeapMin = HeapMin.create (heapMinParams);
     Memory.defaultHeapInstance = myHeapMin;
    /*========================= 程序配置=================== *
    /*
     * IAR 会忽略 Program.stack。 使用中的项目选项
     * IAR Embedded Workbench 以更改系统堆栈大小。
     *
    if (typeof no_rom =='undefined'||(typeof no_rom!='undefined'&& no_ROM = 0))
     program.stack = 1024;
     program.argSize = 0;
    其他
     program.stack = 512;
    /*========================= 信标配置=================== *
    VAR 信标= xdc.useModule('ti.sysbios.knl.Semaphore');
    /*
     *启用对任务优先级挂起队列的全局支持。
     *
     *选择一项:
     * - true (默认值)
     *   这允许根据任务优先级为待处理的任务提供服务。
     *- 错
     *   待处理任务是基于先入先出的服务。
     *
     * 在 ROM 中使用 BIOS 时:
     *   此选项必须设置为 false。
     *
    // Semaphore.supportsPriority = true;
    Semaphore.supportsPriority = false;
    /*
     *允许通过信标隐式布置事件、
     *禁用以保存其他代码。
     *
     *选择一项:
     * -正确
     *   这允许信标模块发布信标和事件
        *同步。
     * - false (默认值)
     *   必须显式发布事件以解除阻止任务。
     *
     * 在 ROM 中使用 BIOS 时:
     *   此选项必须设置为 false。
     *
    //semaphore.supportsEvents = true;
    Semaphore.supportsEvents = false;
    /*========================= 事件配置=================== *
    if (typeof use_events!='未定义'&& use_events!= 0)
     VAR 事件= xdc.useModule('ti.sysbios.knl.Event');
    /*========================= Swi 配置=================== *
    VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
    /*
     *软件中断是封装函数的对象
     *已执行且具有优先级。 软件中断被优先化、优先于任务
     和被硬件中断服务例程抢先。
     *
     *包括此模块是为了允许在用户的应用程序中使用 Swi。
     *
    SWI.numPriorities = 6;
    /*========================= 系统配置=================== *
    VAR 系统= xdc.useModule('xdc.runtime.System');
    /*
     *当系统异常退出时调用中止处理程序。
     *
     *选择一项:
     * - System.AbortStd (默认)
     *   调用 ANSI C 标准'abort()'来终止应用程序。
     * - System.abortSpin
     *   在 while (1)陷阱中无限循环的轻量级中止函数
     *   函数。
     * -自定义中止处理程序
     *   用户定义的函数。 请参阅的系统模块说明文件
     *   详细信息。
     *
    // DDB,10/24/16
    // System.AbortFxn = System.AbortStd;
    // System.AbortFxn = System.AbortSpin;
    system.abortFxn ="&myAbortSystem";
    /*
     *系统正常退出时调用 Exit 处理程序。
     *
     *选择一项:
     * - System.exitStd (默认)
     *   调用 ANSI C 标准'exit()'以终止应用程序。
     * - System.exitSpin
     *   在 while (1)陷阱中无限循环的轻量级退出函数
     *   函数。
     * -自定义退出函数
     *   用户定义的函数。 请参阅的系统模块说明文件
     *   详细信息。
     *
    // DDB,10/24/16
    // System.exitFxn = System.exitStd;
    // System.exitFxn = System.exitSpin;
    System.exitFxn ="&myExitSystem";
    /*
     *最小化系统模块中的退出处理程序数组。 系统模块包括
     *向 System_atexit()注册的函数数数组,即
     *由 System_exit()调用。 默认值为8。
     *
    System.maxAtexitHandlers = 0;
    /*
     * System.SupportProxy 定义了 System 的低级实现
     *诸如 System_printf()、System_flush()等函数
     *
     *选择一对:
     * - SysMin
     *   此模块维护一个内部可配置的循环缓冲器
     *   存储输出,直到调用 System_flush()。
     *   循环缓冲区的大小通过 SysMin .bufSize 设置。
     * - SysCallback
     *   SysCallback 允许系统 API 的用户定义实现。
     *   SysCallback 支持代理的代码占用空间更小,可以是
     *   用于提供定制 System_printf 服务。
     *   默认的 SysCallback 函数指向存根函数。 请参阅
     *   SysCallback 模块的文档。
     *
    //var SysMin = xdc.useModule('xdc.runtime.SysMin');
    //SYSMIN.bufSize = 128;
    //System.SupportProxy = SysMin;
    VAR SysCallback = xdc.useModule('xdc.runtime.SysCallback');
    System.SupportProxy = SysCallback;
    //SysCallback.abortFxn ="&myUserAbort";
    //SysCallback.exitFxn ="&myUserExit";
    //SysCallback.flushFxn ="&myUserFlush";
    //SysCallback.putchFxn ="&myUserPutch";
    //SysCallback.readyFxn ="&myUserReady";
    /*========================= 任务配置=================== *
    VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
    /*
     *检查任务堆栈是否有溢出情况。
     *
     *选择一项:
     * - true (默认值)
     *   在期间启用任务堆栈溢出情况的运行时检查
     *   上下文切换("从"和"到")
     *- 错
     *   禁用任务堆栈溢出情况的运行时检查。
     *
     * 在 ROM 中使用 BIOS 时:
     *   此选项必须设置为 false。
     *
    // Task.checkStackFlag = true;
    Task.checkStackFlag = false;
    /*
     *设置创建任务时的默认任务堆栈大小。
     *
     *默认值取决于所使用的器件。 减少默认堆栈
     *大小可节省更多内存。
     *
    Task.defaultStackSize = 512;
    /*
     *启用空闲任务。
     *
     *选择一项:
     * - true (默认值)
     *   创建优先级为0的任务,调用空闲挂钩函数。 这种情况
     必须   将*选项设置为 true 才能通过 Power 实现节能
        *模块。
     *- 错
     *   未创建空闲任务。 此选项占用的内存较少、因为没有
     *   需要附加的默认任务堆栈。
     *   要在没有空闲任务的情况下通过电源模块实现节能、
     *   将 Idle.run 添加为 Task.allBlockedFunc。
     *
    task.enableIdleTask = true;
    //Task.enableIdleTask = false;
    //Task.allBlockedFunc = Idle.run;
    /*
     *如果 Task.enableIdleTask 设置为 true,则此选项设置空闲任务
     *堆栈大小。
     *
     *减小空闲堆栈大小可节省更多内存。
     *
    task.idleTaskStackSize = 512;
    /*
     *减少任务优先级的数量。
     *默认值为16。
     *减少任务优先级的数量可节省内存。
     *
    Task.numPriorities = 6;
    /*========================= 文本配置=================== *
    var text = xdc.useModule('xdc.runtime.Text');
    /*
     *这些字符串放置在.const 段中。 将此参数设置为
     * false 将在.const 段中节省空间。 错误、断言和记录消息
     *将打印原始 ID 和 args、而不是格式化的消息。
     *
     *选择一项:
     * - true (默认值)
     *   此选项将测试字符串加载到.const 中以方便调试。
     *- 错
     *   此选项可减小.const 占用空间。
     *
    // text.isLoaded = true;
    text.isLoaded = false;
    /*========================= TI-RTOS 中间件配置================= *
    var mwConfig = xdc.useModule('ti.mw.Config');
    /*
     *包括 TI-RTOS 中间件库
     *
    /*========================= TI-RTOS 驱动程序的配置==== *
    VAR driversConfig = xdc.useModule('ti.drivers.Config');
    /*
     *包含 TI-RTOS 驱动程序
     *
     *选择一项:
     * - driversConfig.LibType_NonInstrumented (默认)
     *   使用针对封装和性能进行优化的 TI-RTOS 驱动程序库
     *   无断言或日志。
     * - driversConfig.LibType_Instrumented
     *   使用 TI-RTOS 驱动程序库在启用断言和日志的情况下进行调试。
     *
    driversConfig.libType = driversConfig.LibType_NonInstrumented;
    //driversConfig.libType = driversConfig.LibType_Instrumented;
    //剩余模块
    VAR 诊断= xdc.useModule('xdc.runtime.Diags');
    VAR Main = xdc.useModule('xdc.runtime.Main');
    VAR Reset = xdc.useModule('xdc.runtime.Reset');
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dave、

    感谢您提供的附加信息以及.cfg 文件。

    还可以为您的项目附加 ccfg.c 文件吗?

    我们还想知道的另一件事是,您是否链接到预构建的 driverlib 库,或者您是否已经重建了库,或者是否直接将源代码构建为应用程序的一部分?  您是否可以直接(使用论坛朋友机制)将您的应用程序输出文件发送给我们、以便我们可以反汇编几个关键功能?

    谢谢、
    Scott

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

    我们对驱动程序所做的唯一更改是将"#define Display_disable_all 1"添加到 Display.h 文件的顶部、因为尝试写入我们定制板上不存在的显示屏似乎会导致 BLE 性能问题。

    我必须与我们的客户联系、以查看是否可以发送应用程序输出文件。

    我们的 ccfg.c 文件如下。

    - Dave

    /*********
    *文件名: ccfg.c
    *修订日期: $Date:2016-01-14 13:41:44 +0100 (收件人、2016年1月14日)$
    *修订版: $Revision:16602美元
    *
    *说明:CC26xx 器件系列的客户配置(硬件版本2)。
    *
    *版权所有(C) 2014德州仪器(TI)公司- http://www.ti.com/
    *
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    *源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    *二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随分发提供的文档和/或其他材料。
    *
    *德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者提供
    *"按原样"以及任何明示或暗示的保证、包括但不包括
    *仅限于对适销性和适用性的暗示保证
    *一项特定目的不予承认。 在任何情况下、版权均不得
    *所有者或贡献者应对任何直接、间接、偶然或
    *特殊、惩戒性或后果性损害(包括但不包括)
    *仅限于采购替代货物或服务;丧失使用、
    *数据或利润;或业务中断)
    *责任理论、无论是合同责任、严格责任还是侵权行为
    *(包括疏忽或其他)因使用而以任何方式产生
    *、即使被告知可能会发生此类损坏。
    *
    秘书长的报告 /

    #include
    #include
    #include
    #include

    //
    //
    //简介
    //
    //此文件包含引导 ROM、启动代码和软件无线电使用的字段
    //堆栈来配置芯片行为。
    //
    //字段在中的 hw_ccfg.h 和 CCFG.html 中有详细说明
    // DriverLib 文档(doc_overview.html -> CPU 域内存映射-> CCFG)。
    //
    //

    //
    //
    //设置各个位字段的值。
    //
    //

    //##############################
    //备选直流/直流设置
    //##############################

    #ifndef SET_CCFG_Size_and_DIS_FLAGS_DIS_ALT_DCDC_Setting
    #define SET_CCFG_SIZE 和 DIS_FLAGS_DIS_ALT_DCDC_Setting 0x0 //启用备用直流/直流设置
    //#define SET_CCFG_SIZE 和 DIS_FLAGS_DIS_ALT_DCDC_Setting 0x1 //禁用备用直流/直流设置
    #endif

    #ifndef SET_CCFG_MODE_CONF_1_ALT_DCDC_Vmin
    #define SET_CCFG_MODE_CONF_1_ALT_DCDC_Vmin 0x8. // 2.25V
    #endif

    #ifndef SET_CCFG_MODE_CONF_1_ALT_DCDC_DITHER _EN
    #define SET_CCFG_MODE_CONF_1_ALT_DCDC_DITHER _EN 0x0 //禁用
    //#define SET_CCFG_MODE_CONF_1_ALT_DCDC_DITHER _EN 0x1. //启用
    #endif

    #ifndef SET_CCFG_MODE_CONF_1_ALT_DCDC_IPEAK
    #define SET_CCFG_MODE_CONF_1_ALT_DCDC_IPEAK 0x2. // 39mA
    #endif

    //##############################
    // XOSC 覆盖设置
    //##############################

    #ifndef SET_CCFG_Size_and_DIS_FLAGS_DIS_XOSC_OVR
    //#define SET_CCFG_Size_and_DIS_FLAGS_DIS_XOSC_OVR 0x0 //启用覆盖
    #define SET_CCFG_SIZE 和 DIS_FLAGS_DIS_XOSC_OVR 0x1. //禁用覆盖
    #endif

    #ifndef SET_CCFG_MODE_CONF_1_DELTA IBIAS_INIT
    #define SET_CCFG_MODE_CONF_1_DELTA IBIAS_INIT 0x0 // Delta = 0
    #endif

    #ifndef SET_CCFG_MODE_CONF_1_DELTA IBIAS_OFFSET
    #define SET_CCFG_MODE_CONF_1_DEAL_BIAS_OFFSET 0x0 // Delta = 0
    #endif

    #ifndef SET_CCFG_MODE_CONF_1_XOSC_MAX_START
    #define SET_CCFG_MODE_CONF_1_XOSC_MAX_START 0x10 // 1600us
    #endif

    //##############################
    //电源设置
    //##############################

    #ifndef SET_CCFG_MODE_CONF_VDDR_TRIM_SLEEP_Delta
    #define SET_CCFG_MODE_CONF_VDDR_TRIM_SLEEP_Delta 0xF //有符号增量值+1用于应用于 VDDR_TRIM_SLEEP 目标(0xF=-1=default=no compensation)
    #endif

    #ifndef SET_CCFG_MODE_CONF_DCDC_REGLEARGE
    #define SET_CCFG_MODE_CONF_DCDC_REGLEE 0x0 //在断电期间使用 DC/DC
    //#define SET_CCFG_MODE_CONF_DCDC_REGLEE 0x1. //在断电期间不要使用 DC/DC
    #endif

    #ifndef SET_CCFG_MODE_CONF_DCDC_ACTIVE
    #define SET_CCFG_MODE_CONF_DCDC_ACTIVE 0x0 //在激活模式下使用 DC/DC
    //#define SET_CCFG_MODE_CONF_DCDC_ACTIVE 0x1. //在激活模式下不要使用 DC/DC
    #endif

    #ifndef SET_CCFG_MODE_CONF_VDDS_BOD_LEVEL
    //#define SET_CCFG_MODE_CONF_VDDS_BOD_LEVEL 0x0 // VDDS BOD 电平为2.0V
    #define SET_CCFG_MODE_CONF_VDDS_BOD_LEVEL 0x1. // VDDS BOD 电平为1.8V (对于外部稳压器模式为1.65V)
    #endif

    #ifndef SET_CCFG_MODE_CONF_VDDR_CAP
    #define SET_CCFG_MODE_CONF_VDDR_CAP 0x3A //无符号8位整数,表示 VDDR 上的最小去耦电容,单位为100nF
    #endif

    #ifndef SET_CCFG_MODE_CONF_VDDR_TRIM_SLEEP_TC
    #define SET_CCFG_MODE_CONF_VDDR_TRIM_SLEEP_TC 0x1. //禁用 VDDR 睡眠调整上的温度补偿(默认)
    //#define SET_CCFG_MODE_CONF_VDDR_TRIM_SLEEP_TC 0x0 启用 VDDR 睡眠修整上的//温度补偿
    #endif

    //##############################
    //时钟设置
    //##############################

    #ifndef SET_CCFG_MODE_CONF_SCLK_LF_OPTION
    //#define SET_CCFG_MODE_CONF_SCLK_LF_OPTION 0x0 //来自高频 XOSC 的 LF 时钟
    //#define SET_CCFG_MODE_CONF_SCLK_LF_OPTION 0x1. //外部 LF 时钟
    #define SET_CCFG_MODE_CONF_SCLK_LF_OPTION 0x2. // LF XOSC
    //#define SET_CCFG_MODE_CONF_SCLK_LF_OPTION 0x3. // LF RCOSC
    #endif

    #ifndef SET_CCFG_MODE_CONF_XOSC_CAP_MOD
    //#define SET_CCFG_MODE_CONF_XOSC_CAP_MOD 0x0 //应用电容阵列增量
    #define SET_CCFG_MODE_CONF_XOSC_CAP_MOD 0x1. //不要应用电容阵列增量
    #endif

    #ifndef SET_CCFG_MODE_CONF_XOSC_CAPARRAY_Delta
    #define SET_CCFG_MODE_CONF_XOSC_CAPARRAY_Delta 0xFF //有符号8位值,直接修改修整的 XOSC 电容阵列值
    #endif

    #ifndef SET_CCFG_EXT_LF_CLK_DIO
    #define SET_CCFG_EXT_LF_CLK_DIO 0x01 //如果使用外部 LF 时钟、则为 DIO 编号
    #endif

    #ifndef SET_CCFG_EXT_LF_CLK_RTC_Increment
    #define SET_CCFG_EXT_LF_CLK_RTC_Increment 0x800000 // RTC 增量、表示外部 LF 时钟频率
    #endif

    //##############################
    //特殊 HF 时钟源设置
    //##############################
    #ifndef SET_CCFG_MODE_CONF_XOSC_FREQ
    //#define SET_CCFG_MODE_CONF_XOSC_FREQ 0x1. //使用 HPOSC 作为 HF 源(如果在 HPOSC 芯片上执行、否则使用默认值(=0x3))
    //#define SET_CCFG_MODE_CONF_XOSC_FREQ 0x2. // HF 源是48MHz xtal
    #define SET_CCFG_MODE_CONF_XOSC_FREQ 0x3. // HF 源是24MHz xtal (默认值)
    #endif

    //##############################
    //引导加载程序设置
    //##############################

    #ifndef SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE
    #define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0x00 //禁用 ROM 引导加载程序
    //#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0xC5 //启用 ROM 引导加载程序
    #endif

    #ifndef SET_CCFG_BL_CONFIG_BL_LEVEL
    //#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x0 //低电平有效以打开引导装载程序后门
    #define SET_CCFG_BL_CONFIG_BL_LEVEL 0x1. //高电平有效以打开车尾箱装载器后门
    #endif

    #ifndef SET_CCFG_BL_CONFIG_BL_PIN_NUMBER
    #define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER 0xFF //引导加载程序后门的 DIO 编号
    #endif

    #ifndef SET_CCFG_BL_CONFIG_BL_ENABLE
    //#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xC5 //已启用引导加载程序后门
    #define SET_CCFG_BL_CONFIG_BL_ENABLE 0xFF //已禁用引导加载程序后门
    #endif

    //##############################
    //调试访问设置
    //##############################

    #ifndef SET_CCFG_CCFG_TI_OPTIONS_TI_FA_ENABLE
    #define SET_CCFG_CCFG_TI_OPTIONS_TI_FA_ENABLE 0x00 //禁用 TI FA 选项的解锁。
    //#define SET_CCFG_CCFG_TI_OPTIONS TI_FA_ENABLE 0xC5 //使用解锁代码启用 TI FA 解锁选项
    #endif

    #ifndef SET_CCFG_CCFG_TAP_DAP_0_CPU_DAP_ENABLE
    //#define SET_CCFG_CCFG_TAP_DAP_0_CPU_DAP_ENABLE 0x00 //访问被禁用
    #define SET_CCFG_CCFG_TAP_DAP_0_CPU_DAP_ENABLE 0xC5 //如果在 FCFG 中也启用访问,则启用访问
    #endif

    #ifndef SET_CCFG_CCFG_TAP_DAP_0_PRCM_TAP_ENABLE
    #define SET_CCFG_CCFG_TAP_DAP_0_PRCM_TAP_ENABLE 0x00 //访问被禁用
    //#define SET_CCFG_CCFG_TAP_DAP_0_PRCM_TAP_ENABLE 0xC5 //如果在 FCFG 中也启用访问,则启用访问
    #endif

    #ifndef SET_CCFG_CCFG_TAP_DAP_0_TEST_TAP_ENABLE
    //#define SET_CCFG_CCFG_TAP_DAP_0_TEST_TAP_ENABLE 0x00 //访问被禁用
    #define SET_CCFG_CCFG_TAP_DAP_0_TEST_TAP_ENABLE 0xC5 //如果在 FCFG 中也启用访问,则启用访问
    #endif

    #ifndef SET_CCFG_CCFG_TAP_DAP_1_PBIST2_TAP_ENABLE
    #define SET_CCFG_CCFG_TAP_DAP_1_PBIST2_TAP_ENABLE 0x00 //访问被禁用
    //#define SET_CCFG_CCFG_TAP_DAP_1_PBIST2_TAP_ENABLE 0xC5 //如果在 FCFG 中也启用访问,则启用访问
    #endif

    #ifndef SET_CCFG_CCFG_TAP_DAP_1_PBIST1_TAP_ENABLE
    #define SET_CCFG_CCFG_TAP_DAP_1_PBIST1_ENABLE 0x00 //访问被禁用
    //#define SET_CCFG_CCFG_TAP_DAP_1_PBIST1_ENABLE 0xC5 //如果在 FCFG 中也启用访问,则启用访问
    #endif

    #ifndef SET_CCFG_CCFG_TAP_1_WuC_TAP_ENABLE
    #define SET_CCFG_CCFG_TAP_1_WUC_TAP_ENABLE 0x00 //访问被禁用
    //#define SET_CCFG_CCFG_TAP_1_WuC_TAP_ENABLE 0xC5 //如果在 FCFG 中也启用访问,则启用访问
    #endif

    //##############################
    //备选 IEEE 802.15.4 MAC 地址
    //##############################
    #ifndef SET_CCFG_IEEE_MAC_0
    #define SET_CCFG_IEEE_MAC_0 0xFFFFFFFF //位[31:0]
    #endif

    #ifndef SET_CCFG_IEEE_MAC_1
    #define SET_CCFG_IEEE_MAC_1 0xFFFFFFFF //位[63:32]
    #endif

    //##############################
    //备用 BLE 地址
    //##############################
    #ifndef SET_CCFG_IEEE_BLE_0
    #define SET_CCFG_IEEE_BLE_0 0xFFFFFFFF //位[31:0]
    #endif

    #ifndef SET_CCFG_IEEE_BLE_1
    #define SET_CCFG_IEEE_BLE_1 0xFFFFFFFF //位[63:32]
    #endif

    //##############################
    //闪存擦除设置
    //##############################

    #ifndef SET_CCFG_ERASE_CONF_CHIP_ERASE_DIS_N
    //#define SET_CCFG_ERASE_CONF_CHIP_ERASE_DIS_N 0x0 //在启动期间检测到的任何芯片擦除请求都将被忽略
    #define SET_CCFG_ERASE_CONF_CHIP_ERASE_DIS_N 0x1. //启动期间检测到的任何芯片擦除请求都将由启动 FW 执行
    #endif

    #ifndef SET_CCFG_ERASE_CONF_BANK_ERASE_DIS_N
    //#define SET_CCFG_ERASE_CONF_BANK_ERASE_DIS_N 0x0 //禁用引导加载程序组擦除功能
    #define SET_CCFG_ERASE_CONF_BANK_ERASE_DIS_N 0x1. //启用引导加载程序组擦除功能
    #endif

    //##############################
    //闪存映像有效
    //##############################
    #ifndef SET_CCFG_IMAGE_VALID CONF_IMAGE_VALID
    #define SET_CCFG_IMAGE_VALID CONF_IMAGE_VALID 0x00000000 //闪存映像有效
    //#define SET_CCFG_IMAGE_VALID CONF_IMAGE_VALID //闪存映像无效,请调用 bootloader
    #endif

    //##############################
    //闪存扇区写保护
    //##############################
    #ifndef SET_CCFG_CCFG_PROT_31_0
    #define SET_CCFG_CCFG_PROT_31_0 0xFFFFFFFF
    #endif

    #ifndef SET_CCFG_CCFG_PROT_63_32
    #define SET_CCFG_CCFG_PROT_63_32 0xFFFFFFFF
    #endif

    #ifndef SET_CCFG_CCFG_PROT_95_64
    #define SET_CCFG_CCFG_PROT_95_64 0xFFFFFFFF
    #endif

    #ifndef SET_CCFG_CCFG_PROT_127_96
    #define SET_CCFG_CCFG_PROT_127_96 0xFFFFFFFF
    #endif

    //##############################
    //在高速缓存或 GPRAM 之间进行选择
    //##############################
    #ifndef SET_CCFG_Size_and_DIS_FLAGS_DIS_GPRAM
    //#define SET_CCFG_Size_and_DIS_FLAGS_DIS_GPRAM 0x0 //缓存被禁用,GPRAM 在0x11000000-0x11001FFF 中可用
    #define SET_CCFG_SIZE 和 DIS_FLAGS_DIS_GPRAM 0x1. //启用高速缓存和禁用 GPRAM (不可用)
    #endif

    //
    //
    //不应修改的 CCFG 值。
    //
    //
    #define SET_CCFG_Size_and_DIS_FLAGS_Size_of_CCFG 0x0058
    #define SET_CCFG_SIZE 和 DIS_FLAGS_DISABLE_FLAGS 0x3FFF

    #define SET_CCFG_MODE_CONF_VDDR_EXT_LOAD 0x1.
    #define SET_CCFG_MODE_CONF_RTC_COMP 0x1.
    #define SET_CCFG_MODE_CONF_HF_COMP 0x1.

    #define SET_CCFG_VOLT_LOAD_0_VDDR_EXT_TP45 0xFF
    #define SET_CCFG_VOLT_LOAD_0_VDDR_EXT_TP25 0xFF
    #define SET_CCFG_VOLT_LOAD_0_VDDR_EXT_TP5 0xFF
    #define SET_CCFG_VOLT_LOAD_0_VDDR_EXT_TM15 0xFF

    #define SET_CCFG_VOLT_LOAD_1_VDDR_EXT_TP125 0xFF
    #define SET_CCFG_VOLT_LOAD_1_VDDR_EXT_TP105 0xFF
    #define SET_CCFG_VOLT_LOAD_1_VDDR_EXT_TP85 0xFF
    #define SET_CCFG_VOLT_LOAD_1_VDDR_EXT_TP65 0xFF

    #define SET_CCFG_RTC_OFFSET_RTC_COMP_P0 0xFFFF
    #define SET_CCFG_RTC_OFFSET_RTC_COMP_P1 0xFF
    #define SET_CCFG_RTC_OFFSET_RTC_COMP_P2 0xFF

    #define SET_CCFG_FREQ_OFFSET_HF_COMP_P0 0xFFFF
    #define SET_CCFG_FREQ_OFFSET_HF_COMP_P1 0xFF
    #define SET_CCFG_FREQ_OFFSET_HF_COMP_P2 0xFF

    //
    //
    //将位字段连接到字。
    //请勿编辑!
    //
    //
    #define DEFAULT_CCFG_O_EXT_LF_CLK (\
    (((uint32_t)(SET_CCFG_EXT_LF_CLK_DIO << CCFG_EXT_LF_CLK_DIO_S ) |~CCFG_EXT_LF_CLK_DIO_M) 和\
    (((uint32_t)(SET_CCFG_EXT_LF_CLK_RTC_Increment << CCFG_EXT_LF_CLK_RTC_EMING_S)|~CCFG_EXT_LF_CLK_RTC_EMING_M)

    #define DEFAULT_CCFG_MODE_CONF_1 (\
    (((uint32_t)(SET_CCFG_MODE_CONF_1_ALT_DCDC_Vmin << CCFG_MODE_CONF_1_ALT_DCDC_Vmin_S ) |~CCFG_MODE_CONF_1_ALT_DCDC_Vmin_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_1_ALT_DCDC_DIATE_EN << CCFG_MODE_CONF_1_ALT_DCDC_DIATE_EN_S))|~CCFG_MODE_CONF_1_ALT_DCDC_DIATE_EN_M)&\
    (((uint32_t)(SET_CCFG_MODE_CONF_1_ALT_DCDC_IPEAK << CCFG_MODE_CONF_1_ALT_DCDC_IPEAK_S ) |~CCFG_MODE_CONF_1_ALT_DCDC_IPEAK_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_1_DET_BIAS_INIT << CCFG_MODE_CONF_1_DET_BIAS_INIT_S))|~CCFG_MODE_CONF_1_DET_BIAS_INIT_M)&\
    (((uint32_t)(SET_CCFG_MODE_CONF_1_DELT_IBIBIAS_OFFSET << CCFG_MODE_CONF_1_DET_BIAS_OFFSET_S)|~CCFG_MODE_CONF_1_DET_BIAS_OFFSET_M)&\
    (((uint32_t)(SET_CCFG_MODE_CONF_1_XOSC_MAX_START << CCFG_MODE_CONF_1_XOSC_MAX_START_S ) |~CCFG_MODE_CONF_1_XOSC_MAX_START_M) )

    #define DEFAULT_CCFG_SIZE 和 DIS_FLAGS (\
    (((uint32_t)(Set_CCFG_Size_and_DIS_FLAGS_Size_of_CCFG << CCFG_SIZE_AND_DIS_FLAGS_SIZE_of_CCFG_S ) |~CCFG_SIZE 和 DIS_FLAGS_SIZE CCFG_M) 和\
    (((uint32_t)(SET_CCFG_SIZE 和 DIS_FLAGS_DISABLE_FLAGS << CCFG_SIZE_AND_DIS_FLAGS_DISABLE_FLAGS_S ) |~CCFG_SIZE 和 DIS_FLAGS_DISABLE_FLAGS_M) 和\
    (((uint32_t)(SET_CCFG_SIZE 和 DIS_FLAGS_DIS_GPRAM << CCFG_SIZE_AND_DIS_FLAGS_DIS_GPRAM_S ) |~CCFG_SIZE 和 DIS_FLAGS_DIS_GPRAM_M) 和\
    (((uint32_t)(SET_CCFG_SIZE_AND_DIS_FLAGS_DIS_ALT_DCDC_Setting << CCFG_SIZE_AND_DIS_FLAGS_DIS_ALT_DCDC_setting_S))|~CCFG_SIZE_AND_DIS_FLAGS_DIS_DET_DCDC_setting_M)&\
    (((uint32_t)(SET_CCFG_SIZE 和 DIS_FLAGS_DIS_XOSC_OVR <<CCFG_SIZE_AND_DIS_FLAGS_DIS_XOSC_OVR_S ) |~CCFG_SIZE 和 DIS_FLAGS_DIS_XOSC_OVR_M) )

    #define DEFAULT_CCFG_MODE_CONF (\
    (((uint32_t)(SET_CCFG_MODE_CONF_VDDR_TRIM_SLEEP_Delta << CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA)|~CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA)和\
    (((uint32_t)(SET_CCFG_MODE_CONF_DCDC_REGLET << CCFG_MODE_CONF_DCDC_REGARY_S ) |~CCFG_MODE_CONF_DCDC_RELEARY_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_DCDC_ACTIVE << CCFG_MODE_CONF_DCDC_ACTIVE_S ) |~CCFG_MODE_CONF_DCDC_ACTIVE_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_VDDR_EXT_LOAD << CCFG_MODE_CONF_VDDR_EXT_LOAD_S ) |~CCFG_MODE_CONF_VDDR_EXT_LOAD_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_VDDS_BOD_LEVEL << CCFG_MODE_CONF_VDDS_BOD_LEVEL_S ) |~CCFG_MODE_CONF_VDDS_BOD_LEVEL_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_SCLK_LF_OPTION << CCFG_MODE_CONF_SCLK_LF_OPTION_S ) |~CCFG_MODE_CONF_SCLK_LF_OPTION_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_VDDR_TRIM_SLEEP_TC << CCFG_MODE_CONF_VDDR_TRIM_SLEEP_TC_S)|~CCFG_MODE_CONF_VDDR_TRIM_SLEEP_TC_M)和\
    (((uint32_t)(SET_CCFG_MODE_CONF_RTC_COMP << CCFG_MODE_CONF_RTC_COMP_S ) |~CCFG_MODE_CONF_RTC_COMP_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_XOSC_FREQ << CCFG_MODE_CONF_XOSC_FREQ_S ) |~CCFG_MODE_CONF_XOSC_FREQ_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_XOSC_CAP_MOD << CCFG_MODE_CONF_XOSC_CAP_MOD_S ) |~CCFG_MODE_CONF_XOSC_CAP_MOD_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_HF_COMP << CCFG_MODE_CONF_HF_COMP_S ) |~CCFG_MODE_CONF_HF_COMP_M) 和\
    (((uint32_t)(SET_CCFG_MODE_CONF_XOSC_CAPARRAY_Delta << CCFG_MODE_CONF_XOSC_CAPARRAY_Delta_S))|~CCFG_MODE_CONF_XOSC_CAPARRAY_Δ M)&\
    (((uint32_t)(SET_CCFG_MODE_CONF_VDDR_CAP << CCFG_MODE_CONF_VDDR_CAP_S ) |~CCFG_MODE_CONF_VDDR_CAP_M) )

    #define DEFAULT_CCFG_VOLT_LOAD_0 (\
    (((uint32_t)(SET_CCFG_VOLT_LOAD_0_VDDR_EXT_TP45 <<CCFG_VOLT_LOAD_0_VDDR_EXT_TP45_S))|~CCFG_VOLT_LOAD_0_VDDR_EXT_TP45_M)&\
    (((uint32_t)(SET_CCFG_VOLT_LOAD_0_VDDR_EXT_TP25 <<CCFG_VOLT_LOAD_0_VDDR_EXT_TP25_S))|~CCFG_VOLT_LOAD_0_VDDR_EXT_TP25_M)&\
    (((uint32_t)(SET_CCFG_VOLT_LOAD_0_VDDR_EXT_TP5 <<CCFG_VOLT_LOAD_0_VDDR_EXT_TP5_S))|~CCFG_VOLT_LOAD_0_VDDR_EXT_TP5_M)&\
    (((uint32_t)(SET_CCFG_VOLT_LOAD_0_VDDR_EXT_TM15 << CCFG_VOLT_LOAD_0_VDDR_EXT_TM15_S))|~CCFG_VOLT_LOAD_0_VDDR_EXT_TM15_M)

    #define DEFAULT_CCFG_VOLT_LOAD_1 (\
    (((uint32_t)(SET_CCFG_VOLT_LOAD_1_VDDR_EXT_TP125 <<CCFG_VOLT_LOAD_1_VDDR_EXT_TP125_S))|~CCFG_VOLT_LOAD_1_VDDR_EXT_TP125_M)&\
    (((uint32_t)(SET_CCFG_VOLT_LOAD_1_VDDR_EXT_TP105 <<CCFG_VOLT_LOAD_1_VDDR_EXT_TP105_S))|~CCFG_VOLT_LOAD_1_VDDR_EXT_TP105_M)&\
    (((uint32_t)(SET_CCFG_VOLT_LOAD_1_VDDR_EXT_TP85 <<CCFG_VOLT_LOAD_1_VDDR_EXT_TP85_S))|~CCFG_VOLT_LOAD_1_VDDR_EXT_TP85_M)&\
    (((uint32_t)(SET_CCFG_VOLT_LOAD_1_VDDR_EXT_TP65 << CCFG_VOLT_LOAD_1_VDDR_EXT_TP65_S)|~CCFG_VOLT_LOAD_1_VDDR_EXT_TP65_M)

    #define DEFAULT_CCFG_RTC_OFFSET (\
    (((uint32_t)(SET_CCFG_RTC_OFFSET_RTC_COMP_P0 << CCFG_RTC_OFFSET_RTC_COMP_P0_S)|~CCFG_RTC_OFFSET_RTC_COMP_P0_M)&\
    (((uint32_t)(SET_CCFG_RTC_OFFSET_RTC_COMP_P1 << CCFG_RTC_OFFSET_RTC_COMP_P1_S)|~CCFG_RTC_OFFSET_RTC_COMP_P1_M)&\
    (((uint32_t)(SET_CCFG_RTC_OFFSET_RTC_COMP_P2 << CCFG_RTC_OFFSET_RTC_COMP_P2_S)|~CCFG_RTC_OFFSET_RTC_COMP_P2_M)

    #define DEFAULT_CCFG_FREQ_OFFSET (\
    (((uint32_t)(SET_CCFG_FREQ_OFFSET_HF_COMP_P0 << CCFG_FREQ_OFFSET_HF_COMP_P0_S)|~CCFG_FREQ_OFFSET_HF_COMP_P0_M)&\
    (((uint32_t)(SET_CCFG_FREQ_OFFSET_HF_COMP_P1 << CCFG_FREQ_OFFSET_HF_COMP_P1_S)|~CCFG_FREQ_OFFSET_HF_COMP_P1_M)&\
    (((uint32_t)(SET_CCFG_FREQ_OFFSET_HF_COMP_P2 << CCFG_FREQ_OFFSET_HF_COMP_P2_S)|~CCFG_FREQ_OFFSET_HF_COMP_P2_M)

    #define DEFAULT_CCFG_IEEE_MAC_0 SET_CCFG_IEEE_MAC_0
    #define DEFAULT_CCFG_IEEE_MAC_1 SET_CCFG_IEEE_MAC_1
    #define DEFAULT_CCFG_IEEE_BLE_0 SET_CCFG_IEEE_BLE_0
    #define DEFAULT_CCFG_IEEE_BLE_1 SET_CCFG_IEEE_BLE_1

    #define DEFAULT_CCFG_BL_CONFIG (\
    (((uint32_t)(SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE << CCFG_BL_CONFIG_BOOTLOADER_ENABLE_S)|~CCFG_BL_CONFIG_BOOTLOADER_ENABLE_M)&\
    (((uint32_t)(SET_CCFG_BL_CONFIG_BL_LEVEL << CCFG_BL_CONFIG_BL_LEVEL_S ) |~CCFG_BL_CONFIG_BL_LEVEL_M) 和\
    (((uint32_t)(SET_CCFG_BL_CONFIG_BL_PIN_NUMBER << CCFG_BL_CONFIG_BL_PIN_NUMBER_S ) |~CCFG_BL_CONFIG_BL_PIN_NUMBER_M) 和\
    (((uint32_t)(SET_CCFG_BL_CONFIG_BL_ENABLE << CCFG_BL_CONFIG_BL_ENABLE_S ) |~CCFG_BL_CONFIG_BL_ENABLE_M) )

    #define DEFAULT_CCFG_ERASE_CONF (\
    (((uint32_t)(SET_CCFG_ERASE_CONF_CHIP_ERASE_DIS_N << CCFG_ERASE_CONF_CHIP_ERASE_DIS_N))|~CCFG_ERASE_CONF_CHIPLE_DIS_N_M)和\
    (((uint32_t)(SET_CCFG_ERASE_CONF_BANK_ERASE_DIS_N << CCFG_ERASE_CONF_BANK_ERASE_DIS_N_S)|~CCFG_ERASE_CONF_BANK_ERASE_DIS_N_M))

    #define DEFAULT_CCFG_CCFG_TI_OPTIONS (\
    (((uint32_t)(SET_CCFG_CCFG_TI_OPTIONS_TI_FA_ENABLE << CCFG_TI_OPTIONS_TI_FA_ENABLE_S)|~CCFG_CCFG_TI_OPTIONS_TI_FA_ENABLE_M))

    #define DEFAULT_CCFG_CCFG_TAP_0 (\
    (((uint32_t)(SET_CCFG_CCFG_TAP_DAP_0_CPU_DAP_ENABLE << CCFG_TAP_0_CPU_DAP_ENABLE_S)|~CCFG_CCFG_TAP_0_CPU_DAP_ENABLE_M)和\
    (((uint32_t)(SET_CCFG_CCFG_TAP_DAP_0_PRCM_TAP_ENABLE << CCFG_TAP_0_PRCM_TAP_ENABLE_S)|~CCFG_CCFG_TAP_0_PRCM_TAP_ENABLE_M)和\
    (((uint32_t)(SET_CCFG_CCFG_TAP_DAP_0_TEST_TAP_ENABLE << CCFG_TAP_0_TEST_TAP_ENABLE_S))|~CCFG_CCFG_TAP_0_TAP_TAP_ENABLE_M)

    #define DEFAULT_CCFG_CCFG_TAP_DAP_1 (\
    (((uint32_t)(SET_CCFG_CCFG_TAP_DAP_1_PBIST2_TAP_ENABLE << CCFG_TAP_1_PBIST2_TAP_ENABLE_S)|~CCFG_CCFG_TAP_1_PBIST2_TAP_ENABLE_M)和\
    (((uint32_t)(SET_CCFG_CCFG_TAP_DAP_1_PBIST1_TAP_ENABLE << CCFG_CCFG_TAP_1_PBIST1_TAP_ENABLE_S))|~CCFG_CCFG_TAP_1_PBIST1_ENABLE_M)和\
    (((uint32_t)(SET_CCFG_CCFG_TAP_DAP_1_WUC_TAP_ENABLE << CCFG_TAP_1_WUC_TAP_1_ENABLE_S))|~CCFG_CCFG_TAP_1_WUC_TAP_1_WUC_TAP_ENABLE_M)

    #define DEFAULT_CCFG_IMAGE_VALAR_CONF (\
    (((uint32_t)(SET_CCFG_IMAGE_VALLED_CONF_IMAGE_VALID << CCFG_IMAGE_VALLED_CONF_IMAGE_VALLE_S)|~CCFG_IMAGE_VALLED_CONF_IMAGE_VALLE_M))

    #define DEFAULT_CCFG_CCFG_PROT_31_0 SET_CCFG_CCFG_PROT_31_0
    #define DEFAULT_CCFG_CCFG_PROT_63_32 SET_CCFG_CCFG_PROT_63_32
    #define DEFAULT_CCFG_CCFG_PROT_95_64 SET_CCFG_CCFG_PROT_95_64
    #define DEFAULT_CCFG_CCFG_PROT_127_96 SET_CCFG_CCFG_PROT_127_96

    //
    //
    //锁定页面中的客户配置区域
    //
    //
    #if defined (__IAR_systems_ICC__)
    __root const ccfg_t __ccfg @".ccfg"=
    #Elif defined (_TI_Compiler_version__)
    #pragma DATA_SECTION (_ccfg、".ccfg")
    #pragma RETAIN (_ccfg)
    const ccfg_t __ccfg =
    其他
    const ccfg_t __ccfg __attribute__((section(".ccfg"))__attribute__((已用))=
    #endif
    { //映射到地址
    DEFAULT_CCFG_O_EXT_LF_CLK ,// 0x50003FA8 (0x50003xxx 映射到最后一个
    DEFAULT_CCFG_MODE_CONF_1 ,//闪存中的0x50003FAC 扇区。
    DEFAULT_CCFG_SIZE 和 DIS_FLAGS,// 0x50003FB0与闪存大小无关)
    DEFAULT_CCFG_MODE_CONF // 0x50003FB4
    DEFAULT_CCFG_VOLT_LOAD_0 // 0x50003FB8
    DEFAULT_CCFG_VOLT_LOAD_1 // 0x50003FBC
    DEFAULT_CCFG_RTC_OFFSET ,// 0x50003FC0
    DEFAULT_CCFG_FREQ_OFFSET // 0x50003FC4
    DEFAULT_CCFG_IEEE_MAC_0 ,// 0x50003FC8
    DEFAULT_CCFG_IEEE_MAC_1 // 0x50003FCC
    DEFAULT_CCFG_IEEE_BLE_0 // 0x50003FD0
    DEFAULT_CCFG_IEEE_BLE_1 // 0x50003FD4
    DEFAULT_CCFG_BL_CONFIG // 0x50003FD8
    DEFAULT_CCFG_ERASE_CONF // 0x50003FDC
    DEFAULT_CCFG_CCFG_TI_OPTIONS,// 0x50003FE0
    DEFAULT_CCFG_CCFG_TAP_0 // 0x50003FE4
    DEFAULT_CCFG_CCFG_TAP_DAP_1 // 0x50003FE8
    DEFAULT_CCFG_IMAGE_VALICE_CONF,// 0x50003FEC
    DEFAULT_CCFG_CCFG_PROT_31_0 // 0x50003FF0
    default_CCFG_CCFG_PROT_63_32,// 0x50003FF4
    DEFAULT_CCFG_CCFG_PROT_95_64、// 0x50003FF8
    DEFAULT_CCFG_CCFG_PROT_127_96、// 0x50003FFC
    };
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Dave。

    要清楚一点、您也不会修改或重建 driverlib?  是否指“cc26xxware_2_23_02_16941”组件?

    另一件事是、对于故障情况、您能否显示 VIMS STAT 和 CTL 寄存器值?  在 CCS 寄存器视图中、这些寄存器与 AON_RTC 寄存器类似。

    谢谢、
    Scott

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

    您好、Scott -

    不可以、我们在 CCS 中(有意)构建的唯一内容是我们的应用和 BLE 堆栈应用。

    以下是发生定时器故障时的 VIMS 寄存器:

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

    您好、Dave、

    好的,感谢您的介绍,感谢您发送的其他信息。 这些寄存器值符合预期。

    我们一直在尝试通过我们目前的计时压力测试来重现故障,但到目前为止尚未发现任何故障。  测试将在两个电路板上持续一夜运行。 我们正在尝试确定您的应用程序在配置和计时方面的独特之处,这需要增加比较裕度。

    如果您能够向我们发送.out 文件、该文件可能有助于我们了解在使用编译器优化方面是否存在不同的内容。

    谢谢、此致、
    Scott

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

    您好、Dave、

    再提出一个请求。  对于您看到应用程序停止的情况、能否发布显示所有 AON_RTC 寄存器值的屏幕截图?

    谢谢、
    Scott

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

    您好、Scott -

    我添加了 AON_RTC 寄存器的屏幕截图、以及出现问题时系统中任务和时钟的状态。  在它处于断开状态后、允许系统运行、然后暂停它只会导致 RTC 的 SEC 和亚秒寄存器发生更改;一旦我们断开、其他寄存器(包括 CH0CMP)都不会更改。

    这一问题对我们来说也很严重。  有时每运行几分钟就会发生一次、而在其他时间、几周内也不会发生。  在今天重新创建时、设备首次运行了半小时、没有问题。  然后、我使用了不同的 BLE 器件与进行数据交换、它在0x61秒内失败(如 AON_RTC.CH0CMP 寄存器所示)。

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

    您好、Dave、

    好的、再次感谢。

    当‘D‘M停转时,您是否可以附加 Hwi 模块的 ROV 屏幕截图,特别是“绑定”和“模块”选项卡?

    此外,我还想知道您如何决定将比较裕度值从“4”更改为“6”。  您是否在“5”时看到故障?

    谢谢、
    Scott

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

    您好、Scott -

    Hwi 选项卡的快照如下。  否、我们从未尝试过比较裕度为5。  此外、我有我们客户的权限向您发送我们的.out 文件。

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

    您好、Dave、

    感谢您的发送。  在模块视图中、ROV 的红色指示通常意味着读取/解释该字段时出错。  除了红色框之外是否显示了任何文本?

    或者、如果您将鼠标悬停在其中一个上、是否有弹出消息?  

    如果在应用程序仍在运行时启动应用程序、运行并停止、您是否仍然看到这些字段的错误指示?  

    如果您在 ROV 中单击 BIOS 模块并选择扫描错误、指示什么?

    谢谢、
    Scott

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

    大家好、Scott、我在本主题的早期部分与 Alan 一起进行了介绍。 红色方框上显示的文本为"获取 Hwi 堆栈信息时出错!"。 BIOS ROV 中的错误消息扫描重复了几次。 当应用程序运行正常时、也会显示这些消息。

    谢谢、

    Hector

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

    在给我的一封私人邮件中、你问"我想与你澄清的另一件事是:如果你已经检查 RTC 的计数速率是你所期望的。 例如、如果您在 CCS 中查看秒数、并运行 X 秒并停止、那么秒数中是否会出现 X 的预期增量?"。

    是的。 出现问题后、如果我暂停 CCS 调试器中的执行、请记下 AON_RTC.SEC 的值、让执行恢复60秒、然后再次暂停、则 SEC 寄存器中的值已前进0x3C。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    作为结束该线程的后续步骤…

    在进行根本原因分析后,发现了精确的定时方案,其中比较裕度值“4”可能不够。  但是,比较裕度值“6”可以避免这一问题。  

    将使用错误 ID SYSBIOS-383跟踪此问题的修复程序