新闻详情

新闻详情

首页 / 资讯中心 / 详情

STM32嵌入式C++开发:CMake构建与Renode仿真环境搭建指南

发布时间:2026/9/29 22:58:31来源:尧图网络
STM32嵌入式C++开发:CMake构建与Renode仿真环境搭建指南
1. 从“一行代码都不让写”说起这套教程到底在铺什么路“看了三篇了一行都没让我写呢。”这句话我第一次在评论区看到的时候差点把嘴里的茶喷出来。太真实了。你打开一个标题写着“基于STM32的嵌入式C编程之旅”的系列满心欢喜以为第一篇就能点亮LED结果第一篇讲工具链第二篇讲CMake第三篇讲Renode仿真到第四篇了还在配环境。换谁都得急。但我想说的是这个“急”恰恰说明你还没意识到一件事嵌入式C开发和你在PC上写C完全是两码事。你在PC上写个冒泡排序装个Visual Studio或者VS Code加MinGW五分钟就能跑起来。但嵌入式不一样你的代码最终要跑在一颗STM32芯片上这颗芯片可能只有64KB Flash、20KB RAM没有操作系统没有标准输入输出甚至连printf都要你自己重定向。在这种环境下工具链的选择、构建系统的搭建、调试手段的准备每一步都是在为后面真正写代码打地基。这个系列之所以前三篇不让你写代码核心逻辑是这样的先把“编译-构建-仿真-烧录-调试”这条链路打通再往里面填代码。因为嵌入式开发最让人崩溃的不是代码写不出来而是代码写出来了编译过了烧进去没反应你连问题出在哪都不知道。是编译器的锅是链接脚本的锅是启动文件的锅是时钟配置的锅还是你板子根本没插好如果没有一套可靠的构建和仿真环境你排查这些问题的时间会远远超过写代码的时间。所以这篇内容我打算把这条“不让你写代码”的路给你彻底讲透。从STM32的C开发为什么需要CMake到Renode怎么模拟STM32F103再到VS Code里怎么把这一套串起来最后给你一个可以直接抄的完整工程模板。适合谁看适合那些已经学过C语言基础、想从Keil或者STM32CubeIDE迁移到更现代开发流程的人也适合那些在PC上写惯了C、想往嵌入式方向转的开发者。如果你是完全零基础连GPIO是什么都不知道那这篇可能会有点吃力但跟着走一遍你至少能理解嵌入式项目的工程结构长什么样。2. 为什么STM32的C项目非要上CMake2.1 Keil和CubeIDE的“舒适区”到底舒适在哪大部分人入门STM32用的是Keil MDK或者STM32CubeIDE。Keil的好处是点一下“Build”就完事工程文件是.uvprojx双击就能打开芯片包装好之后外设库、启动文件、链接脚本全都自动配好。CubeIDE也类似基于Eclipse图形化配置时钟树和外设生成代码一键完成。这种“舒适区”对于初学者来说确实友好你不需要知道编译器的具体命令不需要知道链接脚本里MEMORY和SECTIONS怎么写甚至不需要知道arm-none-eabi-gcc这个编译器叫什么名字。但舒适区的代价是什么你的工程和Keil深度绑定。你想在CI/CD流水线里自动编译Keil的命令行工具是收费的而且跨平台支持很差。你想在Linux上开发Keil只有Windows版。你想用Git做版本管理.uvprojx是XML格式每次改配置都会产生大量无意义的diff合并冲突的时候你根本看不懂。你想用现代的代码补全和静态分析工具Keil的编辑器体验和VS Code差距不是一点半点。更关键的是C在Keil里的支持是有限的。Keil的ARMCC编译器对C11/14/17的支持取决于你用的版本而且标准库的移植也是个麻烦事。你想用std::array、std::algorithm、甚至只是简单的模板元编程都可能遇到各种奇怪的编译错误。而GCC的arm-none-eabi-g对C标准的支持要完整得多你可以在嵌入式环境里用上大部分C特性只要注意不要引入异常和RTTI带来的额外开销。2.2 CMake在嵌入式项目里到底解决了什么问题CMake的核心价值是跨平台、跨IDE的构建描述。你写一份CMakeLists.txt它可以在Windows上生成MinGW Makefile在Linux上生成Unix Makefiles在macOS上生成Xcode工程甚至生成Ninja构建文件。对于嵌入式开发来说这意味着你的STM32项目可以在任何有arm-none-eabi-gcc的平台上编译不依赖任何商业IDE。具体到STM32项目CMake帮你管理这些东西源文件的组织哪些.c和.cpp文件参与编译、头文件搜索路径include_directories、编译选项-mcpucortex-m3 -mthumb -Os这些、链接选项链接脚本的指定、--specsnosys.specs这些、库的链接CMSIS、HAL库、标准库。你把这些写进CMakeLists.txt之后不管换什么编辑器、换什么操作系统构建命令都是一样的cmake -B build cmake --build build。还有一个容易被忽略的好处CMake天然适合模块化。你可以把HAL库、CMSIS、你自己的驱动代码、应用层代码分成不同的CMakeLists.txt用add_subdirectory组织起来。这样你的工程结构会非常清晰而不是像Keil那样所有文件堆在一个列表里。2.3 工具链选型为什么是arm-none-eabi-gcc而不是别的嵌入式ARM Cortex-M的编译器主要有三个选择Keil的ARMCC、IAR的ICCARM、以及GNU的arm-none-eabi-gcc。前两个是商业编译器优化能力确实强但收费且封闭。arm-none-eabi-gcc是开源的虽然在某些场景下生成的代码体积比商业编译器大5%到10%但对于学习和大多数项目来说完全够用。安装arm-none-eabi-gcc的方式取决于你的操作系统。Windows上推荐用xPack或者ARM官方提供的GNU Toolchain下载后把bin目录加到PATH里。Linux上直接用包管理器Ubuntu下是sudo apt install gcc-arm-none-eabi。macOS用Homebrewbrew install arm-none-eabi-gcc。安装完之后验证一下arm-none-eabi-gcc --version你应该能看到类似arm-none-eabi-gcc (GNU Arm Embedded Toolchain) 10.3.1的输出。如果提示找不到命令说明PATH没配好这是新手最容易卡住的地方。注意不要用系统自带的gcc来编译STM32代码。gcc生成的是x86或者x64指令STM32跑不了。必须用arm-none-eabi-gcc这个前缀arm-none-eabi的意思是“ARM架构、无操作系统、嵌入式应用二进制接口”。3. Renode模拟STM32F103没有板子也能跑代码3.1 Renode是什么为什么不用QEMURenode是一个开源的仿真框架专门为嵌入式系统设计。它和QEMU的区别在于QEMU更偏向于模拟完整的操作系统环境比如你在QEMU里跑Linux而Renode更擅长模拟裸机或者RTOS环境下的微控制器。Renode支持STM32F103、STM32F4、STM32F7、nRF52、RISC-V等多种平台你可以把它理解成一个“虚拟开发板”。为什么要在Renode里模拟STM32F103三个原因。第一你手头可能没有板子或者板子还没到货但你想先把代码跑起来看看逻辑对不对。第二调试更方便Renode可以记录所有外设寄存器的读写你可以看到每一时刻GPIOA的ODR寄存器是什么值这在真实硬件上需要逻辑分析仪才能做到。第三自动化测试你可以在CI流水线里用Renode跑单元测试不需要插一堆板子。Renode的安装很简单。Windows和macOS去官网下载安装包Linux下可以用包管理器或者下载.deb/.rpm。安装完之后你会得到一个renode命令行工具和一个renode-console交互界面。3.2 为STM32F103写一个Renode平台描述文件Renode模拟STM32F103需要一个.repl文件来描述芯片的外设和内存映射。Renode自带了一些STM32的示例但F103的配置可能需要你自己调整。一个最简化的STM32F103平台描述大概长这样uart1: UART.STM32F7_UART sysbus 0x40013800 frequency: 8000000 - nvic37 gpioa: GPIOPort.STM32F7_GPIOPort sysbus 0x40010800 [0-15] - nvicEXTI0_IRQn flash: Memory.MappedMemory sysbus 0x08000000 size: 0x10000 sram: Memory.MappedMemory sysbus 0x20000000 size: 0x5000这个文件告诉Renode在地址0x40013800有一个UART1外设在0x40010800有一个GPIOA端口Flash从0x08000000开始大小64KBSRAM从0x20000000开始大小20KB。这些地址和大小都是从STM32F103的参考手册里查到的不能随便写。然后你需要一个.resc脚本文件来加载固件并启动仿真mach create stm32f103 machine LoadPlatformDescription stm32f103.repl sysbus LoadELF build/your_project.elf startLoadELF会把你的编译产物加载到对应的内存地址start启动CPU。之后你就可以在Renode的控制台里用sysbus ReadDoubleWord 0x40010800这样的命令来读取GPIOA的寄存器值验证你的代码有没有正确配置外设。3.3 在Renode里跑一个LED闪烁程序是什么体验假设你已经用CMake编译出了一个blink.elf这个程序的功能是让GPIOC的第13脚每隔500毫秒翻转一次。在真实板子上你会看到LED闪烁。在Renode里你看不到LED但你可以通过监控GPIOC的ODR寄存器来验证逻辑。启动Renode并加载固件之后你可以用showAnalyzer gpioPort命令打开一个分析窗口实时显示GPIO引脚的电平变化。如果你看到PC13的电平在周期性翻转说明你的代码逻辑是对的。如果一直不变那可能是时钟没使能、GPIO模式配错了、或者延时函数有问题。这种“寄存器级”的验证方式在真实硬件上反而很难做到因为你不可能拿万用表一直盯着引脚看。Renode把不可见的东西变得可见了这对于理解STM32的外设工作原理非常有帮助。提示Renode的仿真速度取决于你的主机性能通常比真实硬件慢一些但对于验证逻辑来说完全够用。如果你要测试对时间精度要求很高的场景比如PWM输出、高速SPI通信Renode可能不够准确最终还是要在真实硬件上验证。4. VS Code CMake Renode把整条链路串起来4.1 VS Code里需要装哪些插件VS Code本身只是一个编辑器它的强大来自于插件生态。对于STM32的C开发你需要这几个插件C/CMicrosoft官方提供代码补全、跳转、调试、CMake Tools提供CMake的集成底部状态栏会出现Configure、Build、Debug按钮、Cortex-Debug用于连接ST-Link或者J-Link进行硬件调试、RenodeRenode官方插件可以在VS Code里直接启动仿真。装完CMake Tools之后你打开一个包含CMakeLists.txt的文件夹底部状态栏应该会出现“Configure”按钮。如果没有出现检查一下你的CMakeLists.txt文件名是否拼写正确以及CMake Tools插件是否已经激活。有时候你需要按CtrlShiftP然后输入CMake: Configure来手动触发。4.2 一个可以直接抄的CMakeLists.txt模板下面这个CMakeLists.txt是我在实际项目中反复打磨过的针对STM32F103使用HAL库支持C和C混合编译cmake_minimum_required(VERSION 3.20) project(stm32f103_cpp C CXX ASM) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(TOOLCHAIN_PREFIX arm-none-eabi-) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g) set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}gcc) set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size) set(MCU_FLAGS -mcpucortex-m3 -mthumb) set(CMAKE_C_FLAGS ${MCU_FLAGS} -Wall -Wextra -Os -ffunction-sections -fdata-sections) set(CMAKE_CXX_FLAGS ${MCU_FLAGS} -Wall -Wextra -Os -fno-exceptions -fno-rtti -ffunction-sections -fdata-sections) set(CMAKE_EXE_LINKER_FLAGS ${MCU_FLAGS} -T${CMAKE_SOURCE_DIR}/STM32F103C8Tx_FLASH.ld -Wl,--gc-sections --specsnosys.specs -Wl,-Map${PROJECT_NAME}.map) include_directories( ${CMAKE_SOURCE_DIR}/Core/Inc ${CMAKE_SOURCE_DIR}/Drivers/STM32F1xx_HAL_Driver/Inc ${CMAKE_SOURCE_DIR}/Drivers/CMSIS/Device/ST/STM32F1xx/Include ${CMAKE_SOURCE_DIR}/Drivers/CMSIS/Include ) file(GLOB_RECURSE SOURCES ${CMAKE_SOURCE_DIR}/Core/Src/*.c ${CMAKE_SOURCE_DIR}/Core/Src/*.cpp ${CMAKE_SOURCE_DIR}/Drivers/STM32F1xx_HAL_Driver/Src/*.c ${CMAKE_SOURCE_DIR}/startup_stm32f103xb.s ) add_executable(${PROJECT_NAME}.elf ${SOURCES}) set(HEX_FILE ${PROJECT_NAME}.hex) set(BIN_FILE ${PROJECT_NAME}.bin) add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} -O ihex $TARGET_FILE:${PROJECT_NAME}.elf ${HEX_FILE} COMMAND ${CMAKE_OBJCOPY} -O binary $TARGET_FILE:${PROJECT_NAME}.elf ${BIN_FILE} COMMAND ${CMAKE_SIZE} $TARGET_FILE:${PROJECT_NAME}.elf )这个模板里有几个关键点需要解释。-fno-exceptions和-fno-rtti是为了减小代码体积嵌入式环境里异常和运行时类型信息通常用不上关掉可以省不少Flash。--specsnosys.specs告诉链接器不要链接系统调用相关的代码因为裸机环境没有操作系统。-Wl,--gc-sections配合-ffunction-sections -fdata-sections可以移除未使用的函数和数据进一步减小体积。4.3 从零到点灯一个完整的C闪烁程序有了上面的CMake模板你可以写一个C版本的闪烁程序。注意STM32的HAL库是C语言写的所以在C里调用HAL函数需要用extern C包裹头文件#include stm32f1xx_hal.h extern C void SysTick_Handler(void) { HAL_IncTick(); } class Led { public: explicit Led(GPIO_TypeDef* port, uint16_t pin) : port_(port), pin_(pin) {} void init() { GPIO_InitTypeDef cfg{}; cfg.Pin pin_; cfg.Mode GPIO_MODE_OUTPUT_PP; cfg.Pull GPIO_NOPULL; cfg.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(port_, cfg); } void toggle() { HAL_GPIO_TogglePin(port_, pin_); } private: GPIO_TypeDef* port_; uint16_t pin_; }; int main() { HAL_Init(); __HAL_RCC_GPIOC_CLK_ENABLE(); Led led(GPIOC, GPIO_PIN_13); led.init(); while (true) { led.toggle(); HAL_Delay(500); } }这个程序用了一个简单的Led类来封装GPIO操作。你可能会问嵌入式里用类会不会有额外开销对于这种简单的封装编译器会完全内联生成的汇编代码和纯C版本一模一样。C的零开销抽象原则在嵌入式里是成立的前提是你不要用虚函数、异常、RTTI这些重量级特性。编译这个程序只需要在VS Code里按一下CMake Tools的Build按钮或者在终端里执行cmake -B build -DCMAKE_BUILD_TYPERelease cmake --build build如果一切顺利你会在build目录下看到stm32f103_cpp.elf、.hex和.bin文件。arm-none-eabi-size会告诉你Flash和RAM的占用情况一个点灯程序大概占2KB到4KB的Flash具体取决于HAL库的版本和优化等级。5. 踩坑实录那些教程里不会告诉你的问题5.1 CMake找不到编译器怎么办这是新手遇到的第一个拦路虎。你在VS Code里点了Configure结果CMake报错说“No CMAKE_C_COMPILER could be found”。原因通常是arm-none-eabi-gcc没有加到系统PATH里或者CMake Tools插件没有读取到正确的工具链设置。解决方法分两步。第一步在终端里执行arm-none-eabi-gcc --version确认编译器本身能运行。如果这一步就失败了说明PATH没配好你需要把工具链的bin目录加到环境变量里。第二步如果终端里能运行但VS Code里不行在.vscode/settings.json里加上{ cmake.generator: Ninja, cmake.configureSettings: { CMAKE_TOOLCHAIN_FILE: ${workspaceFolder}/cmake/arm-gcc-toolchain.cmake } }然后创建一个arm-gcc-toolchain.cmake文件把编译器路径写死set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR cortex-m3) set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER arm-none-eabi-g) set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)最后一行CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY很关键。CMake默认会尝试编译一个可执行文件来验证编译器是否工作但嵌入式编译器在没有链接脚本的情况下会报错。设置成STATIC_LIBRARY之后CMake只编译一个静态库不会触发链接就能顺利通过检查。5.2 Renode加载ELF失败是什么原因Renode报“Failed to load ELF”通常有三个原因。第一ELF文件的路径不对Renode的工作目录和你想象的不一样。你可以在Renode控制台里用pwd命令查看当前目录然后用绝对路径加载。第二ELF文件本身有问题比如链接脚本里的内存地址和Renode平台描述文件里的地址不匹配。第三ELF文件太大超过了Renode平台描述里定义的Flash大小。排查方法先用arm-none-eabi-readelf -h your.elf看一下入口地址和程序头确认入口地址在Flash范围内STM32F103的Flash从0x08000000开始。然后用arm-none-eabi-size your.elf看一下text段的大小确认没有超过64KB。如果都没问题再检查Renode的.repl文件里Flash的起始地址和大小是否和链接脚本一致。5.3 C全局对象的构造函数不执行这是一个非常隐蔽的坑。在C里全局对象的构造函数会在main之前执行。但在嵌入式环境里启动文件startup_stm32f103xb.s默认只调用__libc_init_array这个函数会遍历.init_array段并调用里面的函数指针。如果你的全局对象构造函数没有被放到.init_array段里它就不会被执行。GCC通常会自动处理这件事但如果你用了-nostartfiles或者自定义了链接脚本可能会破坏这个机制。验证方法在构造函数里翻转一个GPIO用示波器或者Renode的GPIO分析器看有没有变化。如果没有检查链接脚本里有没有正确保留.init_array段.init_array : { . ALIGN(4); __init_array_start .; KEEP(*(.init_array*)) __init_array_end .; . ALIGN(4); } FLASH注意在嵌入式C里全局对象的构造函数执行时机是不确定的取决于链接顺序所以不要在一个全局对象的构造函数里依赖另一个全局对象。最好的做法是避免使用全局对象改用静态局部变量或者显式初始化函数。5.4 常见问题速查表问题现象可能原因排查方法CMake Configure失败编译器不在PATH终端执行arm-none-eabi-gcc --version编译报错undefined reference to _exit缺少--specsnosys.specs检查链接选项Renode加载ELF后CPU不运行入口地址错误readelf -h查看Entry pointGPIO不翻转时钟未使能检查__HAL_RCC_GPIOx_CLK_ENABLE()程序体积过大未开启优化或未移除未使用段检查-Os和--gc-sectionsVS Code没有Configure按钮CMake Tools未激活CtrlShiftP执行CMake: Configure6. 从“不让写代码”到“停不下来写代码”6.1 这套流程跑通之后你实际获得了什么当你把CMake、VS Code、Renode这条链路跑通之后你获得的不只是一个能编译的工程。你获得的是一套可复用、可扩展、可自动化的开发环境。下次你开一个新项目只需要复制CMakeLists.txt和链接脚本改一下芯片型号和源文件列表五分钟就能搭好骨架。你想在GitHub Actions里自动编译固件加一个workflow文件就行。你想在Renode里跑回归测试写一个.resc脚本每次提交代码自动执行。更重要的是你对整个构建过程有了完全的控制权。你知道每一个编译选项的含义你知道链接脚本里每一行的作用你知道ELF文件里有什么。这种掌控感是Keil和CubeIDE给不了的因为那些IDE把太多东西藏在了图形界面后面。6.2 后续可以往哪个方向扩展这套环境搭好之后你可以往几个方向深入。第一个方向是RTOS把FreeRTOS或者RT-Thread集成进来用CMake管理RTOS的源文件和配置。第二个方向是单元测试用Google Test或者Unity在PC上测试你的纯逻辑代码用Renode测试和硬件相关的代码。第三个方向是USB设备开发STM32F103的USB外设配合HAL库可以实现虚拟串口、HID设备、Mass Storage等功能这些都可以在Renode里部分模拟。第四个方向是通信协议SPI、I2C、CAN这些协议在Renode里都有对应的模型你可以写代码驱动虚拟外设观察寄存器级别的交互。6.3 我个人的一些习惯我自己的习惯是每开一个新项目先不写任何业务代码而是先写一个最小的“Hello World”——通常就是点灯或者串口输出。这个最小程序的作用是验证工具链、验证时钟配置、验证下载和调试链路。只有这个最小程序跑通了我才会开始写真正的业务逻辑。这个习惯帮我省了无数时间因为如果最小程序都跑不通那问题一定在环境上而不是在业务代码上。另外我强烈建议你把.vscode目录和CMakeLists.txt一起提交到Git仓库。.vscode/settings.json里可以配置CMake的生成器、调试配置、代码格式化规则这样团队里每个人打开项目都能得到一致的开发体验。.vscode/launch.json里可以配置Cortex-Debug的连接参数按F5就能直接烧录和调试不需要手动打开ST-Link Utility。最后再分享一个小技巧在CMakeLists.txt里加一个自定义目标用arm-none-eabi-objdump生成反汇编文件方便你对照C源码和汇编代码理解编译器到底把你的代码优化成了什么样子。命令大概是这样的add_custom_target(disasm COMMAND ${TOOLCHAIN_PREFIX}objdump -d -S ${PROJECT_NAME}.elf ${PROJECT_NAME}.asm DEPENDS ${PROJECT_NAME}.elf )然后在终端里执行cmake --build build --target disasm就能在build目录下看到带源码注释的反汇编文件。这个文件对于理解C的零开销抽象、排查性能瓶颈、以及学习ARM汇编都非常有帮助。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

waifu2x 实战指南:基于 Torch7 的动漫风格图像超分辨率与降噪完整教程 2026/9/30 2:04:16

waifu2x 实战指南:基于 Torch7 的动漫风格图像超分辨率与降噪完整教程

计算机视觉深度学习 【免费下载链接】waifu2x Image Super-Resolution for Anime-Style Art 项目地址: https://gitcode.com/gh_mirrors/waifu/waifu2x 点击查看 免费下载 waifu2x 是一个使用深度卷积神经网络(DCNN)对动漫风格插画进行图像超…

阅读更多 →
基于RAG的制造业生产排程助手系统设计毕业设计(源码+lw+部署文档+讲解等) 2026/9/30 2:04:16

基于RAG的制造业生产排程助手系统设计毕业设计(源码+lw+部署文档+讲解等)

博主介绍:✌ 专注于VUE,小程序,安卓,Java,python,物联网专业,有18年开发经验,长年从事毕业指导,项目实战✌选取一个适合的毕业设计题目很重要。✌关注✌私信我✌具体的问题,我会尽力帮助你。一、…

阅读更多 →
信息越来越多以后,我反而开始重新看长内容了 2026/9/30 2:04:16

信息越来越多以后,我反而开始重新看长内容了

信息越来越多以后,我反而开始重新看长内容了这两年我有一个很明显的变化。以前打开手机,总觉得自己看了很多东西。短视频刷了一轮,社交平台看了一圈,几个新闻标题扫过去,到了晚上甚至会有一种“今天信息量很大”的感觉…

阅读更多 →
兰溪旧房翻新哪家好?先搞清诉求再选装企 2026/9/30 2:03:49

兰溪旧房翻新哪家好?先搞清诉求再选装企

问兰溪旧房翻新哪家好,其实没有标准答案,全看你的核心诉求是什么。怕中途停工断料,就找自带仓储和总代资质的。怕预算超支,盯紧主打闭口合同和直管工人的本地老牌。要是老房户型奇葩需要大改,得找有大型设计团队支撑的…

阅读更多 →
Arduino ESP32 新手环境搭建完整指南:30 分钟点亮开发板并看到串口输出 2026/9/30 2:03:43

Arduino ESP32 新手环境搭建完整指南:30 分钟点亮开发板并看到串口输出

Arduino ESP32 新手环境搭建完整指南:30 分钟点亮开发板并看到串口输出 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 Arduino ESP32 是乐鑫为 ESP32 全系芯片…

阅读更多 →
Detectron 目标检测研究平台全解析:架构、算法、安装、推理与训练实战指南 2026/9/30 2:03:43

Detectron 目标检测研究平台全解析:架构、算法、安装、推理与训练实战指南

计算机视觉深度学习 【免费下载链接】Detectron FAIRs research platform for object detection research, implementing popular algorithms like Mask R-CNN and RetinaNet. 项目地址: https://gitcode.com/gh_mirrors/de/Detectron 点击查看 免费下载 导读&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉