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.

[参考译文] LAUNCHXL-CC1350-4:多任务处理/中断

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

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1008807/launchxl-cc1350-4-multi-tasking-interrupts

器件型号:LAUNCHXL-CC1350-4
主题中讨论的其他器件:CC1350

大家好、TI 社区、

我正在使用 cc1350、我的应用涉及在 Code Composer 中使用多任务处理(线程/中断/计时器)(特别是、运行 adcbufcontinuous 示例代码并同时控制伺服电机)。 很遗憾、我没有找到这方面的示例代码。 如果我能在这里获得一些指导、那将会很好。  

感谢你能抽出时间。  

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

    SDK 中的示例通常是为了展示如何使用一个驱动程序或一个功能而编写的。 示例尽可能简单、以便尽可能易于阅读。 因此、我们没有太多示例说明如何同时执行多 项操作。 由于复杂性、这两种方法都使读取/理解变得更加困难。 我不同的方面是应该组合2个或3个驱动程序示例/功能、因为它 有很多选项。  

    您能不能更详细地描述一下您需要代码执行的操作、并且希望可以更轻松地向您指出不同的示例、您可能会发现这些示例对于您需要在代码中实现的不同操作非常有用。  

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

    感谢您的回复。  

    具体而言、我希望使用 cc1350的两个应用(仅使用一个微控制器)- 1. 要读取的 ADC 值并将其显示到 UART 中(我使用的是 adcbufcontinous 采样示例代码、效果良好)  

    2.顺时针和逆时针方向控制5V 直流伺服电机(0至180度应为良好) 、持续(与 ADC 值无关)。 我找不到这方面的示例代码。  

    如果可以、请告诉我。  

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

    不清楚是否有用于1的完整工作代码:

    ADC - UART:您可以在以下文章中查看.zip: https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/647411/cc1310-uart_write-block-in-the-callback-of-rxpacket

    在您的情况下、您可以在 ADC 回调中发布信标、通知可以在 UART 上发送数据。

    2:必须向电机发送什么? 我假设它是 CC1350和电机之间的驱动器? 实际上、您是否需要每 x ms 向电机发送一次信号?  

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

     

    #include <stdint.h>
    #include <stdio.h>
    /* For sleep() */
    #include <unistd.h>
    
    /* Driver Header files */
    #include <ti/drivers/ADCBuf.h>
    #include <ti/drivers/UART.h>
    
    /* Example/Board Header files */
    #include "Board.h"
    
    #define ADCBUFFERSIZE    (50)
    #define UARTBUFFERSIZE   ((20 * ADCBUFFERSIZE) + 24)
    
    uint16_t sampleBufferOne[ADCBUFFERSIZE];
    uint16_t sampleBufferTwo[ADCBUFFERSIZE];
    uint32_t microVoltBuffer[ADCBUFFERSIZE];
    uint32_t buffersCompletedCounter = 0;
    char uartTxBuffer[UARTBUFFERSIZE];
    
    /* Driver handle shared between the task and the callback function */
    UART_Handle uart;
    
    /*
     * This function is called whenever an ADC buffer is full.
     * The content of the buffer is then converted into human-readable format and
     * sent to the PC via UART.
     */
    void adcBufCallback(ADCBuf_Handle handle, ADCBuf_Conversion *conversion,
        void *completedADCBuffer, uint32_t completedChannel)
    {
        uint_fast16_t i;
        uint_fast16_t uartTxBufferOffset = 0;
    
        /* Adjust raw ADC values and convert them to microvolts */
        ADCBuf_adjustRawValues(handle, completedADCBuffer, ADCBUFFERSIZE,
            completedChannel);
        ADCBuf_convertAdjustedToMicroVolts(handle, completedChannel,
            completedADCBuffer, microVoltBuffer, ADCBUFFERSIZE);
    
        /* Start with a header message.
        uartTxBufferOffset = snprintf(uartTxBuffer,
            UARTBUFFERSIZE - uartTxBufferOffset, "\r\nBuffer %u finished.",
            (unsigned int)buffersCompletedCounter++);*/
    
        /* Write raw adjusted values to the UART buffer if there is room.
        uartTxBufferOffset += snprintf(uartTxBuffer + uartTxBufferOffset,
            UARTBUFFERSIZE - uartTxBufferOffset, "\r\nRaw Buffer: ");
    
        for (i = 0; i < ADCBUFFERSIZE && uartTxBufferOffset < UARTBUFFERSIZE; i++) {
            uartTxBufferOffset += snprintf(uartTxBuffer + uartTxBufferOffset,
                UARTBUFFERSIZE - uartTxBufferOffset, "%u,",
            *(((uint16_t *)completedADCBuffer) + i));
        }*/
    
    
        /* Write microvolt values to the UART buffer if there is room. */
        if (uartTxBufferOffset < UARTBUFFERSIZE) {
            uartTxBufferOffset += snprintf(uartTxBuffer + uartTxBufferOffset,
                UARTBUFFERSIZE - uartTxBufferOffset, "");
    
            for (i = 0; i < ADCBUFFERSIZE && uartTxBufferOffset < UARTBUFFERSIZE; i++) {
                uartTxBufferOffset += snprintf(uartTxBuffer + uartTxBufferOffset,
                    UARTBUFFERSIZE - uartTxBufferOffset, "%u\r\n",
                    (unsigned int)microVoltBuffer[i]);
            }
        }
    
    /*
         * Ensure we don't write outside the buffer.
         * Append a newline after the data.
    
        if (uartTxBufferOffset < UARTBUFFERSIZE) {
            uartTxBuffer[uartTxBufferOffset++] = '\n';
        }
        else {
            uartTxBuffer[UARTBUFFERSIZE-1] = '\n';
        }
    */
        /* Display the data via UART */
        UART_write(uart, uartTxBuffer, uartTxBufferOffset) ;
    }
    
    /*
     * Callback function to use the UART in callback mode. It does nothing.
     */
    void uartCallback(UART_Handle handle, void *buf, size_t count) {
       return;
    }
    
    /*
     *  ======== mainThread ========
     */
    void *mainThread(void *arg0)
    {
        UART_Params uartParams;
        ADCBuf_Handle adcBuf;
        ADCBuf_Params adcBufParams;
        ADCBuf_Conversion continuousConversion;
    
        /* Call driver init functions */
        ADCBuf_init();
        UART_init();
    
        /* Create a UART with data processing off. */
        UART_Params_init(&uartParams);
        uartParams.writeDataMode = UART_DATA_BINARY;
        uartParams.writeMode = UART_MODE_CALLBACK;
        uartParams.writeCallback = uartCallback;
        uartParams.baudRate = 115200;
        uart = UART_open(Board_UART0, &uartParams);
    
        /* Set up an ADCBuf peripheral in ADCBuf_RECURRENCE_MODE_CONTINUOUS */
        ADCBuf_Params_init(&adcBufParams);
        adcBufParams.callbackFxn = adcBufCallback;
        adcBufParams.recurrenceMode = ADCBuf_RECURRENCE_MODE_CONTINUOUS;
        adcBufParams.returnMode = ADCBuf_RETURN_MODE_CALLBACK;
        adcBufParams.samplingFrequency = 200;
        adcBuf = ADCBuf_open(Board_ADCBUF0, &adcBufParams);
    
        /* Configure the conversion struct */
        continuousConversion.arg = NULL;
        continuousConversion.adcChannel = Board_ADCBUF0CHANNEL0;
        continuousConversion.sampleBuffer = sampleBufferOne;
        continuousConversion.sampleBufferTwo = sampleBufferTwo;
        continuousConversion.samplesRequestedCount = ADCBUFFERSIZE;
    
        if (adcBuf == NULL){
            /* ADCBuf failed to open. */
            while(1);
        }
    
        /* Start converting. */
        if (ADCBuf_convert(adcBuf, &continuousConversion, 1) !=
            ADCBuf_STATUS_SUCCESS) {
            /* Did not start conversion process correctly. */
            while(1);
        }
    
        /*
         * Go to sleep in the foreground thread forever. The ADC hardware will
         * perform conversions and invoke the callback function when a buffer is
         * full.
         */
        while(1) {
            sleep(1000);
        }
    }
    

    这是我将用于1的代码。

    我不使用电机驱动器。 我只想连续向电机发送 PWM 信号、使其旋转。  

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

    对于2:您应该能够在 单独的任务中使用 PWNM 驱动程序(例如:dev.ti.com/.../node  

    回调实际上是一种中断处理、这意味着回调中的代码应该是轻量级的。 将 UART 写入移动到另一个任务、并使用信标来更好地控制时序、因为 UART 写入相当耗时。  

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

    感谢您的链接、但很遗憾、我收到一个错误、说明开发 TI 中不存在该资源。  

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

    抱歉、另一个=已进入链路。 请访问 dev.ti.com/.../node