嵌入式系统入门:基于 STM32F103ZET6 标准库的架构解析与外设驱动

目录

本章目标(适配 STM32F103ZET6 标准库)

一、STM32F103ZET6 硬件基础

1.1 芯片资源(适合工业与物联网场景)

1.2 最小系统电路(标准库开发必备)【没画图软件,请自行搜索stm32最小系统电路】

二、标准库开发环境搭建

2.1 标准库架构(STM32F10x_StdPeriph_Lib)

2.2 Keil MDK 工程配置

三、GPIO 驱动开发:LED 闪烁实战(标准库版)

3.1 硬件连接(STM32F103ZET6)

3.2 标准库代码实现

3.3 寄存器视角:标准库做了什么?

四、串口通信开发:USART1 实战(标准库版)

4.1 硬件连接(TTL 转 USB 模块)

4.2 标准库代码实现(中断接收 + 轮询发送)

五、标准库 vs 寄存器:开发效率对比

六、STM32F103ZET6 标准库开发技巧

6.1 关键头文件

6.2 调试技巧

七、实战1:LED + 串口综合项目

7.1 任务要求

7.2 实现提示(标准库)

八、学习资源推荐(标准库专属)

九、总结与下章预告

9.1 本章重点

9.2 下章预告

两本经典教程的相关资源信息(注:网络资源可能存在变动,请以最新信息为准):

一、《STM32 库开发实战指南:基于 STM32F103》(机械工业出版社)

资源链接:

二、野火《STM32 库开发实战指南》(配套例程丰富)

资源链接:

三、补充建议:

注意事项:


本章目标(适配 STM32F103ZET6 标准库)

  1. 掌握 STM32 标准库架构与开发流程
  2. 完成 LED 闪烁(标准库版)和串口通信实战
  3. 理解 GPIO、RCC、USART 寄存器映射关系
  4. 搭建标准库开发环境(Keil MDK + 标准库固件包)

一、STM32F103ZET6 硬件基础

1.1 芯片资源(适合工业与物联网场景)

资源 规格 用途
内核 ARM Cortex-M3 72MHz 高性能实时处理
Flash 512KB(支持 ISP/IAP) 存储程序代码
RAM 64KB 运行时数据存储
外设 3×USART, 2×I2C, 3×SPI 多协议通信
GPIO 80× 通用 IO(5× 端口) 控制 LED、传感器、继电器

1.2 最小系统电路(标准库开发必备)
【没画图软件,请自行搜索stm32最小系统电路】

  • 核心电路:8MHz 外部晶振 → 内部 PLL 倍频至 72MHz
  • 调试接口:SWD(2 线)节省 IO(对比 JTAG)

二、标准库开发环境搭建

2.1 标准库架构(STM32F10x_StdPeriph_Lib)

STM32F10x_StdPeriph_Lib/  
├── Libraries/              ← 库文件  
│   ├── CMSIS/            ← Cortex-M3内核接口  
│   └── STM32F10x_StdPeriph_Driver/  
│       ├── inc/          ← 头文件(如stm32f10x_gpio.h)  
│       └── src/          ← 源文件(如stm32f10x_gpio.c)  
└── Project/  
    └──STM32F10x_StdPeriph_Templates/  
        ├── main.c        ← 主函数模板  
        └── stm32f10x_it.c← 中断服务函数  

2.2 Keil MDK 工程配置

  1. 添加库文件
    • Libraries\STM32F10x_StdPeriph_Driver\src加入工程
    • 包含路径:Libraries\STM32F10x_StdPeriph_Driver\inc
  2. 配置宏定义
    • STM32F10X_HD(高密度型号,512KB Flash)
    • USE_STDPERIPH_DRIVER(启用标准库)
  3. 时钟配置
    • 外部晶振 8MHz → PLL×9 → 系统时钟 72MHz(通过stm32f10x_rcc.c实现)

三、GPIO 驱动开发:LED 闪烁实战(标准库版)

3.1 硬件连接(STM32F103ZET6)

组件 引脚 说明
LED(红) PA5(GPIOA_5) 推挽输出模式
电阻 220Ω 限流保护

3.2 标准库代码实现

// 文件名:main.c  
#include "stm32f10x.h" // 标准库总头文件  

void LED_Init(void) {  
  GPIO_InitTypeDef GPIO_InitStructure;  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;          // PA5  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    // 推挽输出  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   // 最大速度50MHz  
  GPIO_Init(GPIOA, &GPIO_InitStructure);              // 初始化GPIOA  
}  

void Delay_ms(uint32_t ms) {  
  uint32_t i, j;  
  for(i=0; i

3.3 寄存器视角:标准库做了什么?

// 等价寄存器操作(标准库封装前)  
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 使能GPIOA时钟  
GPIOA->CRL &= ~(0xF << 20);         // 清除PA5配置位  
GPIOA->CRL |= 0x3 << 20;            // PA5推挽输出(模式01,速度50MHz)  
GPIOA->ODR |= GPIO_Pin_5;            // 输出高电平  

四、串口通信开发:USART1 实战(标准库版)

4.1 硬件连接(TTL 转 USB 模块)

STM32 引脚 模块引脚 说明
PA9(TX) TXD 发送数据到电脑
PA10(RX) RXD 接收电脑数据
GND GND 共地

4.2 标准库代码实现(中断接收 + 轮询发送)

// 文件名:usart.c  
#include "stm32f10x.h"  

void USART1_Init(void) {  
  USART_InitTypeDef USART_InitStructure;  
  GPIO_InitTypeDef GPIO_InitStructure;  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);  

  // 配置TX(PA9)为复用推挽输出  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

  // 配置RX(PA10)为浮空输入  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

  // 初始化USART1(波特率115200)  
  USART_InitStructure.USART_BaudRate = 115200;  
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
  USART_InitStructure.USART_StopBits = USART_StopBits_1;  
  USART_InitStructure.USART_Parity = USART_Parity_No;  
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
  USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;  
  USART_Init(USART1, &USART_InitStructure);  

  USART_Cmd(USART1, ENABLE); // 使能USART1  
}  

// 发送一个字符  
void USART_SendByte(USART_TypeDef* USARTx, uint8_t Data) {  
  USART_SendData(USARTx, Data);  
  while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); // 等待发送完成  
}  

// 发送字符串  
void USART_SendString(USART_TypeDef* USARTx, char* str) {  
  while (*str) {  
    USART_SendByte(USARTx, *str++);  
  }  
}  

// main函数中调用  
int main(void) {  
  LED_Init();  
  USART1_Init();  

  while (1) {  
    USART_SendString(USART1, "STM32F103ZET6 Standard Library Demo\r\n");  
    GPIO_SetBits(GPIOA, GPIO_Pin_5);  
    Delay_ms(500);  
    GPIO_ResetBits(GPIOA, GPIO_Pin_5);  
    Delay_ms(500);  
  }  
}  

五、标准库 vs 寄存器:开发效率对比

维度 标准库 寄存器
代码量 少(封装函数) 多(直接操作地址)
可读性 高(函数名语义化) 低(依赖寄存器地址记忆)
移植性 好(库函数统一接口) 差(寄存器地址因芯片而异)
学习曲线 中(需理解库函数调用逻辑) 高(需精通寄存器映射)
典型场景 快速开发、项目迭代 极致优化、库不支持的场景

六、STM32F103ZET6 标准库开发技巧

6.1 关键头文件

  • stm32f10x.h:包含所有外设寄存器定义
  • stm32f10x_rcc.h:时钟配置(系统主频、外设时钟使能)
  • stm32f10x_gpio.h:GPIO 操作(模式、速度、电平控制)

6.2 调试技巧

  1. 观察寄存器:在 Keil 中打开 “Peripherals”→“GPIOA” 查看实时值
  2. 波形验证:用示波器测量 PA5 引脚,确认高低电平切换频率
  3. 串口抓包:使用 “串口助手”(如 XCOM)验证数据收发

七、实战1:LED + 串口综合项目

7.1 任务要求

  1. 通过串口发送指令控制 LED:
    • 输入 “LED ON” → 点亮 LED
    • 输入 “LED OFF” → 熄灭 LED
    • 输入 “HELP” → 显示指令列表

7.2 实现提示(标准库)

  1. 中断接收串口数据
    // 使能USART1接收中断  
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  
    NVIC_InitTypeDef NVIC_InitStructure;  
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
    NVIC_Init(&NVIC_InitStructure);  
    
    // 中断服务函数(stm32f10x_it.c)  
    void USART1_IRQHandler(void) {  
      if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {  
        uint8_t data = USART_ReceiveData(USART1);  
        // 处理接收到的数据(存入缓冲区)  
      }  
    }  
    
  2. 指令解析:在主循环中检查串口接收缓冲区,匹配指令字符串
  3. 扩展串口指令:支持 “LED BLINK [ms]” 设置闪烁间隔(如 “LED BLINK 200”→200ms 间隔)。

八、学习资源推荐(标准库专属)

  1. 官方资料
    • STM32F103ZET6 数据手册
    • STM32F10x 标准库固件库
  2. 经典教程
    • 《STM32 库开发实战指南:基于 STM32F103》(机械工业出版社)
    • 野火《STM32 库开发实战指南》(配套例程丰富)
  3. 调试工具
    • Keil MDK 5.24a(支持 STM32F1 系列)
    • ST-Link (固件烧录工具)

九、总结与下章预告

9.1 本章重点

  • 标准库架构:寄存器封装→函数接口→工程模板
  • 实战成果:LED 闪烁(GPIO 控制)+ 串口通信(USART 配置)
  • 开发流程:Keil 工程搭建→代码编写→调试下载

9.2 下章预告

《时钟系统深度解析:从 8MHz 到 72MHz 的倍频魔法》

  • 标准库时钟配置:RCC 寄存器与 PLL 锁相环
  • 精准延时实现:SysTick 定时器 vs 自定义 Delay 函数
  • 功耗优化:时钟门控(RCC 时钟使能 / 失能策略)

标准库开发心法
“标准库是寄存器的‘翻译官’,让硬件控制更贴近人类思维。掌握库函数的底层逻辑(反查寄存器),才能真正驾驭 STM32。”

(本章完整工程代码:我的代码仓获取)


博客适配 STM32F103ZET6 标准库特色
✅ 专属配置:针对高密度型号(512KB Flash)的时钟、外设资源优化
✅ 标准库深度:解析库函数与寄存器的对应关系(如GPIO_Init()封装的寄存器操作)
✅ 工程模板:提供 Keil MDK 工程模板(含启动文件、库文件配置)

常见问题 Q&A
Q:标准库和 HAL 库哪个更适合学习?
A:标准库更贴近硬件原理,适合理解 STM32 架构;HAL 库抽象层级高,适合快速开发。建议先学标准库打基础,再过渡到 HAL 库。

Q:STM32F103ZET6 的 Flash 和 RAM 是否足够复杂项目?
A:512KB Flash 和 64KB RAM 适合中小型项目(如工业控制器、物联网网关),大型项目可考虑 F4/F7 系列。

两本经典教程的相关资源信息(注:网络资源可能存在变动,请以最新信息为准):

一、《STM32 库开发实战指南:基于 STM32F103》(机械工业出版社)

资源链接:
  1. 当当网图书详情页(含目录及试读):
    -当当网当当图文详情页为您提供参数,包含报价与图片, 品牌,购买就到当当!http://product.m.dangdang.com/detail1628887501-23108-1.html

    • 作者:刘火良(野火)、杨森
    • 简介:基于标准库开发,系统讲解 STM32F103 的固件库原理、使用方法及实战案例,配套例程丰富,适合零基础入门。
  2. 电子发烧友网相关资源(含原理图、例程):
    stm32f103开发指南 - 电子发烧友网https://m.elecfans.com/zt/1624716/

    • 包含书中案例的原理图、PCB 源文件(AD 软件)及部分代码下载。

二、野火《STM32 库开发实战指南》(配套例程丰富)

资源链接:
  1. 电子发烧友网野火专题页(教程 + 视频 + 例程):
    STM32 LAN 野火 - 电子发烧友网https://m.elecfans.com/zt/1437052/

    • 内容:涵盖野火 STM32F103 开发板(如霸道、指南者)的教程、157 集视频课程、原理图、例程源码及配套书籍资料。
  2. 秉火论坛(野火官方论坛)
    www.firebbs.cnhttp://www.firebbs.cn/

    • 提供全套 200 集视频教程、1000 页 PDF 教程及项目源码下载(需注册论坛)。
  3. CSDN 博客资源(部分章节 PDF):

    • 《STM32 库函数开发实战指南》PDF(第一部分)
    • 简介:含 HAL 库与标准库对比、外设开发案例等,适合补充学习。

三、补充建议:

  1. 正版支持

    • 机械工业出版社书籍可通过当当、京东等平台购买纸质版或电子书。
    • 野火教程可通过官方店铺(如淘宝 “野火嵌入式”)获取配套开发板及完整例程。
  2. 免费资料包

    • 电子发烧友网提供《STM32 开发资料包》(含原理图、教程、项目源码):
      【免费分享】易上手的STM32多核心开发板资料包一网打尽,教程+课件+视频+项目+源码-电子发烧友网​想要深入学习STM32开发吗?现在机会来了!我们为初学者们准备了一份全面的资料包,包括原理图、教程、课件、视频、项目、源码等,所有资料全部免费领取,课程视频可试看(购买后看完整版),让你从零开始,快速掌握STM32开发技能。后台私信小雯老师,回复“STM32”即可领取!https://m.elecfans.com/article/5482183.html(回复 “STM32” 领取)。
  3. 学习路径

    • 建议结合书籍理论 + 开发板实操(如野火 STM32F103 MINI 板)+ 官方例程(ST 官网或野火论坛),逐步掌握标准库开发流程。

注意事项:

  • 部分资源可能需要注册或付费,请优先选择官方渠道获取正版内容。

你可能感兴趣的:(嵌入式通信协议自学实战专栏,单片机,嵌入式硬件,通讯协议,stm32,嵌入式软件,架构)