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.

[参考译文] MSP430F5529:MSP430F5529:如何在 RTOS 上创建计时器

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1180184/msp430f5529-msp430f5529-how-can-i-create-a-timer-on-rtos

器件型号:MSP430F5529
Thread 中讨论的其他器件: MSP430G2553SYSBIOS

尊敬的所有人:

我希望0.3µs μ s 将 GPIO 变为高电平或低电平。

那么 、如何在 RTOS 上创建一个计时器、并且周期大约为0.3µs μ s?  

谢谢。

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

    对于如此短的时间范围、RTOS 的使用无关紧要。 硬件计时器(和输出模块)可以以常规方式执行任务。

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

    您好、Zheng、

    我同意 David 的说法、如果这是您唯一的要求、则 RTOS 会增加您不需要的大量开销。

    请参阅以下示例代码、了解如何使用 MSP430F55x 上的计时器中断(非 RTOS)切换 GPIO: https://dev.ti.com/tirex/explore/node?node=A__AOV7.th6jm.8lJ4fI8h9Hg__msp430ware__IOGqZri__LATEST

    此致、
    Brandon Fisher

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

    大家好、

    您的意思是不能在具有 MSP430F5529的 TI-RTOS 上创建大约0.3µs μ s 的周期?
    如果我想创建、您建议使用非 RTOS 系统? 如上例所示?

    谢谢。

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

    RTOS 事件的分辨率不会比其节拍率更好。 速度从未如此快。

    节拍率是所需的时间分辨率与每个节拍所需的保养时间之间的平衡。 其中包括保存当前状态(所有寄存器)、查找要运行的下一个任务以及恢复该任务状态。 将节拍率设置得太高、您没有时间执行任务。

    在 MSP430上、我不会使用大于1KHz 的节拍率。

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

    尊敬的 David:

    感谢您的建议。

    但是、如果我想控制需要生成不同波形来改变光颜色的光。  

    波形、如下图所示。

    可以创建还是不可以创建?  如果可以、我应该怎么做?

    谢谢。

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

    以常规方式调整 GPIO 输出。 无需 RTOS。 您是否出于其他原因需要 RTOS、或者您只是假设 RTOS 是实现此目的的方法?

    借助20MHz MCLK、您可以实现50ns 的延迟分辨率。 要生成准确的时间、需要使用汇编语言。 您可以在 C 语言中执行该操作、但延迟将取决于编译器。 延迟本身不是_delay_cycles (),而是用于切换输出的代码的其余部分。

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

    尊敬的 David:

    我们需要 TI-RTOS、因为我们的项目始于 RTOS、并在1年多前继续运行。

    现在、我们添加了需要生成不同波形以进行控制的新光传感器。

    那么、我想知道 RTOS 上的 MSP430F5529能够 实现它吗?

    大约800kHz PWM、每个周期之后需要更改下一个周期的占空比。   

    我找不到任何描述 RTOS 系统速度限制的文档。

    谢谢。

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

    您好、Zheng、

    如果您 确实需要基于 RTOS 的解决方案 、仍有用于 MSP430的 TI-RTOS、但不再支持: http://downloads.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/tirtos/index.html

    此处还列出了许多用于 MSP430的第三方 RTOS 选项: https://www.osrtos.com/

    此致、
    Brandon Fisher

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

    大家好、

    我可以使用 PWM + DMA 在 TI-RTOS 系统上生成这些波形吗?

    如果可以、我应该怎么做?

    谢谢。

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

    您好、Zheng、

    您是否尝试更改 PWM 占空比或频率?

    TI-RTOS 用户指南(可在 C:/ti/tirtos_msp43x_上找到 默认情况下、在 Windows 上为/docs/Users_Guide.pdf)第5.9节给出了 PWM 的相关 API 调用。 以及设置和配置步骤。

    如果您只是尝试更改光强度,则可以在初始设置后使用 PWM_setDuty()进行更改。 不过、我看不到通过 DMA 实现这一点的任何支持、因此您必须在软件中进行更新、这可能不完全符合您的更新要求。

    此外、根据 PWM 参数结构的说明、PWM 驱动器仅支持以微秒为单位的 PWM 周期整数值、因此您可能还需要在此处发挥创意。  

    此致、
    Brandon Fisher

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

    您好、Brandon、

    1.是的。 我想在每个脉冲之后更改 PWM 占空比。

    2. 根据您的建议、DMA 不支持 PWM。 我可以使用 SPI+DMA 生成高于特殊波形的值吗? 我想控制连接  ws2812b neopixels 等接口的 LED。 如果这种方法可以实现、我应该如何在 TI-RTOS 系统上进行设置?  

    谢谢。

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

    快速搜索(如果可以的话...) 为 MSP430和 WS2812打开 Github 上的代码。

    github.com/.../MSP430-NeoPixel-WS2812-Library

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="259746" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1180184/msp430f5529-msp430f5529-how-can-i-create-a-timer-on-rtos/4450004 #4450004"]我是否可以使用 SPI+DMA 生成上述特殊波形?

    David 链接的 Github 项目是:

    a: 对于 MSP430G2553而不是 MSP430F5529、因此需要移植以允许外设差异

    b.不使用 DMA。 代码禁用生成 SPI 波形的中断

    找到 了在 TI MSP430 5529 Launchpad 上运行并使用 SPI+DMA 的 github.com/.../WS2812。

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

    切斯特、您好!

    感谢您的建议。

    但我想以 TI-RTOS 系统为基础。 这些示例位于 Nonos 上。

    我使用 SPI API、但它将在 SPI_TRANSFER (SPI_MASTER、&spiTransaction) API 上停止。

    我应该如何解决它?

    ------------------

    在.cfg 中:

    var hwiParams = new halHwi.Params();

    /*用于 SPIUSCI 驱动程序的 DMA Hwi *
    hwiParams.arg = 0;
    halHwi.create (50、"&MSP_EXP430F5529LP_isrDMA"、hwiParams);

    ----------------------

    我的代码:

    /* XDCtools 头文件*/
    #include
    #include

    /* BIOS 头文件*/
    #include
    #include

    /* TI-RTOS 头文件*/
    #include
    //#include
    #include

    /*板头文件*/
    #include "Board.h"
    #include "driverlib.h"

    #define TASKSTACKSIZE 2048
    Task_StructSPI SPI_MASTER_taskStruct;
    char SPI_MASTER_taskStack[TASKSTACKSIZE];

    空 SPI_MASTER_taskFxn (UARg arg0、UARg arg1)

    SPI_Handle SPI_MASTER;
    SPI_Params SPI_MASTER_Params;
    /*创建 I2C 以供使用*/
    SPI_PARAMS_INIT (&SPI_MASTER_PARAMS);
    SPI_MASTER_PARAMS.transferMode = SPI_MODE_CALLACK;
    SPI_MASTER_PARAMS.MODE = SPI_MASTER;
    SPI_MASTER_PARAMS.bitrate = 1000000、
    SPI_MASTER_PARAMS.dataSize = 16;
    //spi_master_Params.frameFormat = SPI_POL0_PHA0;
    SPI_MASTER = SPI_OPEN (Board_SPI0、&SPI_MASTER_PARAMS);
    if (SPI_MASTER =NULL) System_abort ("初始化 SPI\n"时出错);
    否则为 System_printf ("SPI 已初始化!\n");
    system_flush();

    uint8_t txBuffer[16]={0x1、0x0、0x0、0x0、0x1、 0x0、0x0、0x0、
    0x1、0x1、0x1、0x0、0x1、 0x1、0x1、0x0};
    SPI_Transaction spiTransaction;
    spiTransaction.txBuf = txBuffer;
    spiTransaction.rxBuf =空;
    spiTransaction.count = 16;

    while (1){
    SPI_TRANSFER (SPI_MASTER、&spiTransaction);
    System_printf ("SPI 总线传输\n");
    system_flush();

    void main (void)

    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    Board_initSPI();

    //构造心跳任务线程
    Task_Params taskParams;
    Task_Params_init (&taskParams);

    //i2c 主器件
    taskParams.arg0 = 1000;
    taskParams.STACKSIZE = TASKSTACKSIZE;
    taskParams.stack =&SPI_MASTER_taskStack;
    Task_construction (&SPI_MASTER_taskStruct,(Task_Functr) SPI_MASTER_taskFxn,&taskParams,NULL);

    /*启动 BIOS */
    BIOS_start();

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

    切斯特、您好!

    感谢您的建议。

    但我想以 TI-RTOS 系统为基础。 这些示例位于 Nonos 上。

    我使用 SPI API、但它将在 SPI_TRANSFER (SPI_MASTER、&spiTransaction) API 上停止。

    我应该如何解决它?

    ------------------

    在.cfg 中:

    var hwiParams = new halHwi.Params();

    /*用于 SPIUSCI 驱动程序的 DMA Hwi *
    hwiParams.arg = 0;
    halHwi.create (50、"&MSP_EXP430F5529LP_isrDMA"、hwiParams);

    ----------------------

    我的代码:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /* XDCtools Header files */
    #include <xdc/std.h>
    #include <xdc/runtime/System.h>
    /* BIOS Header files */
    #include <ti/sysbios/BIOS.h>
    #include <ti/sysbios/knl/Task.h>
    /* TI-RTOS Header files */
    #include <ti/drivers/GPIO.h>
    //#include <ti/drivers/SDSPI.h>
    #include <ti/drivers/SPI.h>
    /* Board Header file */
    #include "Board.h"
    #include "driverlib.h"
    #define TASKSTACKSIZE 2048
    Task_Struct spi_master_taskStruct;
    Char spi_master_taskStack[TASKSTACKSIZE];
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    您好、Zheng、

    您在 SPI 输出上从未看到任何流量吗?

    如果您在 System_printf()调用中设置了断点,您是否遇到过该断点?

    我看到您调用了 Board_initSPI (),我假设这是基于 MSP_EXP430F5529LP_initSPI ();API?

    此致、
    Brandon Fisher

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

    您好、Brandon、

    1. 您的 SPI 输出上是否从未见过任何流量? >>否 SPI 时钟和 SPI MOSI 引脚不输出任何数据。

    2. 如果您在 System_printf()调用中设置了断点,您是否遇到过该断点?  >>否 它将保持 SPI_TRANSFER (SPI_MASTER、&spiTransaction);

    3.是的。  #define Board_initSPI  MSP_EXP430F5529LP_initSPI

    谢谢。

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

    您好、Zheng、

    您能尝试更改一下

    Fullscreen
    1
    spi_master_Params.transferMode = SPI_MODE_CALLBACK;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    更改为

    Fullscreen
    1
    spi_master_Params.transferMode = SPI_MODE_BLOCKING;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    根据 TI-RTOS 用户指南:

    此致、
    Brandon Fisher

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

    您好、Brandon、

    我更改为 SPI_MODE_BLOCKING、这是可以的。 系统不会保持  SPI_TRANSFER (SPI_MASTER、&spiTransaction)。

    无法设置 SPI_MODE_CALLAR 是否是 RTOS 限制、对吧?

    谢谢。

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

    您好、Zheng、

    [引用 userid="259746" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1180184/msp430f5529-msp430f5529-how-can-i-create-a-timer-on-rtos/4455178 #4455178"]

    无法设置 SPI_MODE_CALLAR 是否是 RTOS 限制、对吧?

    [/报价]

    我找不到任何文件记录了 TI-RTOS 中的已知限制、但您的代码结构似乎更适合阻止模式。 如果您使用回调模式、while (1)循环将尝试启动其当前写入的多个 SPI 传输。

    在回调模式下、您还必须具有已定义的回调函数。 根据 TI-RTOS 用户指南:

    我认为如果未定义、此参数将默认为 NULL。 我不确定在带有 NULL 函数指针的回调模式下使用此函数会导致什么确切的行为、但看到您的代码挂起不会超出可能的范围。  

    此致、
    Brandon Fisher