无法从设置为输入的 GPIO 读取值

问题描述 投票:0回答:1

我正在开发一个带有两个 IMX7ULP 的定制板。我想做的事情似乎很简单,一个IMX7ULP的A7向另一个IMX7ULP的M4发送信号,只是一个电信号,A7的一个引脚作为输出,M4的一个引脚作为输入(PTA16),无需特殊通信协议。我们设法将 A7 的引脚设置为输出(甚至用万用表进行检查),并且我们执行了看似正确的操作将引脚设置为输入,但没有读取任何内容,并且它一直返回 0 值。

我编写的代码看起来像这样


#define GPIO_HEARTBEAT_READ 16U

 gpio_pin_config_t digitalInput = { //set as input
        kGPIO_DigitalInput,
    };

    /* Init board hardware. */
    BOARD_InitPins();
    BOARD_BootClockRUN();
    BOARD_InitDebugConsole();
    CLOCK_EnableClock(kCLOCK_Rgpio2p0);

    
    /* Init input GPIO. */
    GPIO_PinInit(GPIOA, GPIO_HEARTBEAT_READ, &digitalInput);

    int value = GPIO_PinRead(GPIOA, GPIO_HEARTBEAT_READ);
    PRINTF("Value of HEARTBEAT_READ : %d\n", value);
    PRINTF("Value of register of heartbeat : %x\n", READ_reg());

并且值设置为 0,而寄存器读取 0x10100,这是我期望将引脚设置为输入的值。

我还检查了 IOMUXC 模式以确保其正确设置为 GPIO :

void BOARD_InitPins(void) {    
    IOMUXC_SetPinMux(IOMUXC_PTA16_PTA16, 0U);
}

我什至尝试将其强制下拉以在引脚处产生电位差,但没有任何变化。我目前已经没有想法了,有什么我想念的吗?这是否更多是硬件问题而不是软件问题(如果是这样,我很抱歉,我会寻找其他地方)

提前谢谢您

编辑:有人要求提供一个代码,让 LED 闪烁,这是默认给出的,我将其更改为尝试接受输入:

#define LED_GPIO_PIN 20U

int main(void)
{

    gpio_pin_config_t digitalOutput = {  //allows for setting the pin as an output
        kGPIO_DigitalOutput,
        0,
    };

    /* Init board hardware. */
    BOARD_InitPins();
    BOARD_BootClockRUN();
    //BOARD_InitDebugConsole();
    CLOCK_EnableClock(kCLOCK_Rgpio2p0);

    
    /* Init output LED GPIO. */
    GPIO_PinInit(GPIOA, LED_GPIO_PIN, &digitalOutput);
    GPIO_PortSet(GPIOA, 1u << LED_GPIO_PIN);    

    while(1) {
        delay(10000);
        GPIO_PortToggle(GPIOA, 1u << LED_GPIO_PIN);
    }
}

我们还可以将 M4 引脚设置为输出,将 A7 引脚设置为输入,并在 A7 上接收信号

最后编辑:我不知道为什么,但我设法使用中断和 NVIC IRQ 处理程序获取引脚信息。但仍然没有使用 GPIO_PinRead 读取任何值。谢谢你的评论,很有帮助。

c embedded gpio cortex-m imx7
1个回答
0
投票

尝试将 int 声明为 volatile

volatile int value = GPIO_PinRead(GPIOA, GPIO_HEARTBEAT_READ);

编译器可能正在优化该部分,而不是实际读取该值。

© www.soinside.com 2019 - 2024. All rights reserved.