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**** 2511985 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/999403/msp430fr6989-a-question-about-the-device-library

器件型号:MSP430FR6989

关于 MSP430FR6989ESI 驱动器、

初始化 esiConfig ();当滞留在 ESI_CalibrateInternalOSCFREQ (ESIOSC_DEFAULT)上时;2.91.13.01器件库用于具有2.00.00.16的器件库。在"static uint16_t measureESIOSC (void)"后面发现的器件库不相同。这是库问题或器件问题。

这是在2.91.13.01中

静态 uint16_t measureESIOSC (void)

uint16_t temp;

//这条和下一条指令实现了一个 clear->Set ESICLKGON 位。
ESIOSC &=~(ESICLKGON);

//这将开始测量。
ESIOSC |= ESICLKGON + ESIHFSEL;

//获取计数器值,当测量尚未完成时,ESICNT3
//值为0x01
操作

temp = ESICNT3;
} while (temp = 0x01);

//停止 ESIOSC 振荡器
ESIOSC &=~(ESICLKGON);

//返回计数器值 ESICNT3
返回温度;

这位于 2.00.00.16中

静态 uint16_t measureESIOSC (void){

//uint16_t temp;

//这条和下一条指令实现了一个 clear->Set ESICLKGON 位。
ESIOSC &=~(ESICLKGON);

//这将开始测量。
ESIOSC |= ESICLKGON + ESIHFSEL;

//获取计数器值,当测量尚未完成时,ESICNT3
//值为0x01
while (ESICNT3=1);

//停止 ESIOSC 振荡器
ESIOSC &=~(ESICLKGON);

//返回计数器值 ESICNT3
返回(ESICNT3);

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

    您好!

    让我来看看这个。

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

    等待您的回复,谢谢

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

    很抱歉、我花了一些时间尝试找到有关此行为的解释。  不幸的是、我无法跟踪任何知道 driverlib 更改历史记录的人、直到2.00.00.16。  我在发行说明中找到了一条关于修复"返回值为0"的评论。  

    我编译了该函数的两个版本并查看了反汇编。  从功能上讲、它们看起来是一样的(等待 ESICNT3不等于1。

    那么、当代码看起来挂起并且您暂停调试器时、PC 是什么汇编代码?  可能会拍摄一张屏幕截图吗?  您能否打开寄存器视图来检查 ESICNT3寄存器并查看其值是多少?

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

    这就是使用2.91.13.01 ESICNT3= 0x00DE.无法退出循环的方法。

    2.00.00.16 ESICNT3 x0093 = 0。它 可以退出循环

    2.91.13.01返回"temp"。 "temp"仅由 ESICNT3在"do while"中分配。    2.00.00.16是 ESICNT3的直接输出

    您可以将程序刻录到开发板上并对其进行调试。

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

    我实际上测试了两个版本、两个版本都没有挂起。  这是我使用的代码。

    #include "driverlib.h"
    #include <stdint.h>
    
        uint16_t measureESIOSC(void);
        uint16_t measureESIOSC_OLD(void);
    int main(void) {
    
        WDT_A_hold(WDT_A_BASE);
    
        PM5CTL0 &= ~LOCKLPM5;
        P1DIR = BIT0;
        P1OUT = 0; // OFF LED
    
        measureESIOSC();
        measureESIOSC_OLD();
    
        P1OUT |= BIT0; // TURN ON LED TO SHOW CODE MADE IT ALL THE WAY
        while(1);
    }
    
    // This is in 2.91.13.01 (Latest version)
     uint16_t measureESIOSC(void)
    
     {
    
         uint16_t temp;
    
         // This and next instruction realizes a clear->set ESICLKGON bit.
         ESIOSC &= ~(ESICLKGON);
    
         // This starts measurement.
         ESIOSC |= ESICLKGON + ESIHFSEL;
    
         _no_operation();
    
         // Get counter value, when measurement has not finished yet, ESICNT3
         // value is 0x01
         do
         {
             temp = ESICNT3;
         } while(temp == 0x01);
    
         // Stop ESIOSC oscillator
         ESIOSC &= ~(ESICLKGON);
    
         // returns counter value ESICNT3
         return temp;
     }
    
    
     //This is in  2.00.00.16
     uint16_t measureESIOSC_OLD(void){
    
         //uint16_t temp;
    
         // This and next instruction realizes a clear->set ESICLKGON bit.
         ESIOSC &= ~(ESICLKGON);
    
         // This starts measurement.
         ESIOSC |= ESICLKGON + ESIHFSEL;
    
         // Get counter value, when measurement has not finished yet, ESICNT3
         // value is 0x01
         while(ESICNT3==1);
    
         // Stop ESIOSC oscillator
         ESIOSC &= ~(ESICLKGON);
    
         // returns counter value ESICNT3
         return (ESICNT3);
     }