1. 课程导学与开发环境搭建

各位同学好,我是你们这门课的老周。做嵌入式开发十几年了,从51单片机一路做到现在的Cortex-M4,踩过的坑比走过的路还多。今天咱们开始第一讲,先把地基打牢。

蓝牙这个东西,说白了就是短距离无线通信。我刚开始做蓝牙项目时,总觉得它很神秘,后来发现核心就两件事:配对和传数据。咱们这门课用的STM32F407,配上HC-05或HC-06模块,就是最常见的组合。

1.1 蓝牙技术概述

蓝牙工作在2.4GHz频段,这个频段也是Wi-Fi和微波炉用的。嗯,这里要注意——如果你把蓝牙模块放在微波炉旁边,信号会受干扰,我亲测过。

咱们主要关注经典蓝牙(BR/EDR)和低功耗蓝牙(BLE)的区别:

特性 经典蓝牙 (BR/EDR) 低功耗蓝牙 (BLE)
传输速率 1-3 Mbps 125 Kbps - 2 Mbps
功耗 较高(约1W) 极低(约0.01W)
应用场景 音频传输、文件传输 传感器数据、智能家居
模块举例 HC-05 HC-06(简化版)

HC-05和HC-06其实都是经典蓝牙,只是HC-06砍掉了主机模式。我个人习惯用HC-05,因为它既能当主机也能当从机,调试起来更灵活。

1.2 STM32F407平台介绍

STM32F407是意法半导体的明星产品,Cortex-M4内核,带FPU(浮点运算单元)。为什么选它?因为它的串口资源丰富——有8个USART/UART接口,足够你同时挂蓝牙、GPS、传感器。

我记得第一次用F407时,被它的时钟树绕晕了。其实核心就几个点:

  • 主频:168 MHz,跑蓝牙协议栈绰绰有余
  • Flash:512 KB到1 MB,代码空间管够
  • SRAM:192 KB,其中64 KB是CCM(核心耦合内存),注意这个不能给DMA用
  • 串口:USART1-6 + UART7-8,支持同步和异步模式
小技巧: 我习惯把蓝牙模块挂在USART2或USART3上,因为这两个串口的中断优先级好配置,不容易和系统滴答定时器冲突。

1.3 HC-05 / HC-06 蓝牙模块选型

这两个模块长得几乎一样,都是6个引脚。但内部逻辑差别很大:

引脚 HC-05 HC-06
VCC 3.6V - 6V 3.3V - 6V
GND 地 地
TXD 发送数据 发送数据
RXD 接收数据 接收数据
STATE 状态指示(配对后高电平) 无此功能
EN 使能/AT指令模式 无此功能
避坑指南: 我曾经把HC-06的RXD直接接到STM32的3.3V TXD上,结果模块烧了。后来才发现HC-06的RXD电平是3.3V,但有些模块内部没有电平转换,必须加电阻分压。建议串一个1kΩ电阻在RXD线上。

选型建议:如果你只需要从机模式(手机连模块),HC-06够用,还便宜。如果你需要模块主动连接其他设备(比如两个模块互连),必须用HC-05。

1.4 开发板与模块接线

接线其实很简单,但很多人栽在电平匹配上。咱们用STM32F407的USART2为例:

STM32F407引脚 功能 HC-05/06引脚
PA2 USART2_TX RXD
PA3 USART2_RX TXD
GND 地 GND
5V 电源 VCC
PC0 GPIO(控制EN) EN(仅HC-05)

注意:STM32的TXD(PA2)输出3.3V,HC-05的RXD能接受3.3V,但有些模块需要5V逻辑。我建议用示波器量一下模块RXD引脚的电压阈值,没有示波器就串个1kΩ电阻,安全第一。

核心接线原则: TXD接RXD,RXD接TXD,GND共地,电源别接反。就这么简单。

1.5 Keil MDK 工程创建与配置

Keil MDK是咱们的主力IDE。我习惯用V5版本,因为V5的编译器对F407支持更稳定。创建工程分几步:

  1. 新建工程:选择STM32F407VGTx芯片
  2. 添加启动文件:startup_stm32f40_41xxx.s
  3. 配置时钟:使用HSE外部晶振,PLL倍频到168MHz
  4. 添加串口驱动:usart.c和usart.h
  5. 配置中断:使能USART2全局中断

这里有个坑——很多人忘记配置GPIO的复用功能。USART2的TX和RX必须设置为AF7(复用功能7),否则串口不工作。我曾经调试了一下午,最后发现是GPIO模式没改。

下面是一个最小化的串口初始化代码:

void USART2_Init(void)
{
    // 1. 使能时钟
    RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    
    // 2. 配置GPIO:PA2=TX, PA3=RX
    GPIOA->MODER &= ~(0x3 << 4);  // 清除PA2
    GPIOA->MODER |= (0x2 << 4);   // 复用功能
    GPIOA->AFR[0] |= (0x7 << 8); // AF7 for PA2
    
    GPIOA->MODER &= ~(0x3 << 6);  // 清除PA3
    GPIOA->MODER |= (0x2 << 6);   // 复用功能
    GPIOA->AFR[0] |= (0x7 << 12);// AF7 for PA3
    
    // 3. 配置USART2:115200, 8N1
    USART2->BRR = 84000000 / 115200;  // 假设APB1=84MHz
    USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
    USART2->CR2 = 0;
    USART2->CR3 = 0;
}
个人经验: 波特率计算时,注意APB1时钟频率。F407的APB1最大是42MHz,但如果你用了PLL,APB1可能是84MHz。我习惯在system_stm32f4xx.c里确认时钟配置,再算BRR值。

1.6 本章知识体系

下面这张图把咱们第一讲的核心内容串起来了:

第1章知识体系结构图 第1章:课程导学与开发环境搭建 蓝牙模块驱动开发 蓝牙技术概述 STM32F407平台 HC-05/HC-06选型 Keil MDK配置 经典蓝牙 vs BLE 2.4GHz频段 Cortex-M4 + FPU 8个串口资源 主机/从机模式 电平匹配 工程创建 时钟配置 核心目标:搭建可用的蓝牙串口通信开发环境 为后续章节的AT指令配置和透传通信打好基础

这张图把咱们第一讲的内容分成了四个模块。你看,蓝牙技术是理论基础,STM32F407是硬件平台,HC-05/HC-06是具体器件,Keil MDK是开发工具。四个模块缺一不可。