NuttX 下调试 STM32F4 串口引脚问题
如前述文章五,经过初步调试后,发现 UART4(对应于 ttyS3) 的串口 TX 引脚无法输出(使用测试其他串口的同样软件验证过)。
于是请来最厉害的 OpenAI,先问问看:
提问内容
目前使用 NuttX 调试 USART3,发现 PC10 可能被 pinmap 成了别的功能。
那么就想是否可以通过 NuttX 读出对应的 PC10 引脚功能寄存器,看看到底配置成了什么。这就涉及到两个部分:
- NuttX 是否有内建读取 IOMEM 的工具?如果没有,我是否需要改写一个 hello 程序来实现读取?
- STM32F407VET6 对应的 PC10 引脚的寄存器地址在哪里?含义是什么?我好确认 PC10 为什么不是 USART3 的 TX。
OpenAI 提供的工具
OpenAI 给到一个简易 寄存器读取工具(类似 Linux 的 peek 命令),代码如下:
/****************************************************************************
* apps/examples/peek/peek_main.c
*
* 简易 peek 工具:读取指定地址的 32bit 寄存器值
*
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <errno.h>
/****************************************************************************
* Public Functions
****************************************************************************/
int main(int argc, FAR char *argv[])
{
if (argc < 2)
{
printf("Usage: %s <address_in_hex>\n", argv[0]);
return -1;
}
/* 将输入参数转换成地址 */
uintptr_t addr = (uintptr_t)strtoul(argv[1], NULL, 16);
if (addr == 0)
{
printf("Invalid address: %s\n", argv[1]);
return -EINVAL;
}
/* 读取该地址的 32bit 值 */
volatile uint32_t *reg = (volatile uint32_t *)addr;
uint32_t val = *reg;
printf("Read [0x%08lx] = 0x%08lx\n",
(unsigned long)addr, (unsigned long)val);
return 0;
}
实际排查结果
经过综合分析和多次确认,最终在 NuttX 源码中找到了相关定义:
路径:
kelland@HP-Desktop-PC:~/nuttx_workspace/nuttx/arch/arm/src/stm32/hardware/stm32f40xxx_pinmap.h
内容如下:
#define GPIO_UART4_TX_1 (GPIO_ALT|GPIO_AF8|GPIO_PULLUP|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN0)
#define GPIO_UART4_TX_2 (GPIO_ALT|GPIO_AF8|GPIO_PULLUP|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN10)
也就是说,UART4 的 TX 可以映射到 PA0 或 PC10。
之前我被 STM32Cube 给误导了,以为默认是 PC10。经过代码查阅,确认 AF8 对应的 GPIO 其实是 PA0。
当我把 TX 引脚正确连接到 PA0 后,UART4(即 ttyS3)的功能果然恢复正常!
下一步计划
串口 TX 问题已解决,接下来就是针对 5 个串口 分别写逻辑代码了。
这一部分,还是继续请教 OpenAI,来帮我优化设计与实现。

被折叠的 条评论
为什么被折叠?



