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.

[参考译文] MSP430FR6989:功能时序

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/897558/msp430fr6989-timing-of-functions

器件型号:MSP430FR6989

尊敬的:  

对于一个项目、我希望为函数花费多长时间。 为此、我想使用 TimerA TA0和捕获。 但是、在浏览完文档后、我想知道是否可以使用内部"消息"捕获计时器。  在数据表(www.ti.com/.../msp430fr6989.pdf 第87页、页面底部的表格)中、我不太清楚如何执行此操作。 它指出了可使用的端口引脚、但我(显然)对此不感兴趣。  
因此、我想、如果我能够写入 TAxIV 寄存器、只需自行设置中断标志、但我完全不知道它是否起作用(我不是真的这么认为、但我不知道原因)、我可以使用它来捕获计时器。  

我还查看了示例代码、但在那里它们使用 ACLK 作为输入信号。 因此、这也没有太多用途。  

此致、并提前感谢您、  
Yannick  

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

    您好、 Yannick、

    如器 件系列用户指南(www.ti.com/.../slau367)第25.3.5节 TAxIV 寄存器所述、TAxIV 寄存器为只读寄存器、不能由软件写入。

    Srinivas

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

    如果您想合成一个定时器中断、只需设置 CCIE 和 CCIFG:

    > TA0CCTL1 |= CCIE | CCIFG;

    我不清楚您为什么要这么做、或者更一般而言、您想要使用计时器捕获来实现什么。 您是否正在尝试对外部事件计时?

    您可以使用捕获[参考数据表(SLAS789D)表6-11]来触发 DMA、从而将 CCR 保存在数组中。

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

    您好 Srinivas、  

    是的、我错过了这个。 感谢您指出这一点。

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

    尊敬的 Bruce:  

    为了明确我要做的事情:我希望非常准确地计时一个函数。 我的 CPU 以16MHz 的频率运行、SMCLK (我将用于 TimerA)也以16MHz 的频率运行。 我的想法是在函数开始和结束时"读取"计时器值。 我认为实现这一目的的最佳方法是捕捉吗?  

    我现在还找到了该部分。 25.2.4.1.1.其中规定:
    25.2.4.1.1软件启动的捕获

    捕获可由软件启动。 CMx 位可以设置为在两个边沿上进行捕获。 然后、软件设置 CCIS1 = 1并切换 CCIS0位以在 VCC 和 GND 之间切换捕捉信号、每当 CCIS0更改状态时、就会初始化捕捉:
    MOV #CAP+SCS+CCIS1+CM_3、&TA0CCTL1;设置 TA0CCTL1、同步。 捕捉模式;捕捉输入的两个边沿上的事件触发。
    XOR #CCIS0、&TA0CCTL1;TA0CCR1 = TA0R

    注意:通常情况下、软件启动的捕获、在捕获模式下更改捕获输入可能会导致意外的捕获事件。 对于这种情况、无需在 VCC 和 GND 之间切换捕捉输入、从而禁用捕捉模式。

    但是、我不知道如何做到这一点、我想这样:

    对于初始化:

    TA0CCTL1 = CM_3 | CCIS_1 | SCS | CAP | CCIE; // setting up like in the datasheet, but with the interrupt
    TA0CTL = TASSEL__SMCLK | MC__CONTINUOUS; // setting the timer up with the SMCLK

    为了便于使用、这意味着捕获计时器:

    TA0CCTL1 ^= CCIS0 // TA0CCR1 = TA0R, toggling the CCIS0 bit to switch between Vcc and GND

    然后读取捕获寄存器?

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

    直接读取 TA0R 似乎更简单/更快。 (这就是我所做的。)

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

    我能不能像这样做:  

    unsigned int time = TA0R;  

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

    是的、这应该可以正常工作。

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

    看着捕获模块,我看不到最明显的东西...
    谢谢:)

    不过、另一个小问题是、如果我这么做、那么每次 TA0R 更新(因此每个时钟周期)时、计时器的值不会使用新的 TA0R 不断更新?  
    我如何才能使计时器的值保持恒定?  我可以使用易失性的方法吗?

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

    如果 SMCLK=MCLK (你的情况),你会期望每次读取 TA0R 时得到不同的结果--由于指令的成本,可能会被4-5分隔。 这是一个特性;我所做的有效操作是"start=TA0R;func ();end=TA0R;diff = end-start;"如果 TA0R 周期到0、无符号减法将正确执行。

    请记住、您只有16位的范围(对于捕捉解决方案也是如此)。 在函数限制为6556/16MHz=4.096ms 的简单情况下。 如果这还不够、您可以应用分频器(ID 和 TA0EX0)以换取距离分辨率。

    [编辑:固定措辞]

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

    您好、Bruce、  

    为了进行测试、我将其放入一些代码中并通过调试器进行测试。 代码如下:  

    unsigned int 计时器;
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    char num = 0x54;
    unsigned char * ptr =#
    while (1){
    SEND_DATA (num、2);//其他位置的方法
    计时器= TA0R;
    num++;
    while (num < 0x21 || num > 0x7D){
    Num = 0x22;
    }
    } 

    计时器和时钟等都在其他地方进行了正确的初始化。 现在、当我在调试器中查看"timer"变量时、它的值在 wile 循环内多次更改、尽管每次经过时它被分配一次
    但是、如果我使计时器变得易失性、它不会这样做。  

    此致

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

    我的第一个猜测是、由于未使用"计时器"、优化器+调试器会产生某种幻象。 在我给出的示例中,使用了所有变量(其中一个为非阶段(:-)))。

    对于您的情况、使计时器"易失性"不会伤害任何东西、因此您也可以使用它。