返回顶部

QEMU 仿真模拟 STM32F103 开发板

软件介绍

QEMU 是一款开源虚拟机, 可以用来模拟各种系统开发板, 当然也可以用来模拟 stm32 的开发板

QEMU 官方说明文档在此 https://www.qemu.org/docs/master/system/arm/stm32.html
不过我们使用的并不是官方的版本, 而是别人魔改的一个版本, 用 QEMU 模拟 STM32 这事很多人干过, 网上也查了一些资料参考
作为一个菜鸟来说, 我对 QEMU 是不怎么熟悉的, 开发环境也是 windows, 所以一旦牵扯到相关源码编译直接就把我劝退了...
我的想法很简单, 就是直接下载别人编译好的 exe, 毕竟开发环境折腾起来是真的费劲, 鬼知道会缺什么库. 不过不巧的是这个版本后续可能要被废弃了, 网站贴出了之后不再支持的公告...
代码地址:
https://xpack.github.io/qemu-arm/
下载地址:
https://sourceforge.net/projects/qemu-arm-xpack/files/latest/download

因为兼容性问题, 后期可能还会再维护一段时间, 如果下载的文件没有这个版本, 大概率说明这个版本已经撤销了, 文章关了, 可以退出了...

这里模拟的开发板是 STM32-Bluepill(STM32F103), 也就是淘宝拼多多上销量最高的那款, 似乎都有些修改, 不过都是大同小异.

环境准备

首先确保电脑有 nodejs 环境, 没有的话网站安装 https://nodejs.org/en/download
然后安装 xpm

npm install --global xpm@latest

之后就是通过 xpm 安装 qemu 了

xpm install --global @xpack-dev-tools/qemu-arm@latest --verbose

安装完成之后大概这个路径可以找到 qemu 的几个 exe 文件

C:\Users\你的用户名\AppData\Roaming\xPacks\@xpack-dev-tools\qemu-arm\7.1.0-1.1\.content\bin


其中可以看到一个 eclipse 版本 qemu-system-gnuarmeclipse.exe, 我们要用的就是这个

使用方式

到 qemu-system-gnuarmeclipse.exe 所在的文件夹, 打开命令行或者 powershell

.\qemu-system-gnuarmeclipse.exe --board BluePill --image 你的stm32程序文件路径.elf

主要用到两个参数, --board 是设置开发板类型, --image 是设置 elf 程序文件. 需要注意这两个命令 官方的 QEMU 都是不支持的.
我这里烧录的程序是控制 PC13 亮灭的, BluePill 开发板 PC13 连的是一个 led 灯. 代码是用 arm-none-eabi-gcc 编译的.
工程用的是 Vscode 的一个插件 EIDE 创建的, 也很方便.

#include "stm32f10x.h"

#define LED_PERIPH ((uint32_t)0x00000010)
#define LED_PORT ((GPIO_TypeDef *) GPIOC_BASE)
#define LED_PIN GPIO_Pin_13

void delay(int x)
{
    for (int i = 0; i < x; i++)
    {
        for (int j = 0; j < 1000; j++)
            __NOP();
    }
}

int main()
{
    GPIO_InitTypeDef gpioDef;
    RCC_APB2PeriphClockCmd(LED_PERIPH, ENABLE);
    gpioDef.GPIO_Mode = GPIO_Mode_Out_PP;
    gpioDef.GPIO_Pin = LED_PIN;
    gpioDef.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(LED_PORT, &gpioDef);

    while (1)
    {
        GPIO_WriteBit(LED_PORT, LED_PIN, (BitAction)!GPIO_ReadInputDataBit(LED_PORT, LED_PIN));
        delay(1000);
    }
}

执行效果如图所示

软件还做了点动画效果, 这个灯确实能一闪一闪的

GDB 调试

如果需要使用 GDB 调试的话需要添加两个参数 -S -s

.\qemu-system-gnuarmeclipse.exe -S -s --board BluePill --image 你的stm32程序文件路径.elf

之后启动 GDB 连接 1234 这个端口, 然后设置文件.

tar remote localhost:1234
file 你的stm32程序文件路径.elf


之后就可以愉快的进行调试了.

使用 VScode 调试

GDB 命令行使用不方便的话也可以用 VScode 的机制进行调试, 实际上也是使用的 GDB, 只不过是有了图形界面会方便点.
添加 json 调试配置文件.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "stm32调试",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/Debug/${workspaceFolderBasename}.elf",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            // 这里是我的 gdb 路径 
            "miDebuggerPath": "C:/Users/Qu/.eide/tools/gcc_arm/bin/arm-none-eabi-gdb.exe",
            "miDebuggerServerAddress": "localhost:1234",
        }
    ]
}

posted @ 2022-10-21 16:22  超级太阳  阅读(7879)  评论(0编辑  收藏  举报