1. STM32简介与开发环境搭建

大家好,欢迎来到这门实战课。我是你们的讲师,一个在嵌入式领域摸爬滚打了十几年的老工程师。今天咱们从最基础的开端讲起——认识STM32,把开发环境搭起来。

说实话,很多初学者一上来就急着写代码,结果环境没配好,点个灯都报错。我当年也干过这种事,浪费了一整天。所以,咱们先把地基打牢。

1.1 认识STM32系列与Cortex-M内核

STM32是意法半导体(ST)推出的32位ARM Cortex-M微控制器系列。你想想看,为什么它这么火?性能强、功耗低、外设丰富,关键是生态好——资料多、库函数全、开发工具免费。

STM32家族很庞大,但咱们主要关注几个主流系列:

系列 内核 主频 典型应用
STM32F0 Cortex-M0 48 MHz 低成本、简单控制
STM32F1 Cortex-M3 72 MHz 工业控制、电机驱动
STM32F4 Cortex-M4F 168 MHz DSP、浮点运算、物联网
STM32L4 Cortex-M4F 80 MHz 低功耗、电池供电
STM32H7 Cortex-M7 480 MHz 高性能、图形处理

我个人习惯用F1和F4系列做项目。F1性价比高,F4带浮点运算,做传感器数据处理特别方便。你如果刚开始学,建议从F103入手,资料最多,遇到问题随便一搜就有答案。

小提示: Cortex-M内核是ARM设计的,ST只是买了授权然后加了自己的外设。所以,你学的是STM32,但底层逻辑和ARM Cortex-M是通用的。以后换NXP、TI的芯片,上手也快。

1.2 Cortex-M内核架构速览

Cortex-M是ARM专门为微控制器设计的内核。它跟咱们电脑上的Cortex-A(应用处理器)不一样,M系列主打实时性、低功耗、中断响应快。

几个关键点:

  • 哈佛架构:指令总线和数据总线分开,取指令和读写数据可以同时进行,效率高。
  • Thumb-2指令集:16位和32位指令混编,代码密度高,省Flash空间。
  • NVIC(嵌套向量中断控制器):中断优先级可配置,响应速度极快。我做过一个项目,要求中断延迟不超过12个时钟周期,Cortex-M3轻松搞定。
  • MPU(内存保护单元):高端型号才有,跑RTOS时用来隔离任务,防止野指针乱写。

下面这张图帮你理清STM32芯片的内部结构:

STM32芯片内部结构框图 Cortex-M 内核 CPU + NVIC + FPU MPU + 调试接口 总线矩阵 AHB / APB 总线 DMA 控制器 存储系统 Flash / SRAM FSMC 外部存储 外设组1 GPIO / USART / SPI I2C / CAN / USB 外设组2 定时器 / PWM ADC / DAC / 比较器 外设组3 RTC / 看门狗 CRC / 随机数 说明: 内核通过总线矩阵连接存储和外设,DMA可以不经过CPU直接搬运数据,这是实现高性能的关键。
核心要点: STM32 = Cortex-M内核 + 总线矩阵 + 存储 + 丰富外设。你写代码就是通过寄存器或库函数去控制这些外设干活。

1.3 Keil MDK安装与配置

Keil MDK是ARM官方推荐的IDE,虽然界面老气了点,但稳定、编译快、调试方便。我这些年一直用它,没换过。

安装步骤很简单,但有几个坑要注意:

  1. 下载安装包:去Keil官网下载MDK-Arm最新版,或者用我提供的网盘链接。版本建议5.38以上,太老的版本不支持新芯片。
  2. 安装路径:不要有中文!不要有空格!我见过有人装到“程序文件”目录下,结果编译报错找半天。
  3. 激活:安装完后需要License。如果你有正版,输入激活码;如果只是学习,可以用评估版(代码限制32KB),或者自己想办法。
  4. 安装器件包:打开Keil,点击 Pack Installer,找到STMicroelectronics,选择你用的芯片型号(比如STM32F103C8),点击Install。
注意: 我曾经遇到过Pack安装失败的情况,原因是网络问题。解决办法:手动下载Pack文件(.pack格式),双击安装。别问我怎么知道的,折腾了一下午。

安装完成后,新建一个工程试试:

1. Project → New uVision Project
2. 选择芯片型号(如STM32F103C8)
3. 在Manage Run-Time Environment中勾选需要的组件
4. 添加main.c文件
5. 编写代码,编译(F7)

嗯,这里要注意:Keil默认的编译器是ARMCC v5或v6。我建议用v6,编译速度快,生成的代码也更小。在 Project → Options for Target → Target 里可以切换。

1.4 STM32CubeMX初体验

STM32CubeMX是ST官方出的图形化配置工具。说白了,就是帮你自动生成初始化代码,省得你对着数据手册一个个配寄存器。

我第一次用CubeMX时,说实话,有点震惊。以前配个时钟树要算半天,现在鼠标点几下就搞定了。

快速上手步骤:

  1. 下载安装:去ST官网下载STM32CubeMX,安装时选好Java环境(它依赖Java运行)。
  2. 新建工程:点击 New Project,选择芯片型号,比如STM32F103C8Tx。
  3. 配置引脚:在Pinout视图中,点击你要用的引脚,选择功能。比如PA0设为GPIO_Output。
  4. 配置时钟:切换到Clock Configuration视图,输入你想要的频率(比如72MHz),它会自动计算分频系数。
  5. 生成代码:点击 Project → Generate Code,选择IDE为MDK-ARM,填好工程名和路径,点OK。

生成的代码里,main.c 已经帮你初始化好了时钟、GPIO等。你只需要在 while(1) 里写业务逻辑就行。

我的习惯: 先用CubeMX配好所有外设,生成代码,然后在Keil里做二次开发。这样既快又不容易漏配置。但注意,如果你在Keil里手动改了初始化代码,再回CubeMX重新生成,手动改的部分会被覆盖。所以,我一般把业务逻辑写在单独的文件里,不碰CubeMX生成的文件。

1.5 第一个程序:点亮LED

学嵌入式,点灯是仪式感。咱们用CubeMX生成一个点灯程序,验证环境是否搭好。

假设你用的是STM32F103C8T6最小系统板,LED接在PC13(很多板子默认就是这个)。

CubeMX配置:

  • Pinout: PC13设为GPIO_Output
  • Clock: HSE 8MHz,PLL倍频到72MHz
  • Project: 生成MDK-ARM工程

生成后,在Keil里打开,找到 main.c,在 while(1) 里加上:

HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(500);  // 延时500ms

编译、下载(用ST-Link或串口ISP),如果LED以1秒的频率闪烁,恭喜你,环境搭好了!

避坑指南: 我曾经遇到过下载后LED不亮的情况。检查了半小时,发现是ST-Link的驱动没装好。解决办法:去ST官网下载ST-Link驱动,或者用Zadig工具重装驱动。另外,检查一下板子的供电,有些最小系统板需要跳线帽选择供电方式。

好了,第一章的内容就到这里。你学会了STM32的基本概念,装好了Keil和CubeMX,还亲手点了个灯。这些基础打牢了,后面学外设驱动和RTOS移植就会轻松很多。