You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QEMU模拟MPS2-AN385:如何暴露GPIO实现宿主机读写?

针对MPS2-AN385的GPIO操作与宿主机交互方案

一、在QEMU模拟环境内读写GPIO

MPS2-AN385的GPIO控制器挂载在系统总线固定地址0x40002000上(QEMU模拟地址与硬件一致),你可以直接通过寄存器操作实现读写:

1. 核心寄存器说明

  • GPIO_DIR(方向寄存器):地址0x40002000,每一位对应一个GPIO引脚,1设为输出,0设为输入。
  • GPIO_DATA(数据寄存器):地址0x40002004,读写对应引脚的电平,1为高电平,0为低电平。

2. RTOS内代码示例(C语言)

#include <stdint.h>

#define GPIO_BASE_ADDR 0x40002000
#define GPIO_DIR (*(volatile uint32_t *)(GPIO_BASE_ADDR + 0x0))
#define GPIO_DATA (*(volatile uint32_t *)(GPIO_BASE_ADDR + 0x4))

// 配置GPIO0为输出并置高
void gpio0_set_high(void) {
    GPIO_DIR |= (1 << 0);  // 第0位设为输出
    GPIO_DATA |= (1 << 0); // 置高GPIO0
}

// 读取GPIO1的输入电平
uint8_t gpio1_read_level(void) {
    GPIO_DIR &= ~(1 << 1); // 第1位设为输入
    return (GPIO_DATA >> 1) & 0x1; // 返回GPIO1电平
}

把这段逻辑编译进RTOSDemo.out,就能在模拟环境内直接操作GPIO引脚。

二、将QEMU模拟的GPIO暴露给宿主机

QEMU提供两种可行方案实现宿主机与模拟GPIO的交互:

1. Linux宿主机:Sysfs GPIO直通

利用QEMU的gpio-passthrough设备,把模拟GPIO映射到宿主机的sysfs GPIO节点:

  • 修改启动命令(以映射模拟GPIO0-3到宿主机GPIO10-13为例):
qemu-system-arm -machine mps2-an385 -cpu cortex-m3 -kernel output/RTOSDemo.out -monitor none -nographic -serial stdio \
  -chardev sysfs,id=gpio0,gpiopath=/sys/class/gpio,out-lines=10-13,in-lines=10-13 \
  -device gpio-passthrough,chardev=gpio0,gpio-line-numbers=0-3,direction=bidirectional
  • 前置操作:先在宿主机导出目标GPIO(比如echo 10 > /sys/class/gpio/export),并确保QEMU进程有sysfs操作权限。

2. 跨平台通用:串口指令交互

借助你已启用的-serial stdio通道,在RTOS内添加串口指令解析逻辑,实现宿主机通过终端命令控制/读取GPIO:

  • RTOS内串口处理代码示例:
#include <stdio.h>
#include <string.h>

// 复用前面的GPIO操作函数
extern void gpio0_set_high(void);
extern uint8_t gpio1_read_level(void);

void process_uart_cmd(char *cmd) {
    if (strcmp(cmd, "GPIO0_HIGH") == 0) {
        gpio0_set_high();
        printf("OK: GPIO0 set to HIGH\n");
    } else if (strcmp(cmd, "GPIO1_READ") == 0) {
        uint8_t level = gpio1_read_level();
        printf("GPIO1 level: %d\n", level);
    }
}

// 在RTOS任务中循环处理串口输入
void uart_handler_task(void *arg) {
    char cmd_buf[32];
    while (1) {
        fgets(cmd_buf, sizeof(cmd_buf), stdin);
        cmd_buf[strcspn(cmd_buf, "\n")] = 0; // 移除换行符
        process_uart_cmd(cmd_buf);
    }
}
  • 宿主机端直接在终端输入命令(如GPIO0_HIGH),即可控制模拟GPIO,RTOS会返回执行结果。

注意事项

  • QEMU对MPS2-AN385的GPIO模拟仅覆盖基础功能,部分高级特性(如中断触发)可能未完全实现,操作前建议确认QEMU版本的支持情况。
  • 使用gpio-passthrough时,需注意模拟引脚与宿主机GPIO的编号对应关系,避免硬件冲突。

内容的提问来源于stack exchange,提问作者Allexj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:33:33