STM32开发——基础外设

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 熄灭 点亮
蜂鸣器 不响
按键 按下 未按下

总结

  1. 两种开发方式:寄存器(底层)和库函数(高效)

  2. HAL库:当前主流,配合CubeMX图形化配置

  3. GPIO操作:WritePin写电平,ReadPin读电平

  4. 启动方式:正常模式从Flash启动,BOOT0=0

  5. 串口通信:Transmit发送,Receive接收

  6. 外设控制:LED(低电平亮)、蜂鸣器(高电平响)、按键(按下高电平)

相关推荐
EVERSPIN1 小时前
低功耗国产单片机有哪些
单片机·嵌入式硬件·国产单片机
2501_918126911 小时前
stm32和dap调试器
stm32·单片机·嵌入式硬件·学习·个人开发
csg11072 小时前
PIC单片机驱动时钟芯片DS1302(附代码)
单片机·嵌入式硬件·物联网
xmlhcxr2 小时前
Nginx(二)
运维·nginx
归叶再无青2 小时前
web服务安装部署、性能升级等(Apache、Nginx)
运维·前端·nginx·云原生·apache·bash
GocNeverGiveUp2 小时前
大模型学习4-RAG检索增强生成
学习
你怎么知道我是队长2 小时前
前端学习---HTML---表单
前端·学习·html
cpsss06812 小时前
硬件学习笔记(personal)
笔记·学习
qq_416276422 小时前
DeLoRes——一种通用的音频表征学习新方法(DeLoRes(基于 Barlow Twins 的冗余最小化方法)
学习·音视频