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.

[参考译文] CC2541:当 SimpleBLEPeripheral 在后台运行时、Timer1通道的输出不稳定

Guru**** 2553450 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/575894/cc2541-unstable-output-from-timer1-channel-while-simplebleperipheral-runs-in-the-background

器件型号:CC2541

你(们)好

我正在执行 基于 SimpleBLEPeripheral 的项目。
我对该项目的更改只是对特性的少量调整。
从这个角度来看、一切都正常。

我使用 Timer1通道1来使用比较模式创建信号:"清除比较上的输出、设置为0"。

我设置所有寄存器、一切都好。 我使用示波器进行了检查、信号完全符合我的要求。
此消息的末尾介绍了我的设置。
我在函数中执行这些设置:

SimpleBLEPeripheral_Init

奇怪的问题如下。 如果在打开 Timer1并执行所有设置后、我进入一个不执行任何操作的无限循环(实际上阻断了 CPU)、则信号是完美的。

另一方面、如果我让 BLE 堆栈继续工作并执行它的操作、我会在示波器中看到 Timer1生成的信号变得不稳定、或者我可能会说不准确。
脉冲的长度会有所不同。

它就像 BLE 堆栈中的东西干扰 Timer1的运行。 如果我使用调试器中断程序的流程、则输出再次良好。

当然、我禁用 了 power_saving 宏、因此处理器不会进入任何睡眠模式。


以下是我的设置

PERCFG = 0x00;//所有位置都在备选1位置

APCFG = 0x00;//所有模拟禁用

P0SEL = 0x0C;//将端口0配置为 GPIO、引脚2、3是 Timer1的通道0和1
P0DIR = 0xFC;//端口0引脚 P0.0和 P0.1作为输入(按钮)、所有其他引脚(P0.2-P0.7)作为输出

P1SEL = 0;//将端口1配置为 GPIO
P1DIR = 0xFF;//所有端口1引脚(P1.0-P1.7)作为输出

P2SEL = 0x00;//将端口2配置为 GPIO,端口1的优先级无关紧要
P2DIR = 0x9F;//所有端口2引脚(P2.0-P2.4)作为输出、Port0优先级为:定时器1通道0–1

T1CTL =(T1CTL 和~(T1CTL_MODE | T1CTL_DIV))| T1CTL_MODE_MODUMO | T1CTL_DIV_32;

T1CCTL0 = T1CCTL1 = 0x24;//比较时清除输出,设置为0

//1MHz 时钟抖动20000倍(0x4e20)可得到50Hz
T1CC0L = 0x20;
T1CC0H = 0x4E;

//0x5DC = 1.5ms 脉冲

T1CC1L = 0xDC;
T1CC1H = 0x05;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ophirti Bentalyi、
    是否可以尝试在暂停时禁用 clk 分频? 在 simpleBLEPeripheral.c 中更改此项:
    HCI_EXT_ClkDivOnHaltCmd (HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT);
    更改为
    HCI_EXT_ClkDivOnHaltCmd (HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT);


    您已经知道、在 Timer1处于活动状态时 MCU 无法睡眠、但您仍可以激活节能和控制功耗模式。 如需更多信息、请参阅芯片用户指南的电源管理部分。 您需要确保器件在计时器运行时保持唤醒状态、然后使用以下命令将器件置于睡眠状态:
    (void) osal_set_event (hal_taskID、HAL_PWRMGR_HOLD_event);
    (空) osal_set_event (hal_taskID、HAL_PWRMGR_SAVE_EVENT);
    如果这应该无限期运行、我想禁用省电更容易。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢!

    这正是问题所在。
    将其更改为 HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT 后、信号稳定!