STM32 开发从环境搭建到 PCB 设计的入门指南。
环境搭建
CubeMX
STM32CubeMX 是 ST 官方的图形化配置工具,用于引脚分配、时钟树配置和中间件设置。
- 选择 MCU 型号
- 配置引脚功能(GPIO、USART、CAN、PWM 等)
- 设置时钟树
- 生成初始化代码(支持 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; 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 设计要点
- 电源去耦:每个 VDD 引脚附近放置 100nF 电容
- 晶振布局:尽量靠近 MCU,走线等长
- CAN 终端电阻:总线两端各放 120Ω
- 隔离设计:电机等大功率设备与信号线分开
- 地线完整:使用完整的地平面,减少 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); }
WiFiServer server(80); server.begin();
|
ESP8266 与 ROS 结合:通过 Wi-Fi 收发串口数据,实现无线遥控或传感器数据上报。