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
相关产品推荐
相关产品推荐

