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.

[参考译文] MSP432P401R:使用计时器轮询数据3秒

Guru**** 2535750 points
Other Parts Discussed in Thread: ENERGIA

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/579923/msp432p401r-polling-data-for-3-seconds-using-a-timer

部件号:MSP432P401R
主题中讨论的其他部件:Energia

我正在按照说明校准传感器的2个时钟。 我一直坚持使用I2C从传感器的FIFO数据寄存器轮询数据的步骤,时间正好为3秒。 我知道这样做的最佳方式是使用MSP432的计时器之一,但我没有足够的经验来实现这一点。 如有任何建议,我们将不胜感激!

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

    您好,

    我想帮助您解决这个问题,但首先我想提出一些澄清问题。  我从您的陈述中假设您的传感器使用I2C通信来接收某种校准数据。  我不熟悉要求在您建议的任何确切时间内进行通信的应用程序。  您能否为我提供有关您正在使用的传感器的更多信息?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我会做一些类似Energia/Arduino millis ()设施的事情。 将Systick设置为1ms (如果这提供了足够高的精度)中断,在ISR中,增加一个32位无符号变量。 如果您在程序中的其他位置需要此类计时功能,则此功能非常适合。

    在I2C发送数据例程中,请注意数据流开始时的变量,并在计时器增加3000时停止。

    或者,设置一个3秒中断的计时器,并让ISR设置一个标志,只需在数据发送开始时启动计时器,并不断轮询该标志。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然,我正在使用的是一个名为ADUX1020的ADI传感器。 我需要校准设置采样计时和互联网电源状态机的时钟(32kHz),以及控制数据采集计时的另一个内部时钟(32MHz)。 以下是从部件数据表校准32kHz时钟的说明。 我正在执行步骤3。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因为你必须投票,所以我的任何一个建议都是可行的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,我遇到的问题是我没有使用计时器的经验,所以我不知道如何实施计时器。 下面是我的当前代码。

    e2e.ti.com/.../4048.codeCCS.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /* TI版权样板被切断*//***************************************************************************************************************
    
    * MSP432 Systick -闪烁LED程序
    *
    说明:此程序将使用Systick模块使LED闪烁
    *一秒钟。 设置后,应用程序将进入LPM3
    *模式,并且仅唤醒以切换GPIO引脚。
    *
    **此程序无限运行,直到用户手动停止。
    *
    ** MSP432P401
    * -----------
    * /|\\| |
    * || |
    * --|RST WFP 1.0 |-->WFP 1.0 LED
    * | |
    * | |
    * | |
    * | |
    * | |
    *
    *作者:Timothy Logan
    ******************************************************************************* /*
    DriverLib包括*/
    #include "driverlib.h"
    
    /*标准包括*/
    #include <stdint.h>
    
    #include <stdbool.h>
    
    int main(void){
    
    /*停止监视程序*/
    MAP_WDT_A_HoldTimer();
    
    /*将GPIO配置为输出*/
    MAP_GPIO_setAsOutputPin (GPIO端口P1,GPIO _PIN0);
    
    /*配置Systick在150万时触发(MCLK为3MHz,因此这将产生
    *每隔0.5秒切换一次)*/
    MAP_Systick_enableModule();
    MAP_Systick_setPeriod (150万);
    MAP_Interrupt_enableSleepOnIsrExit();
    MAP_Systick_enableInterrupe();
    
    /*启用主中断*/
    MAP_Interrupt_enableMaster();
    
    同时(1)
    {
    MAP_PCM_GotoLPM0();
    }
    }
    
    作废Systick_Handler(void){
    
    MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1, GPIO_PIN0);
    }
    

    如果您使用DriverLib,只需按照Systick的示例操作,并根据时钟和粒度更改频率。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /*******************************************************************************
    * MSP432 Systick -闪烁LED程序
    *
    说明:此程序将使用Systick模块使LED闪烁
    *一秒钟。 设置后,应用程序将进入LPM3
    *模式,并且仅唤醒以切换GPIO引脚。
    *
    **此程序无限运行,直到用户手动停止。
    *
    ** MSP432P401
    * -----------
    * /|\\| |
    * || |
    * --|RST WFP 1.0 |-->WFP 1.0 LED
    * | |
    * | |
    * | |
    * | |
    * | |
    *
    *作者:Timothy Logan
    ******************************************************************************* /*
    DriverLib包括*/
    #include "driverlib.h"
    
    /*标准包括*/
    #include <stdint.h>
    
    #include <stdbool.h>
    
    volatile UINT32_t Tick;
    
    int main(void){
    
    UINT32_t开始时间;
    Int numReads =0;
    
    /*停止监视程序*/
    MAP_WDT_A_HoldTimer();
    
    /*将GPIO配置为输出*/
    MAP_GPIO_setAsOutputPin (GPIO端口P1,GPIO _PIN0);
    
    /*配置Systick在3000时触发(MCLK为3MHz,因此这将产生
    *每1毫秒切换一次)*/
    MAP_Systick_enableModule();
    MAP_Systick_setPeriod (3000);
    MAP_Systick_enableInterrupe();
    
    /*启用主中断*/
    MAP_Interrupt_enableMaster();
    
    StartTime =勾号;
    
    而((Tick - StartTime < 3000)//减法在此处非常重要,因为滚动
    {
    IF (isMySensorReady()== true)
    {
    ReadSensor();
    numReads++;
    }
    }
    //计算传感器时间
    }
    
    void Systick_Handler(void){
    
    tick ++;
    }
    

    回复我自己的帖子

    您可能希望执行如下操作:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢Keith! 现在我尝试将此应用到我的代码中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经尝试实施了这样的代码

    但由于意外的中断,我一直被困在这里。 有什么办法解决这个问题的想法吗??

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您尚未在中断表中声明中断处理程序。 查看Systick示例项目。 检查Startup_XXXXX.c文件
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我注意到的其他几件事。  我查找了该部件的数据表,我认为820Hz设置需要0x0C,而不是0x1c发送给它。

    您的设备运行速度似乎是12MHz,而不是3MHz。  这意味着MAP_Systick_setPeriod(3000)是0.25 毫秒,而不是示例中的1毫秒。  然后,循环将以0.25ms/Tick或750ms的速度运行到3000Ticks (我想您需要3秒的数据捕获),因此应该需要MAP_Systick_setPeriod(1.2万)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的帮助,John和Keith!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢Keith帮助我回答这个问题!!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    来自Arduino的世界,有时有像millis这样的东西真的很好。