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.
尊敬的所有人:
我希望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 上的代码。
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);
----------------------
我的代码:
/* 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]; Void spi_master_taskFxn(UArg arg0, UArg arg1) { SPI_Handle spi_master; SPI_Params spi_master_Params; /* Create I2C for usage */ SPI_Params_init(&spi_master_Params); spi_master_Params.transferMode = SPI_MODE_CALLBACK; 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("Error Initializing SPI\n"); else System_printf("SPI Initialized!\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 = NULL; spiTransaction.count = 16; while(1) { SPI_transfer(spi_master, &spiTransaction); System_printf("SPI Bus transfer\n"); System_flush(); } } void main (void) { /* Call board init functions */ Board_initGeneral(); Board_initGPIO(); Board_initSPI(); //Construct heartBeat Task thread Task_Params taskParams; Task_Params_init(&taskParams); //i2c master taskParams.arg0 = 1000; taskParams.stackSize = TASKSTACKSIZE; taskParams.stack = &spi_master_taskStack; Task_construct(&spi_master_taskStruct, (Task_FuncPtr)spi_master_taskFxn, &taskParams, NULL); /* Start BIOS */ BIOS_start(); }
您好、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、
您能尝试更改一下
spi_master_Params.transferMode = SPI_MODE_CALLBACK;
更改为
spi_master_Params.transferMode = SPI_MODE_BLOCKING;
根据 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