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.

MSP430FR2355: HAL driver question....How to pass argument?

Part Number: MSP430FR2355


I have the following code in a header file:

#define PORT1   (GPIO_RegDef_t *)P1_BASE
#define PORT2   (GPIO_RegDef_t *)P2_BASE
#define PORT3   (GPIO_RegDef_t *)P3_BASE
#define PORT4   (GPIO_RegDef_t *)P4_BASE
#define PORT5   (GPIO_RegDef_t *)P5_BASE
#define PORT6   (GPIO_RegDef_t *)P6_BASE

typedef struct
{
    uint8_t GPIO_PinNumber;         /*values @PIN_NUMBERS */
    uint8_t GPIO_PinMode;           /*values @enum gpioType_t */
    uint8_t GPIO_IO_Mode;           /*values @PIN_IO_MODE */
    uint8_t GPIO_InitValue;         /*values @PIN_INIT_VALUES */
    uint8_t GPIO_PinPuPdCntrl;      /*values @PIN_PULLUP_PULLDWN */
}GPIO_PinConfig_t;

typedef struct
{
    __vo uint16_t PIN;   /*GPIO port input value register        Offset 0x00 */
    __vo uint16_t POUT;  /*GPIO port output value register       Offset 0x02 */
    __vo uint16_t DIR;   /*GPIO port direction register          Offset 0x04 */
    __vo uint16_t PREN; /*GPIO resistor enable register          Offset 0x06 */
    uint16_t RESERVED;   /* Reserved                             Offset 0x08 */
    __vo uint16_t SEL[2];/*GPIO port function select register    Offset 0x0A SEL[0] - 0x0C SEL[1] */
    __vo uint16_t IV;   /*GPIO port output data register        Offset 0x0E */
    uint16_t RSVDA[3];   /*Reserved                              Offset 0x10, 0x12, 0x14 */
    __vo uint16_t PSELC; /*GPIO Complement selection             Offset 0x16 */
    __vo uint16_t PIES;  /*GPIO Interrupt edge select            Offset 0x18 */
    __vo uint16_t PIE;  /*GPIO Interrupt edge                    Offset 0x1A */
    __vo uint16_t PIFG;  /*GPIO Interrupt flag                   Offset 0x1C */
}GPIO_RegDef_t;

/*
 * handle structure for GPIO pin
 */
typedef struct
{
    GPIO_RegDef_t *pGPIOx; /*holds base address of GPIO port to which pin belongs */
    GPIO_PinConfig_t GPIO_PinConfig; /*holds GPIO pin configuration settings */
}GPIO_Handle_t;

In a c file I have:

void GPIO_Init(GPIO_Handle_t *pGPIOHandle, uint8_t type)
{
    gpioType_t io;
    GPIO_Handle_t s;

//    s = &(pGPIOHandle->pGPIOx);

    io = (gpioType_t)(pGPIOHandle->GPIO_PinConfig.GPIO_PinMode);

    switch (io)
    {
    case GPIO_MODE_IO:
        if (type)
            GPIO_WriteOutputPin(s.pGPIOx, pGPIOHandle->GPIO_PinConfig.GPIO_PinNumber, \
                                pGPIOHandle->GPIO_PinConfig.GPIO_InitValue);

        GPIO_IO_ConfigurePin(pGPIOHandle->pGPIOx, pGPIOHandle->GPIO_PinConfig.GPIO_PinNumber, \
                                 pGPIOHandle->GPIO_PinConfig.GPIO_IO_Mode);
        break;
    case GPIO_MODE_ALT1:
        break;
    case GPIO_MODE_ALT2:
        break;
    case GPIO_MODE_ANALG:
        break;
    }
}

void GPIO_IO_ConfigurePin(GPIO_Handle_t *pGPIOHandle, uint8_t PinNumber, uint8_t type)
{
    if (type)
        pGPIOHandle->pGPIOx->DIR |= (1 << PinNumber);
    else
        pGPIOHandle->pGPIOx->DIR &= ~(1 << PinNumber);
}


void GPIO_WriteOutputPin(GPIO_Handle_t *pGPIOHandle, uint8_t PinNumber, uint8_t value)
{
    if (value)
        pGPIOHandle->pGPIOx->POUT |= (1 << PinNumber);
    else
        pGPIOHandle->pGPIOx->POUT &= ~(1 << PinNumber);
}

The write and config functions work fine on their own...I am trying to embed them as function calls into the GPIO_Init().  I am getting the following warnings:

#169-D argument of type "GPIO_RegDef_t *" is incompatible with parameter of type "GPIO_Handle_t *"

Can someone please tell me how to solve this?  I have tried all kinds of things but  to no avail.

Sincerely

Steve

  • Hi Steve,

    Based on the prototyping of your two functions, the first argument must be a GPIO_Handle_t*, but you are attempting to use a GPIO_RegDef_t* instead.

    I took the liberty of stripping out some non-related code and re-structuring it a bit to make it more clear what is happening.  I may have not have achieved the same exact functionality as inteded, but the point is to focus on the cause of the complier warning.

    You can see in the GPIO_Init() function I commented out your original statement and replaced it with the appropriate version.

    void GPIO_Init(GPIO_Handle_t *pGPIOHandle, uint8_t type)
    {
        volatile gpioType_t io;
    
        io = (gpioType_t)(pGPIOHandle->GPIO_PinConfig.GPIO_PinMode);
    
        switch(io)
        {
            case GPIO_MODE_IO:
                if(type)
                {
                    //GPIO_WriteOutputPin(s.pGPIOx, pGPIOHandle->GPIO_PinConfig.GPIO_PinNumber, pGPIOHandle->GPIO_PinConfig.GPIO_InitValue);
                    GPIO_WriteOutputPin(pGPIOHandle, pGPIOHandle->GPIO_PinConfig.GPIO_PinNumber, pGPIOHandle->GPIO_PinConfig.GPIO_InitValue);
    
                    //GPIO_IO_ConfigurePin(pGPIOHandle->pGPIOx, pGPIOHandle->GPIO_PinConfig.GPIO_PinNumber, pGPIOHandle->GPIO_PinConfig.GPIO_IO_Mode);
                    GPIO_IO_ConfigurePin(pGPIOHandle, pGPIOHandle->GPIO_PinConfig.GPIO_PinNumber, pGPIOHandle->GPIO_PinConfig.GPIO_IO_Mode);
                }
            break;
    
            // the other case statements...
        }
    
    }

  • Thanks...I used those two functions in main successfully and tried to embed them into another function thinking I would do the same.  Clearly there is another level of complexity.

**Attention** This is a public forum