STM32开发板入门实战:从点亮LED到串口通信完整指南 1. 万利STM32开发板开箱与初体验刚拿到一块新的开发板那种想立刻通电看看它“跑”起来的心情相信每个搞硬件的朋友都懂。万利Manley的这块STM32F103ZE评估板对于刚接触STM32或者从51、AVR转过来的工程师来说是个非常不错的起点。板子资源丰富集成ST-LINK调试器还自带一个演示程序让你拆箱即玩快速建立信心。这篇文章我就结合自己上手调试和开发的过程把从点亮第一个灯到跑起第一个自定义程序的完整路径以及中间那些容易踩坑的细节给你捋清楚。板子到手最显眼的就是那块液晶屏和周围密密麻麻的按键、LED。别被吓到我们一步步来。首先找到供电口。板子上有两个USB口这是第一个关键点左边那个当板子上的串口座朝上时是ST-LINK调试器的USB口右边那个才是STM32主芯片的USB口。很多新手会插错导致电脑识别不到设备或者板子没反应。旁边有一个黑色的跳线帽标识为CN2它决定了板子的供电来源。如果你要连接电脑进行调试和下载程序务必把CN2跳到靠近ST-LINK USB口的那一侧即VDD来自ST-LINK。这样只需要一根USB线连接左边的ST-LINK口就能同时给整个板子供电并建立调试连接非常方便。如果你要测试板载的USB功能比如做一个USB设备才需要把CN2跳到右边并使用右边的USB口供电。接好线上电出厂程序应该就跑起来了。屏幕会显示信息按键和LED也会有反应。你可以按按各个键看看屏幕变化特别是转动那个蓝色的多圈电位器VR1屏幕上的ADC采样值会跟着变化这是直观感受模拟量输入的好机会。这个“爽一把”的过程很重要它能快速验证你的硬件连接是正常的为后续自己写代码扫清硬件故障的障碍。2. 开发环境搭建与驱动安装要点玩够了演示程序手痒想自己写代码了工欲善其事必先利其器。对于STM32开发IAR Embedded WorkbenchEWARM是一个经典且强大的选择。万利板的光盘里通常提供了特定版本的IAR安装包比如资料里提到的EWARM-KS-442A。我的建议是即使你从官网下载了更新版本也最好先使用板商提供的这个版本因为其附带的例子工程、库文件都是基于这个版本构建的可以最大程度避免因编译器版本差异导致的兼容性问题。安装过程就是典型的Windows软件安装一路“Next”即可注意选择安装路径不要有中文。安装完IAR事情只完成了一半。接下来是ST-LINK驱动这是连接电脑和板子的桥梁没装好后面一切调试都无从谈起。这里有个很有趣的现象当你用USB线连接板子的ST-LINK口后电脑可能会把它识别为一个“可移动磁盘”U盘。别惊讶你没插错这确实是ST-LINK的一个特性。这个“U盘”是只读的里面通常存放了ST-LINK的固件信息或文档。即使这个磁盘出现了也不代表驱动已经正确安装。正确的驱动安装方法是找到光盘或资料包里的EWARM_Driver文件夹运行里面的installSTLink.exe程序。安装成功后你可以在Windows的设备管理器中看到“STMicroelectronics STLink dongle”之类的设备而没有感叹号。注意如果安装驱动后IAR依然找不到设备可以尝试先断开USB线重新插拔一次或者以管理员身份运行IAR。有时Windows的自动驱动更新会干扰如果设备管理器里显示的是“USB大容量存储设备”可以尝试右键卸载设备并勾选“删除此设备的驱动程序软件”然后重新运行installSTLink.exe。驱动搞定后我强烈建议把板子配套的例子程序包也装上。路径通常在EK BOARD\EKSTM32F目录下运行EKSTM32F_examples.exe把它安装到你指定的目录比如D:\Manley\EKBoard。这些例子是绝佳的学习素材涵盖了GPIO、LCD、ADC、定时器、串口、USB等几乎所有板载资源工程配置都是现成的能帮你节省大量搭建工程框架的时间。3. 第一个工程编译、下载与调试实战环境搭好了我们来点真格的。打开IAR通过菜单File-Open-Workspace导航到你安装例子程序的目录找到一个具体的工程文件。例如我们可以打开LCD演示工程...\EKSTM32F\LCDDemo(lcdledbuttom)\LCDDemo\project\EWARM\LCDDemo.eww。打开工程后左侧Workspace会显示工程结构。首先我们点击工具栏上的“Make”按钮或按F7进行编译。如果一切顺利下方Build窗口会显示Total number of errors: 0。这是成功的第一步。接下来点击“Download and Debug”按钮或按CtrlDIAR会启动调试器并将编译好的程序下载到板载STM32的Flash中。这个过程会弹出一个进度对话框。下载完成后程序会暂停在main函数的入口处。这时点击“Go”按钮或按F5程序就开始全速运行了你应该能看到LCD屏幕被点亮并显示预设的字符。按一下板上的KEY2和KEY3可以控制LED的亮灭。这就是调试模式你可以控制程序的运行全速、单步、暂停并实时观察硬件状态。想停止调试回到代码编辑状态就点击“Stop Debugging”按钮。至此你完成了从编译到下载再到调试的完整闭环。这个流程是后续所有开发的基础务必熟练掌握。4. 动手修改实现一个简单的流水灯看懂了别人的例子最好的学习方式就是动手改。我们就以刚才的LCDDemo工程为基础给它增加一个流水灯功能。查看原理图资料里找或者看板子丝印可知LED2~LED5分别连接在STM32的PC7、PC6、PC5、PC4这四个引脚上。并且在例子工程的main.c中通常已经完成了GPIOC端口的时钟使能和这些引脚的基本初始化配置为推挽输出。我们的目标是在main函数的while(1)主循环里让这四个LED依次点亮形成流水效果。STM32标准外设库提供了非常清晰的函数来控制GPIO引脚输出高低电平GPIO_SetBits(GPIOx, GPIO_Pin_X)将指定引脚设置为高电平对于我们的板子高电平点亮LED。GPIO_ResetBits(GPIOx, GPIO_Pin_X)将指定引脚设置为低电平熄灭LED。思路是用一个静态变量i作为状态机在循环中不断累加根据i的值1~4来决定点亮哪个LED同时熄灭上一个LED。打开main.c找到main函数里的while(1)循环。在循环体内找到合适的位置比如在LCD刷新函数调用之后插入以下代码// 新增的流水灯代码 static u32 i 1; // 静态变量保持值在循环间不变 switch(i) { case 1: GPIO_ResetBits(GPIOC, GPIO_Pin_4); // 熄灭LED5 (PC4) GPIO_SetBits(GPIOC, GPIO_Pin_7); // 点亮LED2 (PC7) break; case 2: GPIO_ResetBits(GPIOC, GPIO_Pin_7); // 熄灭LED2 GPIO_SetBits(GPIOC, GPIO_Pin_6); // 点亮LED3 (PC6) break; case 3: GPIO_ResetBits(GPIOC, GPIO_Pin_6); // 熄灭LED3 GPIO_SetBits(GPIOC, GPIO_Pin_5); // 点亮LED4 (PC5) break; case 4: GPIO_ResetBits(GPIOC, GPIO_Pin_5); // 熄灭LED4 GPIO_SetBits(GPIOC, GPIO_Pin_4); // 点亮LED5 i 0; // 重置循环 break; default: i 0; break; } i; // 状态切换 Delay(1000000); // 加入一个简单的延时函数控制流水速度这里我加入了一个Delay函数调用。你需要自己实现一个简单的忙等待延时函数或者利用STM32的SysTick定时器实现更精确的延时。最简单的忙等待延时可以这样写void Delay(__IO uint32_t nCount) { for(; nCount ! 0; nCount--); }把这个函数定义放在main函数之前。然后修改Delay(1000000)中的参数可以调整流水灯的速度。参数越大延时越久灯亮的时间就越长。代码加好后再次点击编译F7。如果没有错误点击下载调试CtrlD然后全速运行F5。现在你应该能看到四个LED依次循环点亮每个灯亮大约1秒钟。恭喜你你已经完成了对STM32的第一次“编程”实操心得在while(1)循环里加延时要小心。如果延时太长会导致整个循环变慢可能会影响工程里其他的任务比如LCD刷新、按键扫描。在实际项目中我们通常会使用定时器中断来产生精确的时间基准而不是用这种阻塞式的延时。但作为最初级的实验这样写最直观易懂。5. BOOT模式配置与程序启动原理流水灯跑起来了但我们可能还会遇到其他情况比如程序下载不进去或者想用串口下载程序。这就涉及到STM32的启动模式选择由芯片上的BOOT0和BOOT1引脚决定。在万利板上这两个引脚通过跳线帽JP3和JP4引出方便我们配置。JP4 连接 BOOT0JP3 连接 BOOT1通常板子丝印有标注。跳线帽竖插表示将该引脚连接到高电平1横插或不插让引脚悬空板子内部通常有下拉电阻表示低电平0。最常用的三种配置如下BOOT1 (JP3)BOOT0 (JP4)启动模式应用场景0 (横插/不插)0 (横插/不插)从主Flash启动最常用模式。芯片从内部Flash的0x08000000地址开始执行我们下载的程序。1 (竖插)1 (竖插)从内置SRAM启动用于调试。程序被下载到SRAM中运行掉电丢失。适用于需要极快下载速度或临时测试。0 (横插/不插)1 (竖插)从系统存储器启动串口ISP下载模式。芯片运行内置的Bootloader程序等待通过串口1PA9/PA10下载新程序到Flash。99%的正常开发时间JP3和JP4都应该横插即BOOT00 BOOT10让芯片从Flash启动。只有当你需要用串口给一块空芯片下载第一个程序且没有ST-LINK时才需要将JP4竖插BOOT01下载完成后必须记得将JP4改回横插否则下次复位芯片又会进入Bootloader模式而不是运行你Flash里的程序。我遇到过不少新手朋友下载完程序后板子没反应八成就是BOOT0跳线还在“1”的位置。这是一个非常经典的“坑”。6. 外设进阶ADC采样与串口通信实验掌握了GPIO控制就可以尝试更复杂的外设。万利板上的蓝色电位器VR1连接到了STM32的ADC1通道0PA0。板子例子程序里一定有ADC相关的工程。打开一个ADC例子编译下载运行通常它会把采样到的电压值显示在LCD上。你可以试着修改代码比如改变采样频率或者将ADC值通过串口发送到电脑用串口助手查看。串口USART是嵌入式开发中最常用的调试和通信接口。万利板的ST-LINK部分通常还集成了一个USB转串口的功能连接到STM32的USART1PA9为TX PA10为RX。你需要安装这个虚拟串口的驱动可能在EWARM_Driver文件夹里或者叫VCP_V1.4.0_Setup.exe之类的。驱动安装成功后在设备管理器里会看到新的COM口。在IAR工程中初始化USART1配置好波特率如115200、数据位、停止位。然后在主循环里可以调用USART_SendData函数将ADC转换后的数值发送出去。在电脑上打开串口助手如SecureCRT、Putty或免费的XCOM选择对应的COM口设置相同的波特率就能收到来自板子的数据了。将传感器数据ADC值通过串口实时打印出来是调试和验证硬件功能的黄金手段。你可以尝试写一段代码让板子每秒发送一次电位器的电压值和当前流水灯的状态这样你对系统的运行情况就一目了然了。7. 工程管理与代码移植技巧当你开始创建自己的项目而不是在例子工程上修改时良好的工程管理习惯至关重要。我建议的做法是新建工作目录不要在例子工程的原目录直接修改。复制整个例子工程文件夹比如LCDDemo到一个新的路径并重命名为你的项目名如My_Project。理解工程结构用IAR打开新工程在Workspace右键选择“Save Workspace As...”也另存为新名字。观察工程目录通常包含EWARM/ IAR的工程文件、配置、调试和输出文件。Libraries/或STM32F10x_StdPeriph_Driver/ STM32标准外设库文件。CMSIS/ Cortex-M内核抽象层文件。User/ 用户自己的主程序文件main.c,stm32f10x_it.c中断文件等。Project/ 可能存放其他模块文件。清理与重构删除User/目录下你不需要的源文件但保留必要的系统文件如system_stm32f10x.c。在main.c中清空或重写你的代码。这样保持了库文件和工程设置的完整性又有了一个干净的开始。头文件路径设置这是移植时最容易出错的地方。右键点击工程名选择“Options”。在“C/C Compiler”选项的“Preprocessor”标签页检查“Additional include directories”是否正确包含了所有必要的头文件路径如../Libraries/CMSIS../Libraries/STM32F10x_StdPeriph_Driver/inc../User等。路径要用相对路径并用$PROJ_DIR$宏指代工程文件所在目录这样工程移动到别的电脑上也能正常编译。8. 常见问题排查与调试心得实录玩转一块开发板的过程就是不断解决问题的过程。下面是我总结的一些常见问题及排查思路现象可能原因排查步骤IAR编译报错找不到头文件头文件路径未正确设置检查工程Options - C/C Compiler - Preprocessor中的包含路径。确保路径指向实际的库文件目录。点击Debug提示“No debug probe connected”1. ST-LINK驱动未安装或安装失败。2. USB线未连接或接触不良。3. CN2跳线帽未连接到ST-LINK供电端。1. 检查设备管理器确认ST-LINK设备存在且无感叹号。2. 重新插拔USB线尝试换一个USB口。3. 确认CN2跳线帽连接正确。程序下载成功但板子无任何反应1.BOOT0跳线帽在“1”位置竖插。2. 程序未正确运行到主循环如死在启动文件或初始化。3. 硬件复位电路有问题。1.首先检查JP4BOOT0是否为横插这是最高频原因。2. 在IAR调试模式下单步执行看程序能否运行到main函数。3. 按下板子的复位键试试。LED不亮但程序似乎运行正常1. GPIO初始化代码未执行或配置错误如时钟未开启。2. 硬件上LED损坏或限流电阻过大。3. 控制逻辑写反是输出高电平亮还是低电平亮。1. 检查RCC_APB2PeriphClockCmd是否开启了对应GPIO端口的时钟。2. 用万用表测量LED两端电压或直接给对应引脚接3.3V/地测试LED好坏。3. 查看原理图确认LED是共阳还是共阴接法。万利板通常是LED阳极通过电阻接3.3V阴极接MCU引脚所以引脚输出低电平0时LED才亮。但有些例程为了直观可能用GPIO_SetBits高电平点亮这取决于板子设计务必确认串口无法接收数据1. 串口驱动未安装。2. 波特率、数据位、停止位设置与串口助手不匹配。3. USB线插错了口应插ST-LINK口。4. 代码中串口引脚初始化错误。1. 检查设备管理器是否有新的COM口并安装正确驱动。2. 确保代码和串口助手的波特率等参数完全一致。3. 确认使用的是ST-LINK集成的虚拟串口而非主芯片的USB口。4. 检查GPIO_Init时是否将PA9和PA10正确配置为复用推挽输出和浮空输入。调试心得善用调试器不要只把调试器当成下载工具。设置断点、单步执行、查看变量、观察外设寄存器View-Register是理解程序运行逻辑、查找bug的利器。比如你可以单步跟踪GPIO初始化函数看看寄存器的值是否按预期改变了。从简到繁当程序出现复杂问题时尝试创建一个全新的、最简单的工程比如只点亮一个LED先确保最基本的功能通路是通的再逐步添加复杂功能可以快速定位问题模块。阅读数据手册和参考手册STM32的库函数是对寄存器操作的封装。当库函数的行为不符合预期时去翻一翻《STM32F10xxx参考手册》直接查看对应寄存器的描述往往能发现库函数配置的遗漏或错误。比如GPIO的复用功能重映射就需要在开启时钟后额外配置AFIO寄存器。玩转一块开发板核心就是“胆大心细”。大胆地去修改例程尝试自己的想法细心观察现象对照原理图和数据手册分析问题。从点亮一个LED开始到控制ADC、串口通信再到更复杂的定时器中断、PWM、DMA一步步来STM32的世界会向你完全敞开。这块万利板资源足够完全可以作为你深入学习Cortex-M3内核和STM32外设的练兵场。