1 Reply Latest reply on Nov 21, 2017 11:00 PM by mddd

    CyU3PMutex lock incomplete type

    h.ahuis_2374911

      Dear all,

      to get into programming the FX3 I tried to blink the LED on the FX3 Development Kit and tried to establish some debug messages via UART.

      So I took the BootLedBlink Example Project and tried to build the UART function into it. I get a bit confused of what the library source ...FX3... and ...U3P... stands for. Seems to me that every function has a BOOT member and a U3P member. What is the difference between these two?

       

      Nevertheless I now get a compiler error:

       

      'Invoking: Cross ARM C Compiler'

      arm-none-eabi-gcc -mcpu=arm926ej-s -marm -mthumb-interwork -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -Wall  -g3 -I"C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\/fw_lib/1_3_3/inc" -I"C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\/boot_lib/1_3_3/include" -std=gnu11 -MMD -MP -MF"main.d" -MT"main.o" -c -o "main.o" "../main.c"

      In file included from C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\/fw_lib/1_3_3/inc/cyu3system.h:28:0,

                       from ../main.c:27:

      C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\/fw_lib/1_3_3/inc/cyu3dma.h:701:16: error: field 'lock' has incomplete type

           CyU3PMutex lock;            /**< Lock for this channel structure. */

       

       

       

       

      I get this error even when I didn't use the cyu3dma.h header file.

       

      Here is an excerpt from the main file:

       

      #include "cyfx3device.h"

      #include "cyfx3utils.h"

      #include "cyfx3gpio.h"

      #include "defines.h"

      #include "cyu3system.h"

      #include "cyu3error.h"

      #include "cyu3system.h"

      #include "cyu3types.h"

      #include "cyu3uart.h"

      #include "cyu3gpio.h"

       

       

      #define FX3_GPIO_TEST_OUT             (50)

      #ifndef NULL

      #define NULL   ((void *) 0)

      #endif

       

      void

      CyFxBulkSrcSinkApplnDebugInit (void)

      {

      ....

      }

       

       

       

       

      int main (void)

      {

          /*CyFx3BootErrorCode_t        status;*/

      CyU3PIoMatrixConfig_t io_cfg;

          CyU3PReturnStatus_t status = CY_U3P_SUCCESS;

          CyBool_t                    value;

       

       

          /* Initialisiere das Gerät */

          CyU3PSysClockConfig_t clockConfig;

          clockConfig.setSysClk400 = CyFalse;

          clockConfig.cpuClkDiv = 2;

          clockConfig.dmaClkDiv = 2;

          clockConfig.mmioClkDiv =2;

          clockConfig.useStandbyClk = CyFalse;

          clockConfig.clkSrc = CY_U3P_SYS_CLK;

          status = CyU3PDeviceInit (&clockConfig);

          if (status != CY_U3P_SUCCESS)

          {

          goto handle_fatal_error;

          }

       

       

          CyFxBulkSrcSinkApplnDebugInit();

          CyU3PDebugPrint (1, "\n\ndebug initialized\r\n");

       

          CyFx3BootDeviceInit (CyTrue);

       

       

          /* Enable the GPIOs for the LED and the switch. */

          io_cfg.isDQ32Bit = CyFalse;

          io_cfg.s0Mode = CY_U3P_SPORT_INACTIVE;

          io_cfg.s1Mode = CY_U3P_SPORT_INACTIVE;

          io_cfg.useUart   = CyTrue;

          io_cfg.useI2C    = CyFalse;

          io_cfg.useI2S    = CyFalse;

          io_cfg.useSpi    = CyFalse;

          io_cfg.lppMode   = CY_U3P_IO_MATRIX_LPP_UART_ONLY;

       

       

       

       

          io_cfg.gpioSimpleEn[0]  = 0;

          io_cfg.gpioSimpleEn[1]  = (1 << (APP_LED_GPIO - 32)) | (1 << (APP_SWITCH_GPIO - 32));

          io_cfg.gpioComplexEn[0] = 0;

          io_cfg.gpioComplexEn[1] = (1 << (APP_LED_GPIO - 32)) | (1 << (APP_SWITCH_GPIO - 32));

          status = CyU3PDeviceConfigureIOMatrix (&io_cfg);

          if (status != CY_FX3_BOOT_SUCCESS)

          {

              return status;

          }

       

       

          /* Flash the LED to indicate that initialization succeeded. */

          CyU3PGpioSetValue (APP_LED_GPIO, CyTrue);

          CyFx3BusyWait (50000);

          CyU3PGpioSetValue (APP_LED_GPIO, CyFalse);

          CyFx3BusyWait (50000);

          CyU3PGpioSetValue (APP_LED_GPIO, CyTrue);

          CyFx3BusyWait (50000);

          CyU3PGpioSetValue (APP_LED_GPIO, CyFalse);

       

       

          /* We keep looping around and copying the state of the SWITCH GPIO onto the LED GPIO. */

          while (1)

          {

          CyU3PGpioSetValue (APP_SWITCH_GPIO, value);

          CyU3PGpioSetValue (APP_LED_GPIO, value);

              //CyFx3BootBusyWait (1000000);

              //CyFx3BootGpioSetValue (APP_LED_GPIO, CyFalse);

              CyFx3BusyWait (50000);

          }

       

       

          return 0;

          handle_fatal_error:

       

       

              /* Cannot recover from this error. */

              while (1);

       

       

      }

        • 1. Re: CyU3PMutex lock incomplete type
          mddd

          From the code it looks like you have mixed up the bootLed Example and the BulkSrcSink example.

           

          The boot examples use the boot library which is a lighter version of the library with limited functionality. Generally, the APIs in the boot library have a prefix CyFx3 whereas the main library APIs have a prefix CyU3P.

           

          For getting started, please start with the BulkSourceSink Example which already has a GPIO toggle functionality.