STM32 嵌入式开发入门

1.5k 词

STM32 开发从环境搭建到 PCB 设计的入门指南。

环境搭建

CubeMX

STM32CubeMX 是 ST 官方的图形化配置工具,用于引脚分配、时钟树配置和中间件设置。

  1. 选择 MCU 型号
  2. 配置引脚功能(GPIO、USART、CAN、PWM 等)
  3. 设置时钟树
  4. 生成初始化代码(支持 HAL 库和 LL 库)

开发工具链

  • Keil MDK:商用 IDE,STM32 官方推荐
  • STM32CubeIDE:基于 Eclipse,免费
  • VS Code + PlatformIO:开源方案

GPIO 基础

1
2
3
4
5
6
// 初始化
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 输出高电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 输出低电平

// 读取
GPIO_PinState state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);

使用 GPIO 控制电机时注意:STM32 的 GPIO 输出电流有限,大功率设备需要用驱动电路(如 MOS 管、L298N)。

编码器模式

STM32 的定时器支持编码器模式,直接读取 AB 相编码器信号:

1
2
3
4
5
6
7
// 配置定时器为编码器模式
htim2.Instance = TIM2;
htim2.Init.EncoderMode = TIM_ENCODERMODE_TI12;
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);

// 读取计数值
int32_t count = __HAL_TIM_GET_COUNTER(&htim2);

CAN 通信

1
2
3
4
5
6
7
8
9
CAN_TxHeaderTypeDef tx_header;
tx_header.StdId = 0x200; // 标准 ID
tx_header.IDE = CAN_ID_STD;
tx_header.RTR = CAN_RTR_DATA;
tx_header.DLC = 8;

uint32_t tx_mailbox;
uint8_t data[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
HAL_CAN_AddTxMessage(&hcan, &tx_header, data, &tx_mailbox);

PCB 设计要点

  1. 电源去耦:每个 VDD 引脚附近放置 100nF 电容
  2. 晶振布局:尽量靠近 MCU,走线等长
  3. CAN 终端电阻:总线两端各放 120Ω
  4. 隔离设计:电机等大功率设备与信号线分开
  5. 地线完整:使用完整的地平面,减少 EMI

Arduino / ESP8266

Arduino 基础

1
2
3
4
5
6
7
8
9
10
11
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
}

void loop() {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}

ESP8266 + Arduino

1
2
3
4
5
6
7
8
9
10
#include <ESP8266WiFi.h>

WiFi.begin("SSID", "PASSWORD");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}

// 创建 Web 服务器
WiFiServer server(80);
server.begin();

ESP8266 与 ROS 结合:通过 Wi-Fi 收发串口数据,实现无线遥控或传感器数据上报。