我正在开发一个带有两个 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 读取任何值。谢谢你的评论,很有帮助。
尝试将 int 声明为 volatile。
volatile int value = GPIO_PinRead(GPIOA, GPIO_HEARTBEAT_READ);
编译器可能正在优化该部分,而不是实际读取该值。