nuttx实战项目:多路串口合并功能之四串口遗留问题解决

NuttX 下调试 STM32F4 串口引脚问题

如前述文章五,经过初步调试后,发现 UART4(对应于 ttyS3) 的串口 TX 引脚无法输出(使用测试其他串口的同样软件验证过)。
于是请来最厉害的 OpenAI,先问问看:


提问内容

目前使用 NuttX 调试 USART3,发现 PC10 可能被 pinmap 成了别的功能。
那么就想是否可以通过 NuttX 读出对应的 PC10 引脚功能寄存器,看看到底配置成了什么。

这就涉及到两个部分:

  1. NuttX 是否有内建读取 IOMEM 的工具?如果没有,我是否需要改写一个 hello 程序来实现读取?
  2. 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,来帮我优化设计与实现。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值