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:CC2541

Guru**** 2558250 points
Other Parts Discussed in Thread: CC2541

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/583423/compiler-cc2541-cc2541

部件号:CC2541

工具/软件:TI C/C++编译器

大家好!

只需在此处输入有关我的问题的信息即可。

我在输入捕获模式下初始化计时器1通道3 (P0_7),如下所示:

PERCFG |= BV(6);//TIMER 1备用2配置

P2DIR =(P2DIR和~0xC0)| 0x80);//为计时器1指定优先级

P0SEL || BV (7);//将端口0引脚7设置为外围设备

P0DIR || BV (6);//将P0_6设置为输出并与P0_7输入中断同步...

T1CCTL3 |= BV(6);//在计时器1通道3处启用中断

T1CCTL3 |= BV(1)| BV(0);//在所有边缘捕获。

P0IEN |= BV (7);//在P0_7处启用中断。我不确定这是否是冗余声明。

T1IE = 1;//在计时器1处启用中断

然后在"hal_key.c",我为端口0编辑了ISR函数,如下所示:

HAL_ISR_FUNCTION (halKeyPort0Isr,t1_vector)

HAL_ENTER_ISR();

IF (P0IFG || BV (7))

如果(P0_6 == 1){P0_6 = 0;}否则{P0_6 = 1;}//测试代码...切换引脚输出,应与P0_7外部信号同步...

}

P0IFG = 0;//重置标记

HAL_KEY_CPU_PORT_0_IF = 0;//重置P0IF

clean_sleep_mode();

HAL_EXIT_ISR();

返回;

}

我使用示波器检查P0_7的外部输入中产生的PWM,然后与P0_6输出脉冲进行比较。

我假设P0_6应该与P0_7同步,但在这两个信号之间存在不必要的稳定高/低信号。

这不适合我的应用,因为我要通过使用中断获得外部输入的周期和占空比(T1CC3L:T1CC3H),或者不需要? 是否只需定期直接阅读登记簿?

请在此提供一些关于我的情况的见解。

我使用"simpleBLEperipheral"样本作为基础项目。

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    附加信息。
    当我将ISR功能内部的条件从IF (P0IFG |= BV (7))更改为IF (P0IFG && BV (7))时,我设法滤除输出中的长高信号。现在问题是长低信号仍然很明显。 我得到的是10.1万000101010100000101010000...而0.0101万而不1.01万不是0.0101万是常规1万常规的10.1010101亿脉冲...等等...你得到的想法是:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Robert:

    CC2541用户指南中的“9.10 计时器1中断”一节指出: "CPU中断标志IRCON.T1IF也在清除计时器1源中断标志时设置,在设置相应的中断掩码位时,仍设置一个或多个计时器1源中断标志时设置。"

    尝试从:

    HAL_KEY_CPU_PORT_0_IF = 0;//重置P0IF

    至:

    T1IF = 0;

    还可以为T1中断例程使用单独的合适名称,例如Timer1_ISR,而不是halKeyPort0Isr。 可能不会更改任何功能,但它会使其更易读取。

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

    感谢您的回复。
    我已经应用了您的建议,但仍然是相同的行为,示波器中仍然显示较长的低信号。 我甚至将T1IF和P0IF设置为0,但仍然相同。

    是的,我将按照您的建议编辑我的代码。
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Robert,

    查看CC2541/43/44/45外设软件示例中的T1_CAP示例代码。 创建一个全新的ISR,并将按钮单独保留在ISR上。 同时禁用WFP 0.7 上的pin interrupt (pin中断)。

    以下是一个未经测试的粗略想法:

    #define T1STAT_CH3IF 0x08
    
    HAL_ISR_FUNCTION (Timer1_ISR, T1_Vector){
    HAL_ENTER_ISR();
    如果(T1STAT && T1STAT_CH3IF){
    P0_6 ^= 1;//切换WFP 0.6
    }
    //清除计时器1通道3中断标志。 清除中断的正确方法
    //标记只需为R/W0操作搜索数据表写入0。
    T1STAT =~T1STAT_CH3IF;
    clean_sleep_mode();
    HAL_EXIT_ISR();
    返回;
    } 

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

    Eirik先生,您好!

    我刚刚尝试了您的建议,很遗憾,信号输出恢复为不规则长高/低,与预期高/低信号混合。

    我现在尝试检查t1_cap示例。

    谢谢。

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

    这是我第一次看到并测试您推荐的t1_cap示例。
    尝试根据我的需要替换针脚分配,我注意到输出信号出现了问题。 当我将外部信号与切换引脚输出进行比较时,输入信号的周期和占空比似乎是每次中断时输出切换引脚的2倍。 此外,当输入信号的占空比增加时,输出信号的占空比没有变化。
    为什么会发生这种情况?
    在中断中编辑的进程仅为T1STAT =~T1STAT_CH0IF;P0_6 ^= 1;但仍有相同的行为......
    这是否正常?
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Robert:

    输入信号的频率是多少?

    通道输入引脚与内部系统时钟同步。 因此,输入引脚上的脉冲必须具有大于系统时钟周期的最短持续时间。 请参阅CC2541用户指南中的“电源管理和时钟”部分,了解系统时钟速度。

    您能否向我展示输入信号和输出信号的组合图解?

    在t1_cap示例中:

    • 输入只在下降边缘端捕获,因此预计WFP输出0.6 的占空比为输入信号的一半。
    • 预分频器设置为 除法器值32,以获得500 kHz的tickspeed。

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

    约1250Hz。 这是非常定期的。
    是的,我也考虑了这些因素(预计算器等),并将中断更改为上升和下降边缘以模拟输入信号。
    到目前为止,我不能提供我读数的图形表示,但我会尝试遵循....
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    就在这一刻,我尝试重新编译t1_cap。在PWM信号不一样之前。我想我可能错过了“两者”的边缘中断设置。 现在它在t1_cap示例方面运行良好,但在我的项目中还没有:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很好,那么应该可以在您的应用程序中修复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Eirik爵士又度过了美好的一天

    我刚尝试在我的应用程序中应用t1_cap的代码,但不幸的是,它仍然不能很好地工作。 与样本的清洁信号与输入同步不同,仍然存在杂散信号(长高/低)。

    我认为BLE功能会影响此计时器1的操作,但我还无法跟踪它。 请提供更多提示。

    谢谢。

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

    当我深入研究可能影响计时器1中断的函数时,我设法绕过了代码,方法是在OSAL.c注释出Hal_ProcessPoll()函数,并初始化LL_EXT_HaltDuringRf(LL_EXT_Halt_During_RF_disable)。
    现在输出信号与外部输入信号同步。 但仍需要确认哪些已在工作的职能部门将会影响我的计划。
    目前,我的问题是测量PWM (占空比和周期)。
    我知道我在下面使用的代码没有效率,因为我读取了一些不稳定的值:

    HAL_ISR_Function (Timer1_ISR,T1_Vector)

    T1STAT = 0;
    P0_6 ^= 1;
    如果(P0_6 == 1)

    TempPeriod =(uint16) T1CC3L;
    TempPeriod ||(uint16)(T1CC3H <<8);
    TempPeriod += TempDutyCycle;
    }
    否则

    TempDutyCycle =(uint16) T1CC3L;
    TempDutyCycle ||(uint16)(T1CC3H <<8);
    }
    返回;
    }

    我尝试了所有可用的预分频器(1,8,3.2128万),但读数仍然不稳定。
    我的外部信号约为820微秒,约为50 % 占空比,因此约为1210-1230 Hz1230 Hz。
    请就如何解决此问题给出提示。
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eirik爵士,您好!

    我成功处理了我的申请,我只想与您确认是否正确。

    HAL_ISR_Function (Timer1_ISR,T1_Vector)

    T1STAT = 0;
    P0_6 ^= 1;
    如果(P0_6 == 1)

    TempPeriod =(uint16) T1CNTL;
    TempPeriod ||(uint16)(T1CNTH <<8);
    T1CNTL = 0;
    T1CNTH = 0;
    }
    否则

    TempDutyCycle =(uint16) T1CNTL;
    TempDutyCycle ||(uint16)(T1CNTH <<8);
    T1CNTL = 0;
    T1CNTH = 0;
    }
    返回;
    }

    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Robert:
    通过注释出Hal_ProcessPoll(),您将禁用节电(allow_sleep_mode();在Hal_ProcessPoll中调用以允许睡眠)。 进入睡眠模式时,如果有足够的时间,设备通常会输入PM2,而在这些转换过程中,开机延迟和时钟变化可能是您观察的原因。

    您也可以尝试设置HCI_EXT_ClkDivOnHaltCmd (HCI_EXT_ENABLE_CLK_Divide_on_halt);而不是LL_EXT_Halt_During_RF_disable,以避免在无线电操作过程中更改时钟。 但是,由于CPU停止,这仍会延迟处理。
    e2e.ti.com/.../25.5216万
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eirik爵士,您好!

    感谢您的确认和参考。
    我认为我需要找到解决节能问题的解决方案,因为我的项目中仍需要该解决方案。 但是,由于只有允许睡眠模式功能是问题,我是否可以在不再使用计时器1时呼叫它? 我认为这是最恰当的做法。

    是,HCI_EXT_ClkDivOnHaltCmd ( HCI_EXT_ENABLE_CLK_Divid_on_halt );已在我的程序中初始化。

    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Robert:
    我想这会奏效。
    我想说禁用:
    HCI_EXT_ClkDivOnHaltCmd ( HCI_EXT_DISABLE_CLK_Divid_on_halt );
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eirik爵士,您好!

    当我宣布它为“禁用”时,我以为我错了。 感谢您的确认。

    关于我的工作周期和周期读数,我在T1CNTL和T1CNTH上阅读了。 下面是定时器1 ISR内的最新代码:

    T1STAT = 0;
    IF (P0_7 == 1)

    P0_6 = 1;
    TempPeriod =(uint16) T1CNTL;
    TempPeriod =(uint16)(T1CNTH << 8);
    T1CNTL = 0;
    T1CNTH = 0;
    }
    否则

    P0_6 = 0;
    TempDutyCycle =(uint16) T1CNTL;
    TempDutyCycle =(uint16)(T1CNTH <8);
    T1CNTL = 0;
    T1CNTH = 0;
    }
    返回;


    但寄存器中占空比和周期之间的比率与45 % - 50 % 占空比周围的预期值非常差(现在我的值低于预期值)。 我可能错过了什么?
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    可以吗?

    TempPeriod =(uint16) T1CNTL;

    TempPeriod ||(uint16)(T1CNTH <<8);

    TempDutyCycle =(uint16) T1CNTL;

    TempDutyCycle ||(uint16)(T1CNTH <<8);

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

    Eirik先生,您好!

    对不起,我错过了,我刚刚键入。 定时器1 ISR的最新代码如下:

    T1STAT = 0;
    IF (P0_7 == 1)

    TempPeriod =(uint16) T1CNTL;
    TempPeriod ||(uint16)(T1CNTH <<8);
    T1CNTL = 0;
    T1CNTH = 0;
    P0_6 = 1;
    }
    否则

    TempDutyCycle =(uint16) T1CNTL;
    TempDutyCycle ||(uint16)(T1CNTH <<8);
    P0_6 = 0;
    }
    返回;

    TempPeriod的值正常,但DutyCycle远低于预期值。 我很困惑为什么这是偶然的,我确实在获取周期后重置寄存器,因此16位计时器应该从0x0000开始,然后在检测到下降边缘时获取占空比。

    谢谢。

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

    我已经弄清楚了,我的Period/DutyCycle收购实际上没有问题。 我发送给客户端设备的通知已关闭。 我的工作周期的最后一位小数不会显示。
    现在,我将继续介绍I2C及更高的内容。 :D
    感谢您的时间和指导,先生。
    非常感谢。