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 驱动程序问题...如何传递参数?

Guru**** 2537350 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/999548/msp430fr2355-hal-driver-question-how-to-pass-argument

器件型号:MSP430FR2355

我在头文件中包含以下代码:

#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;

在 c 文件中、我有:

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);
}

写入和配置函数本身工作正常...我正在尝试将它们作为函数调用嵌入到 GPIO_Init()中。  我收到以下警告:

"GPIO_RegDef_t *"类型的#169-D 参数与"GPIO_handle_t *"类型的参数不兼容

有人能告诉我如何解决这个问题吗?  我尝试了各种各样的东西,但 没有结果。

此致

Steve

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

    您好、Steve、

    根据两个函数的原型设计、第一个参数必须是 GPIO_handle_t*、但您正在尝试改用 GPIO_RegDef_t*。

    我冒昧地删除了一些与非相关的代码、并对其进行了重新构建、以便更清楚地了解正在发生的情况。  我可能没有实现与集成的完全相同的功能、但重点是关注编译器警告的原因。

    您可以在 GPIO_Init()函数中看到我对原始语句进行了注释并将其替换为适当的版本。

    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...
        }
    
    }

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

    谢谢...我 成功地使用了这两个函数、并尝试将它们嵌入到另一个函数中、我想我也会这样做。  显然还有另一个层面的复杂性。