STM32开发------基础外设
一、STM32基本介绍
1. 常用STM32型号说明
-
STM32F103C8T6:小容量芯片,256KB Flash,48引脚,应用:简单控制、传感器读取。
-
STM32F103RCT6:中容量芯片,256KB Flash,64引脚,应用:工业控制、人机界面。
-
STM32F103ZET6:大容量芯片,512KB Flash,144引脚,应用:复杂系统、图形界面。
2. 两种开发方式
| 开发方式 | 说明 | 特点 |
|---|---|---|
| 寄存器开发 | 直接操作硬件寄存器 | 底层、复杂、效率高 |
| 库开发 | 调用封装好的函数库 | 简单、快速、易移植 |
3. 两种库函数
(1) 标准库(ST标准库)
-
状态:已经不维护了
-
特点:通过结构体封装寄存器
// 标准库结构体示例
struct {
unsigned int GPIOx_CRL; // 配置低寄存器
unsigned int GPIOx_CRH; // 配置高寄存器
// ... 其他寄存器
}
(2) HAL库
-
状态:当前主流
-
特点:图形化界面开发,配置简单
二、开发工具准备
1. 所需工具清单
| 工具 | 作用 |
|---|---|
| Java环境 | 运行STM32CubeMX的基础 |
| STM32CubeMX | 图形化界面配置硬件资源 |
| Keil5 | 编译、下载、调试代码 |
| ARM编译器 | Keil自带的ARM编译工具链 |
| FlyMcu | 串口下载工具 |
2. 开发流程
1. 安装Java环境
2. 打开STM32CubeMX
3. 图形化配置硬件资源(时钟、引脚、外设)
4. 生成Keil工程代码
5. 在Keil5中编写用户代码
6. 使用ARM编译器编译
7. 通过FlyMcu下载到STM32
三、时钟配置
1. STM32时钟来源
-
高速外部时钟:8MHz晶振
-
倍频:8MHz × 9 = 72MHz(STM32内部工作频率)
2. 时钟配置流程
外部8MHz晶振
↓
PLL锁相环(9倍频)
↓
系统时钟72MHz
↓
各外设时钟(通过分频得到)
四、GPIO基础操作函数
1. 写入引脚电平
HAL_GPIO_WritePin(GPIO端口, 引脚号, 电平值);
参数说明:
| 参数 | 示例 | 说明 |
|---|---|---|
| GPIO端口 | GPIOC | 哪个GPIO组(A、B、C、D等) |
| 引脚号 | GPIO_PIN_2 | 具体第几号引脚 |
| 电平值 | GPIO_PIN_SET(1) | 高电平/熄灭 |
| GPIO_PIN_RESET(0) | 低电平/点亮 |
2. 读取引脚电平
uint8_t value = HAL_GPIO_ReadPin(GPIO端口, 引脚号);
返回值:
-
1:高电平
-
0:低电平
3. 延时函数
HAL_Delay(1000); // 延时1000毫秒(1秒)
五、LED实验
1. 原理图分析
-
PC2引脚:输出低电平 → LED1亮
-
PC3引脚:输出低电平 → LED2亮
-
输出高电平 → LED熄灭
2. 配置步骤
// 1. 在STM32CubeMX中配置PC2、PC3为输出模式
// 2. 编写代码控制LED
// 点亮LED1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); // 低电平点亮
// 点亮LED2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET); // 低电平点亮
// 熄灭LED1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); // 高电平熄灭
// 读取LED状态
uint8_t led_status = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2);
3. LED闪烁示例
while(1)
{
// LED1点亮
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_Delay(500); // 延时500ms
// LED1熄灭
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);
HAL_Delay(500); // 延时500ms
}
六、STM32启动方式
1. 三种启动模式
| 启动模式 | 说明 | 应用场景 |
|---|---|---|
| Flash启动 | 从内部Flash启动 | 正常模式运行程序 |
| 系统存储器启动 | 从内置Bootloader启动 | 固件升级 |
| 内置SRAM启动 | 从内置SRAM启动 | 调试模式 |
2. BOOT引脚配置
| BOOT0 | BOOT1 | 启动方式 |
|---|---|---|
| 0 | 任意 | Flash启动(正常模式) |
| 1 | 0 | 系统存储器启动(Bootloader) |
| 1 | 1 | 内置SRAM启动 |
3. 引脚连接
-
VCC:接3.3V电源
-
GND:接地
-
BOOT0:接VCC(1)或GND(0)
-
BOOT1:接VCC(1)或GND(0)
七、蜂鸣器实验
1. 原理图分析
-
PC1引脚高电平 → 蜂鸣器响
-
PC1引脚低电平 → 蜂鸣器不响
2. 配置步骤
// 1. 在STM32CubeMX中配置PC1为输出模式
// 2. 编写代码控制蜂鸣器
// 打开蜂鸣器
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET); // 高电平响
// 关闭蜂鸣器
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET); // 低电平不响
// 蜂鸣器响一声示例
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET); // 打开
HAL_Delay(1000); // 响1秒
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET); // 关闭
八、按键实验
1. 原理图分析
-
按键K1按下 → PA0引脚呈现高电平
-
按键K2按下 → PC13引脚呈现高电平
-
未按下时:通过下拉电阻保持低电平
2. 配置步骤
// 1. 在STM32CubeMX中配置PA0、PC13为输入模式
// 2. 编写代码读取按键状态
while(1)
{
// 读取K1按键状态
uint8_t key1 = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
// 读取K2按键状态
uint8_t key2 = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
if(key1 == 1) // K1按下
{
// 执行K1按下后的操作(如点亮LED)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
}
if(key2 == 1) // K2按下
{
// 执行K2按下后的操作(如点亮另一个LED)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET);
}
HAL_Delay(10); // 延时10ms消抖
}
九、串口通信
1. 同步与异步
-
同步(Sync):有时钟线,双方时钟同步
-
异步(Async):无时钟线,依靠波特率同步
2. 串口发送函数
HAL_UART_Transmit(串口控制器, 发送数据, 数据长度, 超时时间);
参数说明:
| 参数 | 示例 | 说明 |
|---|---|---|
| 串口控制器 | &huart1 | 使用哪个串口(USART1) |
| 发送数据 | (uint8_t*)tmpbuff | 要发送的数据缓冲区 |
| 数据长度 | strlen(tmpbuff) | 发送的字节数 |
| 超时时间 | 1000 | 超时时间(毫秒) |
发送示例:
char tmpbuff[32] = {"hello\n"};
// 发送字符串
HAL_UART_Transmit(&huart1, (uint8_t*)tmpbuff, strlen(tmpbuff), 1000);
3. 串口接收函数
HAL_UART_Receive(串口控制器, 接收缓冲区, 接收长度, 超时时间);
接收示例:
char recv_buf[32] = {0};
// 接收数据
HAL_UART_Receive(&huart1, (uint8_t*)recv_buf, sizeof(recv_buf), 1000);
4. XCOM串口助手
-
作用:PC端串口调试软件
-
功能:发送数据、接收数据显示、配置波特率等
十、完整开发流程总结
1. 整体流程
1. 硬件分析
├─ 查看原理图,确定引脚功能
└─ 确定外设连接方式
2. CubeMX配置
├─ 配置时钟(8MHz晶振 → 72MHz)
├─ 配置GPIO(输入/输出模式)
├─ 配置外设(串口、定时器等)
└─ 生成Keil工程代码
3. Keil编写代码
├─ 在main.c中添加用户代码
├─ 调用HAL库函数操作硬件
└─ 编译生成hex文件
4. 下载运行
├─ 设置BOOT引脚(正常模式 BOOT0=0)
├─ 使用FlyMcu通过串口下载
└─ 运行并观察结果
2. 常用HAL库函数总结
| 函数 | 功能 | 使用场景 |
|---|---|---|
| HAL_GPIO_WritePin() | 设置引脚电平 | 控制LED、蜂鸣器 |
| HAL_GPIO_ReadPin() | 读取引脚电平 | 读取按键状态 |
| HAL_Delay() | 毫秒级延时 | 延时、消抖 |
| HAL_UART_Transmit() | 串口发送 | 发送数据到PC |
| HAL_UART_Receive() | 串口接收 | 接收PC发来的数据 |
3. 引脚电平对应关系
| 外设 | 高电平(1) | 低电平(0) |
|---|---|---|
| LED | 熄灭 | 点亮 |
| 蜂鸣器 | 响 | 不响 |
| 按键 | 按下 | 未按下 |
总结:
-
两种开发方式:寄存器(底层)和库函数(高效)
-
HAL库:当前主流,配合CubeMX图形化配置
-
GPIO操作:WritePin写电平,ReadPin读电平
-
启动方式:正常模式从Flash启动,BOOT0=0
-
串口通信:Transmit发送,Receive接收
-
外设控制:LED(低电平亮)、蜂鸣器(高电平响)、按键(按下高电平)