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入手,资料最多,遇到问题随便一搜就有答案。
1.2 Cortex-M内核架构速览
Cortex-M是ARM专门为微控制器设计的内核。它跟咱们电脑上的Cortex-A(应用处理器)不一样,M系列主打实时性、低功耗、中断响应快。
几个关键点:
- 哈佛架构:指令总线和数据总线分开,取指令和读写数据可以同时进行,效率高。
- Thumb-2指令集:16位和32位指令混编,代码密度高,省Flash空间。
- NVIC(嵌套向量中断控制器):中断优先级可配置,响应速度极快。我做过一个项目,要求中断延迟不超过12个时钟周期,Cortex-M3轻松搞定。
- MPU(内存保护单元):高端型号才有,跑RTOS时用来隔离任务,防止野指针乱写。
下面这张图帮你理清STM32芯片的内部结构:
1.3 Keil MDK安装与配置
Keil MDK是ARM官方推荐的IDE,虽然界面老气了点,但稳定、编译快、调试方便。我这些年一直用它,没换过。
安装步骤很简单,但有几个坑要注意:
- 下载安装包:去Keil官网下载MDK-Arm最新版,或者用我提供的网盘链接。版本建议5.38以上,太老的版本不支持新芯片。
- 安装路径:不要有中文!不要有空格!我见过有人装到“程序文件”目录下,结果编译报错找半天。
- 激活:安装完后需要License。如果你有正版,输入激活码;如果只是学习,可以用评估版(代码限制32KB),或者自己想办法。
- 安装器件包:打开Keil,点击
Pack Installer,找到STMicroelectronics,选择你用的芯片型号(比如STM32F103C8),点击Install。
安装完成后,新建一个工程试试:
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时,说实话,有点震惊。以前配个时钟树要算半天,现在鼠标点几下就搞定了。
快速上手步骤:
- 下载安装:去ST官网下载STM32CubeMX,安装时选好Java环境(它依赖Java运行)。
- 新建工程:点击
New Project,选择芯片型号,比如STM32F103C8Tx。 - 配置引脚:在Pinout视图中,点击你要用的引脚,选择功能。比如PA0设为GPIO_Output。
- 配置时钟:切换到Clock Configuration视图,输入你想要的频率(比如72MHz),它会自动计算分频系数。
- 生成代码:点击
Project → Generate Code,选择IDE为MDK-ARM,填好工程名和路径,点OK。
生成的代码里,main.c 已经帮你初始化好了时钟、GPIO等。你只需要在 while(1) 里写业务逻辑就行。
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秒的频率闪烁,恭喜你,环境搭好了!
好了,第一章的内容就到这里。你学会了STM32的基本概念,装好了Keil和CubeMX,还亲手点了个灯。这些基础打牢了,后面学外设驱动和RTOS移植就会轻松很多。