新闻详情

新闻详情

首页 / 资讯中心 / 详情

STM32嵌入式C++实战:从点灯到验证代码真正在板子上运行

发布时间:2026/9/26 12:54:29来源:尧图网络
STM32嵌入式C++实战:从点灯到验证代码真正在板子上运行
你说灯在闪可板子呢——这话我太熟了。入行头两年我带过好几个刚接触STM32的同事每次写完程序编译下载总有人指着板子上的LED兴奋地喊灯亮了灯在闪结果我走过去一看好家伙板子压根就没连电源闪的是开发板上那颗电源指示灯。这个场景几乎成了嵌入式新手的第一道坎看得到灯在闪却不清楚代码到底跑在哪、怎么确认它真的跑在自己那块板子上。这件事要彻底搞清楚得从STM32的开发链路说起。这篇文章是基于STM32的嵌入式C编程之旅的第三篇我不打算继续堆语法、抄寄存器而是把从点亮一盏灯到确认这盏灯真的由你的代码控制这条完整链路掰开揉碎讲清楚。适合刚看完教程准备自己动手、或者已经能点灯但总感觉心里没底的读者也适合那些想从C过渡到C做嵌入式的朋友。核心就一句话灯在闪不算数你得知道它为什么闪、谁让它闪、怎么证明是代码让它闪。1. 先搞清楚灯在闪的三层含义1.1 电源灯、状态灯、用户灯的区分很多人第一次拿到开发板插上USB线板子上一颗蓝色或绿色的灯就开始常亮或闪烁。这时候新手容易兴奋以为程序已经跑起来了。实际上绝大多数开发板上的电源指示灯、充电指示灯、甚至Bootloader状态灯都是硬件直接驱动的跟你的代码没有半毛钱关系。以最常见的STM32最小系统板为例板上通常有电源指示灯PWR常亮、状态指示灯有些板子叫LED但默认是接在3.3V和地之间上电就亮不经过GPIO、以及用户可编程LED一般标注为PC13或者PA5这类引脚名。只有最后一种才真正归你管。我见过不少初学者程序下载了半天看到板子上的灯亮着就以为成功了实际上要么是编译报错没下载进去要么是下载了但代码里根本没配置GPIO灯亮的完全是硬件默认行为。所以拿到板子第一件事去看原理图或者丝印搞清楚你手里这块板子上到底有几颗灯、每颗灯接在哪个引脚、高电平点亮还是低电平点亮。1.2 程序在跑和用户代码在跑是两码事STM32上电之后芯片内部有一个固化在ROM里的Bootloader引导程序它会根据BOOT0和BOOT1引脚的电平状态决定是从Flash启动、从系统存储器启动还是从RAM启动。默认情况下BOOT0拉低从主Flash启动这时候如果Flash里恰好有上一次烧录的代码它就跑起来了如果Flash是空的芯片就进入一种空转状态——时钟在跑、外设在复位状态灯当然不会由代码控制。还有一个更隐蔽的情况就算你的代码真的烧进去了程序也真的在跑但你操作的不是你以为是的那颗灯。比如STM32F103C8T6最小系统板上PC13接了板载LED而PA1可能也连了一个LED很多人的代码操作的是PA1看到PC13在闪就误以为程序是自己写的那个逻辑在起作用。这种灯在闪但不是你的灯的情况比灯不闪更让人头疼。1.3 真正判断代码是否运行的三个标准要确定代码真的在跑而且跑的是你的代码我个人的习惯是看三件事第一编译输出窗口里有没有0 Error(s), 0 Warning(s)程序下载完成后有没有提示Flash download: Programmed successfully之类的信息。第二把代码里的点灯逻辑改成先亮1秒、灭1秒、再亮2秒、灭0.5秒这种不规则节奏如果灯完全按照你的节奏走那基本能确认程序在跑。第三把调试器ST-Link或J-Link连上在Keil或STM32CubeIDE里做在线仿真单步执行时看GPIO对应寄存器比如ODR、BSRR的数值变化这是最直接、最不容辩驳的证据。2. 嵌入式C编程为什么值得做2.1 C语言点灯的局限大多数入门教程教你点灯用的是C语言代码大概长这样#include stm32f1xx_hal.h int main(void) { HAL_Init(); __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin GPIO_PIN_13; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, GPIO_InitStruct); while (1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500); } }这段代码能跑但有个问题你每次操作LED都得记住LED在GPIOC的Pin13如果项目里有三颗灯你就得记住三组引脚编号。代码稍微一多到处都是GPIOC、GPIO_PIN_13这种魔法数字改一个引脚要全局搜索替换改漏了就是硬件上反复试错。2.2 C封装带来的是心智负担下降用C写嵌入式的核心理由不是C比C高级而是C的封装能力能让你的代码贴合硬件对象的心智模型。LED是一个对象按键是一个对象串口是一个对象——你操作的不是一堆寄存器而是对象的方法。#include stm32f1xx_hal.h class Led { public: Led(GPIO_TypeDef *port, uint16_t pin) : m_port(port), m_pin(pin) { // 初始化引脚 GPIO_InitTypeDef init {0}; init.Pin pin; init.Mode GPIO_MODE_OUTPUT_PP; init.Pull GPIO_NOPULL; init.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(port, init); } void on() { HAL_GPIO_WritePin(m_port, m_pin, GPIO_PIN_SET); } void off() { HAL_GPIO_WritePin(m_port, m_pin, GPIO_PIN_RESET); } void toggle() { HAL_GPIO_TogglePin(m_port, m_pin); } private: GPIO_TypeDef *m_port; uint16_t m_pin; }; int main() { HAL_Init(); __HAL_RCC_GPIOC_CLK_ENABLE(); Led led(GPIOC, GPIO_PIN_13); while (1) { led.toggle(); HAL_Delay(500); } }注意看Led这个类构造函数里完成初始化on、off、toggle三个方法对应三种操作。以后项目里要用LED只需要创建对象调用方法不需要关心底层寄存器怎么操作。这就是面向对象在嵌入式里的意义——不是炫技是降低出错的概率。2.3 C编译进STM32需要知道的几个前提很多人不敢在STM32里用C其实没必要怕但有三个前提要心里有数。第一编译器要支持C。Keil MDK用的是ARMCC或者AC6ARM Compiler 6默认支持C新建工程时把源文件后缀改成.cpp编译器就会按C语法处理。STM32CubeIDE用的是GCC for ARM同样支持C把文件后缀改成.cpp就行。第二C库和C库混用时要加extern C。STM32的HAL库、标准外设库都是用C写的在C文件里调用时要在头文件包含处加上extern C {}告诉链接器这些函数按C的方式链接。很多人第一次写C的STM32程序编译报一堆undefined reference八成就是漏了这一步。第三main函数在C里同样可以定义但注意启动文件startup_stm32f10x_hd.s之类里调用main之前C的全局对象构造函数需要被调用。Keil MDK和GCC工具链都已经处理好了__libc_init_array这类初始化逻辑直接用就行不需要你额外操心但前提是你别去改启动文件里和初始化相关的部分。3. 完整实操从新建工程到确认灯在闪3.1 用Keil MDK建立带C的STM32工程这里我以STM32F103C8T6最小系统板为例IDE用Keil MDK 5芯片包是Keil.STM32F1xx_DFP。如果你用的是STM32CubeIDE操作路径类似思路完全通用。新建工程的标准流程是Project - New uVision Project选芯片型号STM32F103C8然后会弹出Manage Run-Time Environment窗口这里什么都不用勾选直接点OK——因为我们要自己添加HAL库源文件不用Runtime环境里的组件。接下来是关键操作在工程的Source Group里新建一个.cpp文件比如main.cpp。右键Source Group - Add New Item to Group在弹窗里文件名填main文件类型选C Source File.cpp。如果选项里看不到C类型直接在文件名字段手动输入main.cppKeil会按后缀识别。然后把HAL库相关的源文件添加进来最少需要这几个stm32f1xx_hal.c、stm32f1xx_hal_cortex.c、stm32f1xx_hal_rcc.c、stm32f1xx_hal_gpio.c、stm32f1xx_hal_flash.c、stm32f1xx_hal_pwr.c以及对应的stm32f1xx_hal_conf.h和stm32f1xx_hal.h头文件路径要配置到Include Path里。记得把stm32f1xx_it.c中断文件和system_stm32f1xx.c也加上后者是系统时钟初始化的灵魂少了他芯片会按默认的8MHz HSIRC跑HAL_Delay会不准。3.2 配置魔术棒C工程最容易踩的三个坑Keil里点工具栏的魔术棒Options for Target这里有三个地方必须检查漏一个都可能导致程序烧进去但不工作。第一个是Output选项卡勾选Create HEX File这样编译后会生成hex文件方便用ST-Link Utility或者FlyMcu烧录。第二个是Debug选项卡在右侧的Use下拉菜单里选择CMSIS-DAP Debugger或者ST-Link Debugger看你的调试器型号然后点旁边的Settings确认能识别到目标芯片如果显示No Target Connected先别急着点下载把SWD连接线拔了重插或者检查板子是否供电。第三个是C/C选项卡在Language Compliance下拉菜单里选择Extended C或者GNU extensions并且不要勾选GNU extensions via gcc以外的奇怪选项保持默认即可。另外这里可以把优化等级从默认的-O0改成-O1甚至-O2但新手阶段建议保持-O0调试时单步执行不容易出诡异问题。我刚开始用C写STM32时遇到过编译完全通过、程序下载成功、但灯就是不闪的情况。查了半天最后发现是Optimization选项被设成了-O3编译器把我那个while(1)循环里的HAL_Delay(500)给优化掉了——字面意义上的优化掉。所以新手阶段优化等级老老实实-O0等代码稳定了再往上提。3.3 C特性在GPIO控制上的实战应用回到点灯这个场景我们用C写一个更完整的例子用两个LED体现板子真的在跑你的代码因为单颗LED闪烁只能证明程序在跑无法区分是复位循环还是你的逻辑在跑。#include stm32f1xx_hal.h #include cstdint class Led { public: enum class State : uint8_t { OFF 0, ON 1 }; Led(GPIO_TypeDef *port, uint16_t pin, bool activeHigh true) : m_port(port), m_pin(pin), m_activeHigh(activeHigh) { GPIO_InitTypeDef init {0}; init.Pin pin; init.Mode GPIO_MODE_OUTPUT_PP; init.Pull GPIO_NOPULL; init.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(port, init); off(); } void setState(State state) { GPIO_PinState level GPIO_PIN_RESET; if (m_activeHigh) { level (state State::ON) ? GPIO_PIN_SET : GPIO_PIN_RESET; } else { level (state State::ON) ? GPIO_PIN_RESET : GPIO_PIN_SET; } HAL_GPIO_WritePin(m_port, m_pin, level); } void on() { setState(State::ON); } void off() { setState(State::OFF); } void toggle() { GPIO_PinState current HAL_GPIO_ReadPin(m_port, m_pin); HAL_GPIO_WritePin(m_port, m_pin, (current GPIO_PIN_SET) ? GPIO_PIN_RESET : GPIO_PIN_SET); } private: GPIO_TypeDef *m_port; uint16_t m_pin; bool m_activeHigh; }; int main() { HAL_Init(); __HAL_RCC_GPIOC_CLK_ENABLE(); Led ledGreen(GPIOC, GPIO_PIN_13, true); Led ledRed(GPIOC, GPIO_PIN_14, true); uint32_t counter 0; while (1) { ledGreen.toggle(); ledRed.off(); HAL_Delay(300); ledGreen.on(); ledRed.toggle(); HAL_Delay(300); counter; if (counter 10) { // 每10次循环绿灯快闪3下作为活着的信号 for (int i 0; i 3; i) { ledGreen.off(); ledRed.off(); HAL_Delay(100); ledGreen.on(); ledRed.on(); HAL_Delay(100); } counter 0; } } }这个例子里有几处值得新手仔细品的地方。第一个是enum class State这是C11引入的强类型枚举比传统的enum多了作用域和类型安全在头文件里定义枚举值时不会污染全局命名空间。第二个是构造函数里的activeHigh参数很多开发板的LED是低电平点亮引脚为0时灯亮用这个参数可以无感适配不同板子。第三个是toggle里先读当前引脚状态再翻转这比直接用HAL_GPIO_TogglePin更安全因为TogglePin在读取和写入之间有个极短的窗口极端情况下外部干扰可能让状态翻转出错。3.4 编译下载用ST-Link确认程序真正上板编译之前检查一下魔术棒的Output选项卡里Create HEX File是否勾选然后点击编译F7。编译输出窗口里看到0 Error(s), 0 Warning(s)之后接下来进入下载环节。如果你的调试器是ST-LinkKeil里可以直接点LoadF8下载下载完成后按一下板子上的复位键程序就开始跑了。如果下载时提示No Target Connected或者Error: Flash Download failed先用ST-Link Utility这个工具点击Connect看能不能识别到芯片。如果识别到了再用Target - Erase All把Flash擦除干净然后重新回到Keil下载。如果连ST-Link Utility都识别不到检查驱动设备管理器里看ST-Link是否显示正常没有就重装ST-Link驱动或者换个USB口、换根数据线——很多网上的ST-Link无法使用问题根因就是用了只能充电不能传数据的USB线。下载成功之后我强烈建议你做一个动作把板子完全断电拔掉USB线等两秒重新上电。观察LED是否在跑你的代码。这个动作能排除程序确实在跑但只是因为你下载那一刻芯片恰好被调试器拉进了运行状态这种假象确保代码是真正烧进了Flash上电自己就能跑。4. 常见问题与排查技巧实录4.1 为何烧录成功但灯不闪、不在预期引脚上闪先说最常见的一种代码烧录成功灯也亮了但亮的方式和你想的不一样。这时候先别急着怀疑硬件先回去看原理图确认你操作的引脚到底接在哪颗灯上。我踩过一次很典型的坑——某个板子的板载LED接在PB2而非PC13我和另一个同事各写各的程序程序里用的都是自己以为的引脚结果两人都在问为什么我的程序让灯闪了你的却没反应最后发现我们俩控制的是同一颗灯只是分别用了两个不同的引脚定义代码逻辑互相覆盖了。第二种常见情况烧录成功、灯完全不亮。先用万用表量LED两端电压正常高电平点亮的话应该能测到3.3V左右。如果电压正常但灯不亮可能是LED本体坏了或者限流电阻虚焊换个引脚、换颗灯试试。如果测到电压一直是0V说明GPIO没有正确输出高电平——检查时钟有没有使能、GPIO初始化有没有执行、引脚号对不对。第三种情况灯亮了但亮度特别暗。这通常是GPIO速度配置不对SPEED设置为LOW时引脚驱动能力弱驱动LED亮度不够。把Speed改成GPIO_SPEED_FREQ_HIGH亮度会明显改善。4.2 Keil用C文件时常见的编译链接错误用C写STM32最经典的一类报错就是Undefined symbol HAL_GPIO_Init或者Undefined symbol SystemInit。这类错误的本质是C和C的链接规则不匹配。C源文件编译出来的符号是_HAL_GPIO_Init而C文件编译后在符号名前面会加类型修饰Name Mangling导致C文件里调用HAL_GPIO_Init时链接器找的是一个修饰过的符号比如_ZN...自然找不到。解决办法是在C文件里包含C头文件之前加上extern Cextern C { #include stm32f1xx_hal.h }如果你不愿意在每个.cpp文件里都写这段也可以建一个专门的C兼容头文件比如chip.hpp#pragma once extern C { #include stm32f1xx_hal.h }然后在所有.cpp文件里只包含chip.hpp这样最干净。另一个常见报错是Error: L6915E: Library reports error: __use_no_semihosting was requested这个多出现在用C标准库函数比如printf、sprintf且重定向了fputc时。解决办法是在工程里添加MicroLIB魔术棒Target选项卡里勾选Use MicroLIB或者在代码里实现_sys_exit、_ttywrch等底层函数。对新手来说直接勾选MicroLIB最省事缺点是浮点打印精度可能受影响但点灯场景无所谓。4.3 仿真调试让灯在闪变成看得见的寄存器跳变软件上确认代码逻辑没问题、硬件上也确认灯会亮之后还有最后一道关卡用调试器单步跟踪观察寄存器级别的变化。这一步能把灯在闪从口号变成看得见摸得着的事实。Keil里点Start Debug SessionCtrlF5进入仿真模式然后打开Peripherals - General Purpose I/O - GPIO C这时候能看到GPIOC的ODR输出数据寄存器的每一位状态。把光标停在led.toggle()这一行按F10单步执行你会看到ODR寄存器的第13位在0和1之间跳变。如果程序走到断点但寄存器没变说明代码逻辑没有真正作用于硬件——常见原因是对象作用域问题比如你在一个构造函数里初始化了LED但那个对象在main里又新建了一个两个对象操作的是不同引脚。还有一种实用技巧在仿真模式下直接修改寄存器的值来验证硬件链路。比如把ODR的bit13手动改1如果LED亮了说明GPIO硬件没问题问题出在代码逻辑如果LED没反应说明硬件链路有断路直接去查原理图。4.4 从C点灯到C做项目的路径建议最终给你一条可执行的学习路径方便你把这篇文章的知识用到下一个项目里。第一把点灯程序跑通之后立刻用C把按键扫描写一遍。把按键也封装成类用中断方式或者轮询方式去处理重点理解C的volatile关键字在中断服务函数里怎么使用以及为什么共享变量要加这个修饰符。第二把串口发送封装成类做一个简单的C流式输出哪怕只是Serial Hello value这种效果能让你体会到操作符重载在嵌入式里的实际用处。第三试着用C写一个简单的状态机比如用enum class定义状态用switch或函数指针表实现状态切换运行起来然后观察状态切换和LED闪灯节奏的对应关系。这一步做完你基本就具备了用C做嵌入式项目的最小能力集。5. 开发环境与工具链的选型心得5.1 Keil、STM32CubeIDE、PlatformIO怎么选这个系列前三篇写下来后台经常有读者问开发环境选哪个好我在这里一次性说清楚。Keil MDK是老牌、稳定、生态成熟绝大多数STM32教程、公司项目都在用它。它的缺点是界面老旧、代码提示弱、License管理麻烦。STM32CubeIDE是ST官方出品基于Eclipse免费代码提示比Keil好内置了CubeMX图形化初始化配置工具适合新项目从零开始。PlatformIO则是VSCode插件生态用GCC工具链配置灵活适合喜欢折腾、对编辑器体验要求高的人。我个人的建议是如果你有网上的教程和例程作为基础用Keil最稳因为遇到问题搜索引擎里答案最多如果你是全新的项目用STM32CubeIDE效率更高如果你以后打算做Linux嵌入式或者需要较多第三方库PlatformIO会让你更省心。三个工具切换成本不高核心知识和思路完全通用。5.2 调试器选择ST-Link V2是最实用的选择调试器方面STM32全系列通用的是ST-Link V2价格便宜几十块钱、性能足够、驱动成熟。J-Link也不错但STM32上用J-Link的性价比不高除非你同时调试别的ARM芯片。还有一个选择是板载DAP-Link很多国产开发板自带但驱动兼容性不如ST-Link稳定。值得单独说的是调试器的接线SWD只需四根线SWDIO、SWCLK、GND、3.3V有的板子可以不用接3.3V但建议接上避免适配问题。SWDIO和SWCLK分别对应芯片的PA13和PA14这两个引脚默认就是调试功能如果你在这两个引脚上接了外部电路比如按键上拉之类可能导致调试器连接不稳定连接失败时可以先把外设断开再试。5.3 常见板子消失类问题的系统排查方法这篇文章标题叫你说灯在闪可板子呢其实还有一层意思是代码连着连着设备管理器里板子不见了。这类问题排查有固定套路按顺序来基本不踩坑。第一换USB线、换USB口。优先用机箱后置USB口避开USB Hub。第二打开设备管理器看有没有Unknown Device或者带黄色感叹号的设备如果是卸载设备后果断重装驱动。第三按住板子的复位键不放再点击下载有时候能救回来。第四如果是STM32的SWD引脚被你的代码禁用掉了比如你把它配置成了普通GPIO可以用串口ISP方式把Flash擦除把BOOT0接高电平按复位用FlyMcu通过串口1连接擦除Flash然后把BOOT0接回低电平按复位芯片就恢复可下载状态了。最后说一种情况芯片完全没反应、发热、电流偏大——这是硬件级别的问题别浪费时间在软件上直接换板子或者检查短路。STM32F103C8T6这种芯片便宜备两三块在手里坏了不心疼排查效率反而更高。6. 让灯在闪变成代码在跑的最后一公里整个系列到第三篇核心已经从写代码转移到了确认代码真的在硬件上跑起来。你知道LED为什么闪知道怎么用C写一个干净的LED驱动知道编译下载后怎么验证程序真的烧进去了还知道一旦板子消失该怎么排查。这些能力拼在一起才算真正迈进了嵌入式开发的门。个人体会最深的一点是用C写嵌入式快捷键和调试器比语法更重要。语法慢慢就会了但能不能看到寄存器跳变能不能在调试器里暂停、修改变量、继续运行才是决定排错效率的关键。建议你多花点时间熟悉Keil的调试界面比如Call Stack窗口、Watch窗口、Peripherals视图。这些工具用熟了比多背几条语法规则有用得多。最后分享一个小技巧写完点灯程序在main循环里故意写一个变量自增然后不优化编译用调试器跑设置条件断点——当计数到100时停下来。能熟练做到这一步说明你已经具备用C在STM32上排查逻辑问题的基本功了。下一次灯再闪的时候你能拍着胸脯说对这板子我确认过了就是我的代码在闪。
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

闲鱼商品爬虫实战:接口签名、登录态与关键词监控落地指南 2026/9/26 12:54:25

闲鱼商品爬虫实战:接口签名、登录态与关键词监控落地指南

简介:一份面向计算机专业课程设计与毕业设计场景的闲鱼商品爬虫及可视化项目,基于FastAPI与Vue实现xianyu二手平台数据抓取、接口服务与前端展示,覆盖数据采集、后端服务、前端可视化等环节,适合教师、学生用于课程设计、期末大作…

阅读更多 →
SAM提示框融合U-Net:息肉分割边缘精度的实用方案 2026/9/26 12:54:25

SAM提示框融合U-Net:息肉分割边缘精度的实用方案

简介:面向医学图像处理研究者与深度学习开发者的Unet改进方案资源,通过引入SAM提示框机制针对性提升息肉肿瘤语义分割精度。资源包内含2000个文件,以1992张jpeg医学图像数据集为主体,附带5个py源码文件、2个txt说明及1个readme文档…

阅读更多 →
VIN码识别实战:Pascal VOC XML数据集解析与YOLOv8训练 2026/9/26 12:54:18

VIN码识别实战:Pascal VOC XML数据集解析与YOLOv8训练

简介:面向车辆信息数字化与自动识别场景,这套带标注的VIN码车架号识别数据集,覆盖2795张车辆图片对应的区域标注信息,压缩包内为2000个Pascal VOC格式的XML标注文件,可用于训练YOLO、Faster R-CNN等目标检测模型&#…

阅读更多 →
大模型API提示词缓存实战指南:从原理到企业级落地 2026/9/26 12:54:18

大模型API提示词缓存实战指南:从原理到企业级落地

1. 先说结论:GPT-6 API 提示词缓存根本不存在,但这个误传背后藏着真实痛点“OpenAI 改进 GPT-6 API 提示词缓存”——看到这个标题,我第一反应是点开查证,结果翻遍 OpenAI 官方博客、开发者文档、GitHub 仓库更新日志,…

阅读更多 →
2026实测可用的4个真免费AI接口清单 2026/9/26 12:54:18

2026实测可用的4个真免费AI接口清单

1. 这不是“免费午餐”,而是开发者真实可用的AI接口实践清单“好用!4种真免费的AI接口整理(2026更新版)”——这个标题里藏着一线开发者最常被问到的三个痛点:“好用”指开箱即用、低延迟、高稳定性,不是de…

阅读更多 →
Atlas 300V部署YOLO全流程:推理加速卡实操与避坑指南 2026/9/26 12:54:11

Atlas 300V部署YOLO全流程:推理加速卡实操与避坑指南

Atlas 300V 24G,是不是一块运算加速卡?这种问题最近我被问过很多次,答案很直接:是,而且是一块专门干推理这活的加速卡,不是拿来训练模型的。很多人第一次见到它,都因为它长得像一块普通的PCIe显…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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