目录
本章目标(适配 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 库开发实战指南》(配套例程丰富)
资源链接:
三、补充建议:
注意事项:
资源 | 规格 | 用途 |
---|---|---|
内核 | ARM Cortex-M3 72MHz | 高性能实时处理 |
Flash | 512KB(支持 ISP/IAP) | 存储程序代码 |
RAM | 64KB | 运行时数据存储 |
外设 | 3×USART, 2×I2C, 3×SPI | 多协议通信 |
GPIO | 80× 通用 IO(5× 端口) | 控制 LED、传感器、继电器 |
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← 中断服务函数
Libraries\STM32F10x_StdPeriph_Driver\src
加入工程Libraries\STM32F10x_StdPeriph_Driver\inc
STM32F10X_HD
(高密度型号,512KB Flash)USE_STDPERIPH_DRIVER
(启用标准库)stm32f10x_rcc.c
实现)组件 | 引脚 | 说明 |
---|---|---|
LED(红) | PA5(GPIOA_5) | 推挽输出模式 |
电阻 | 220Ω | 限流保护 |
// 文件名: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
// 等价寄存器操作(标准库封装前)
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 使能GPIOA时钟
GPIOA->CRL &= ~(0xF << 20); // 清除PA5配置位
GPIOA->CRL |= 0x3 << 20; // PA5推挽输出(模式01,速度50MHz)
GPIOA->ODR |= GPIO_Pin_5; // 输出高电平
STM32 引脚 | 模块引脚 | 说明 |
---|---|---|
PA9(TX) | TXD | 发送数据到电脑 |
PA10(RX) | RXD | 接收电脑数据 |
GND | GND | 共地 |
// 文件名: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);
}
}
维度 | 标准库 | 寄存器 |
---|---|---|
代码量 | 少(封装函数) | 多(直接操作地址) |
可读性 | 高(函数名语义化) | 低(依赖寄存器地址记忆) |
移植性 | 好(库函数统一接口) | 差(寄存器地址因芯片而异) |
学习曲线 | 中(需理解库函数调用逻辑) | 高(需精通寄存器映射) |
典型场景 | 快速开发、项目迭代 | 极致优化、库不支持的场景 |
stm32f10x.h
:包含所有外设寄存器定义stm32f10x_rcc.h
:时钟配置(系统主频、外设时钟使能)stm32f10x_gpio.h
:GPIO 操作(模式、速度、电平控制)// 使能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);
// 处理接收到的数据(存入缓冲区)
}
}
《时钟系统深度解析:从 8MHz 到 72MHz 的倍频魔法》
标准库开发心法:
“标准库是寄存器的‘翻译官’,让硬件控制更贴近人类思维。掌握库函数的底层逻辑(反查寄存器),才能真正驾驭 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 系列。
当当网图书详情页(含目录及试读):
-当当网当当图文详情页为您提供参数,包含报价与图片, 品牌,购买就到当当!http://product.m.dangdang.com/detail1628887501-23108-1.html
电子发烧友网相关资源(含原理图、例程):
stm32f103开发指南 - 电子发烧友网https://m.elecfans.com/zt/1624716/
电子发烧友网野火专题页(教程 + 视频 + 例程):
STM32 LAN 野火 - 电子发烧友网https://m.elecfans.com/zt/1437052/
秉火论坛(野火官方论坛):
www.firebbs.cnhttp://www.firebbs.cn/
CSDN 博客资源(部分章节 PDF):
正版支持:
免费资料包:
学习路径: