STM32标准库入门简介、工程建立
STM32F103C8T6微控制器开发套件包含调试通信、输入输出、传感器、存储器、显示及电机驱动等模块,支持多种通信协议和外设控制。ARM架构广泛应用于智能设备,STM32基于Cortex-M内核,具有丰富外设资源和低功耗特性。STM32F103C8T6采用72MHz主频,64KB Flash和20KB SRAM,包含GPIO、定时器、ADC/DAC、通信接口等功能模块,通过总线矩阵和DMA实现高
文章目录
一、STM32套件

1.1调试与通信模块
- stlink:用于 STM32 程序的下载和调试,同时可为开发板供电 ,方便开发者将编写好的程序烧录到芯片中,并进行在线调试。
- USB 转串口模块:实现计算机 USB 接口与 STM32 串口之间的数据转换,用于串口通信,可进行数据监控、打印调试信息等 。
1.2输入输出模块
- 有源蜂鸣器:通过 GPIO 口驱动,可发出报警提示音等,用于提示相关事件发生。
- 按键:作为数字信号输入设备,可产生外部中断信号,用于用户输入控制指令等 。
- 电位器:可连续调节电阻值,输出模拟信号,主要用于 ADC 采样实验 ,能模拟各类连续变化的物理量输入。
1.3传感器模块
- 光敏电阻模块:其电阻值随光照强度变化,通过 ADC 采样可检测环境光强 。
- 热敏电阻模块:电阻值随温度改变,利用 ADC 采样实现温度检测 。
- 对射式红外模块:由发射器和接收器组成,可用于检测物体是否通过(如转速测量、计次等),常利用外部中断功能实现检测 。
- 反射式红外模块:可检测物体反射回来的红外线,用于循迹小车、颜色识别等场景 。
1.4通信协议模块
- W25Q64 存储模块:基于 SPI 总线通信协议,用于数据存储,可保存程序运行中的重要数据 。
- MPU6050 陀螺仪加速度计:采用 I2C 通信协议,能检测设备的姿态信息(如角度、加速度等) 。
- 旋转编码器:利用正交编码原理,可检测旋转方向和速度 。
1.5显示模块
- OLED:有机发光二极管显示器,支持 I2C 或 SPI 通信协议,用于实时显示数据 。
1.6电机控制模块
- 直流电机:常见的执行部件,通过 PWM 信号控制转速 。
- Tb6612 电机驱动模块:为直流电机提供驱动,可通过 PWM 信号实现电机调速 。
- SG90 舵机:通过 PWM 信号控制转动角度,用于角度定位控制 。
二、ARM简介
- ARM既指ARM公司,也指ARM处理器内核
- ARM公司是全球领先的半导体知识产权(IP)提供商,全世界超过95%的智能手机和平板电脑都采用ARM架构
- ARM公司设计ARM内核,半导体厂商完善内核周边电路并生产芯片

三、STM32简介
-
STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器
-
STM32常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等
-
STM32功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器。

3.1STM32F103C8T6

系列:主流系列STM32F1
内核:ARM Cortex-M3
主频:72MHzRAM:20K(SRAM)ROM:64K(Flash)
供电:2.0~3.6V(标准3.3V)
封装:LQFP48
3.2STM32所有外设
| 英文缩写 | 名称 | 英文缩写 | 名称 |
|---|---|---|---|
| NVIC | 嵌套向量中断控制器 | CAN | CAN通信 |
| SysTick | 系统滴答定时器 | USB | USB通信 |
| RCC | 复位和时钟控制 | RTC | 实时时钟 |
| GPIO | 通用IO口 | CRC | CRC校验 |
| AFIO | 复用IO口 | PWR | 电源控制 |
| EXTI | 外部中断 | BKP | 备份寄存器 |
| TIM | 定时器 | IWDG | 独立看门狗 |
| ADC | 模数转换器 | WWDG | 窗口看门狗 |
| DMA | 直接内存访问 | DAC | 数模转换器 |
| USART | 同步/异步串口通信 | SDIO | SD卡接口 |
| I2C | I2C通信 | FSMC | 可变静态存储控制器 |
| SPI | SPI通信 | USB OTG | USB主机接口 |
3.3命名规则

3.4系统结构

核心处理器
- Cortex - M3:作为 STM32 的内核,负责执行指令、处理数据,是整个系统运算和控制的核心 。
存储相关
- Flash 接口与 Flash:Flash 用于存储程序代码和常量数据 ,Flash 接口实现 Cortex - M3 与 Flash 之间的数据交互 。
- SRAM:静态随机存取存储器,用于程序运行时临时存储变量、堆栈等数据 ,速度快但掉电数据丢失 。
总线系统
- 总线矩阵:管理不同主设备(如 Cortex - M3、DMA 等)对从设备(如 Flash、SRAM 等)的访问仲裁 ,协调数据传输 。
- AHB 系统总线:高性能总线,用于连接高速设备,是系统内数据传输的主干道 。
- APB1 和 APB2:低速外设总线 ,APB2 速度相对 APB1 更快 ,连接如 GPIO、ADC 等各类低速外设 。
直接内存访问(DMA)
- DMA1 和 DMA2:拥有多个通道(如 DMA1 有通道 1 - 7 ,DMA2 有通道 1 - 5 ) ,可在无需 CPU 干预的情况下,实现存储器与外设、存储器与存储器之间的数据快速传输 ,减轻 CPU 负担 。
外设接口及控制器
- FSMC:灵活静态存储控制器,用于连接外部静态存储器,如 SRAM、NOR Flash 等 。
- SDIO:用于连接 SD 卡等存储设备,实现数据的存储和读取 。
- 复位和时钟控制(RCC):负责系统的复位操作以及各模块时钟的生成、分配和控制 ,合理配置时钟可优化系统功耗和性能 。
- 各类外设
- GPIO:通用输入输出端口,可配置为输入、输出等多种模式,用于与外部设备进行简单的数字信号交互 。
- ADC:模数转换器,将外部输入的模拟信号转换为数字信号,供 CPU 处理 。
- DAC:数模转换器,将数字信号转换为模拟信号输出 。
- SPI、I2C、USART:串行通信接口,用于 STM32 与其他设备之间的串行数据通信 ,SPI 常用于高速同步通信 ,I2C 用于短距离低速多设备通信 ,USART 可用于异步通信 。
- TIM:定时器,可实现定时、计数、PWM 输出等功能 ,广泛应用于电机控制、信号测量等场景 。
- 其他:如 PWR(电源管理)、BKP(备份寄存器)、CAN(控制器局域网)等,分别实现电源管理、数据备份、工业现场总线通信等功能 。
3.5引脚定义

引脚分类及功能
- 电源引脚
- VDD:芯片的电源输入引脚,为芯片内部数字电路提供电源 ,一般接正电源(如 3.3V )。有多组 VDD 引脚(如 VDD_1、VDD_2 等),用于不同区域供电 。
- VSS:芯片的接地引脚,为电路提供电位参考点 ,有多组 VSS 引脚(如 VSS_1、VSS_2 等) 。
- VDDA 和 VSSA:分别是模拟电源和模拟地引脚,为芯片内模拟电路(如 ADC 等)供电 ,确保模拟信号处理的稳定性和精度 。
- 复位引脚
- NRST:复位引脚,低电平有效 。当该引脚接收到低电平信号时,芯片内部电路会进入复位状态,重新初始化寄存器等,恢复到初始工作状态 。
- 晶振引脚
- OSC_IN 和 OSC_OUT:外部高速晶振(HSE)引脚 ,用于连接外部高速晶体振荡器,为芯片提供高速时钟信号,一般连接 8MHz 晶振 ,经内部锁相环(PLL)倍频后为系统提供高频工作时钟 。
- OSC32_IN 和 OSC32_OUT:外部低速晶振(LSE)引脚 ,用于连接 32.768kHz 的低速晶体振荡器,常为 RTC(实时时钟)等模块提供时钟信号 。
- 通用输入输出引脚(GPIO)
- 以 PAx、PBx、PCx(x = 0 - 15 )形式命名 ,如 PA0、PB10 等 。这些引脚可通过软件配置为输入模式(浮空输入、上拉输入、下拉输入)、输出模式(推挽输出、开漏输出)、复用功能输出、复用功能输入等多种模式 。
- 例如,在作为普通输出引脚时,可控制外部 LED 亮灭;作为输入引脚时,可读取外部按键状态 ;在复用功能下,可用于 SPI、I2C、USART 等通信接口 。
- 通信接口引脚
- SPI:如 SPI1_NSS/SPI2_NSS(片选信号)、SPI1_SCK/SPI2_SCK(时钟信号)、SPI1_MISO/SPI2_MISO(主设备输入从设备输出信号)、SPI1_MOSI/SPI2_MOSI(主设备输出从设备输入信号) ,用于 SPI 串行通信 。
- I2C:I2C1_SCL/I2C2_SCL(时钟线)、I2C1_SDA/I2C2_SDA(数据线) ,用于 I2C 总线通信,实现与其他 I2C 设备的数据交互 。
- USART:USART1_TX/USART2_TX(发送引脚)、USART1_RX/USART2_RX(接收引脚)等 ,用于异步串行通信 ,可实现与计算机串口等设备的数据传输 。
- 定时器引脚
- 如 TIM1_CH1/TIM2_CH1 等 ,定时器引脚可用于输入捕获(测量外部信号频率、脉宽等)和输出比较(输出 PWM 波等)功能 。例如在电机调速应用中,可通过定时器输出 PWM 波控制电机转速 。
- 其他功能引脚
- BOOTO:启动配置引脚,与 BOOT1 引脚配合(该芯片无 BOOT1 引脚,仅 BOOTO ),用于选择芯片的启动模式 。如将 BOOTO 接高电平,芯片可从系统存储器启动(用于 ISP 在系统编程 );接低电平,从用户闪存启动(正常运行模式 ) 。
3.6启动配置

3.7最小系统电路

3.8型号分类及缩写
| 缩写 | 释义 | Flash****容量 | 型号 |
|---|---|---|---|
| LD_VL | 小容量产品超值系列 | 16~32K | STM32F100 |
| MD_VL | 中容量产品超值系列 | 64~128K | STM32F100 |
| HD_VL | 大容量产品超值系列 | 256~512K | STM32F100 |
| LD | 小容量产品 | 16~32K | STM32F101/102/103 |
| MD | 中容量产品 | 64~128K | STM32F101/102/103 |
| HD | 大容量产品 | 256~512K | STM32F101/102/103 |
| XL | 加大容量产品 | 大于512K | STM32F101/102/103 |
| CL | 互联型产品 | - | STM32F105/107 |
3.10工程架构

启动文件(startup_xx.s)
- 功能:芯片复位后首先执行此文件代码。包含复位中断向量和其他中断向量。复位中断中,先调用
SystemInit函数进行系统初始化,如时钟配置等;之后调用main函数,程序进入用户编写的主函数执行。其他中断向量对应相应中断处理,会调用在stm32f10x_it.c中定义的中断处理函数。
系统初始化文件(system_xx.c/.h)
- 功能:定义
SystemInit函数,主要用于系统时钟等基础配置,为芯片后续正常运行提供合适时钟频率等运行环境。
主函数文件(main.c)
- 功能:用户编写应用程序主体代码的地方,实现具体功能逻辑,是程序主要执行入口,由启动文件中的复位中断调用启动。
中断处理文件(stm32f10x_it.c/.h)
- 功能:定义各种中断处理函数,如外部中断、定时器中断等。当对应中断发生时,启动文件中相应中断向量会调用这里定义的函数进行处理。
寄存器描述文件
- stm32f10x.h:对 STM32F10x 系列芯片的外设寄存器进行描述,定义寄存器地址、结构体等,方便用户操作外设寄存器。
- core_cm3.c / .h:对 Cortex - M3 内核寄存器进行描述,用于操作内核相关功能,如中断优先级设置等。
库函数文件
- 如
misc.c / .h、stm32f10x_adc.c / .h等:封装了操作外设的函数,将复杂的寄存器操作封装成简单函数调用,提高开发效率,用户可直接调用实现外设功能,如 ADC 数据采集等。
库函数配置文件(stm32f10x_conf.h)
- 功能:用于配置要使用的库函数,可通过宏定义选择启用或禁用某些外设库函数头文件,方便根据项目需求裁剪库函数,减少代码体积。
/ .h、stm32f10x_adc.c / .h` 等:封装了操作外设的函数,将复杂的寄存器操作封装成简单函数调用,提高开发效率,用户可直接调用实现外设功能,如 ADC 数据采集等。
库函数配置文件(stm32f10x_conf.h)
- 功能:用于配置要使用的库函数,可通过宏定义选择启用或禁用某些外设库函数头文件,方便根据项目需求裁剪库函数,减少代码体积。
注意:接下来所用课程最小单片机系统型号为 STM32F103C8T6 .
4.1建立新工程

- 建立工程文件夹,Keil中新建工程,选择型号
- 工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
- 工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里
- 工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹
- 工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER
- 工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run
4.1.1配置pc13


CNFy [1:0](引脚配置位,y=8~15):
输出模式(MODEy≠00):
00:通用推挽输出(默认输出模式,如 LED 驱动)。
01:通用开漏输出(需外部上拉,适用于 I2C 等总线)。
10:复用功能推挽输出(引脚映射到外设,如 USART_TX)。
11:复用功能开漏输出(复用 + 开漏,如 I2C 复用引脚)。
输入模式(MODEy=00):
00:模拟输入(ADC 采集)。
01:浮空输入(复位后默认,如外部信号检测,无上下拉)。
10:上拉 / 下拉输入(需通过 ODR 寄存器设置上下拉,如按键检测)。
11:保留(未使用)。
MODEy [1:0](引脚模式位,y=8~15):
00:输入模式(复位后状态,引脚为输入)。
01:输出模式,最大速度10MHz(低速外设,如普通 GPIO 控制)。
10:输出模式,最大速度2MHz(中速,如低功耗场景)。
11:输出模式,最大速度50MHz(高速,如 SPI 时钟等高频信号)。
应用示例(以 PA13 为例,配置为推挽输出,50MHz 速度):
CNF13[1:0] = 00(通用推挽输出),MODE13[1:0] = 11(50MHz 输出)。
寄存器设置:GPIOA->CRH |= (0x03 << 20);(PA13 对应 MODE13 [1:0] 占第 20-21 位,CNF13 [1:0] 占第 22-23 位,此处假设已配置 CNF 为 00,实际需按位掩码设置)。
4.2.2点亮pc13
#include "stm32f10x.h" // Device header
int main(void)
{
RCC->APB2ENR = 0x00000010;
GPIOC->CRH = 0x00300000;
GPIOC->ODR = 0x00000000;// 低电平点亮
while(1)
{
}
}
#include "stm32f10x.h" // 包含STM32F10x系列设备的头文件
int main(void)
{
// 使能GPIOC外设的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 定义GPIO初始化结构体
GPIO_InitTypeDef GPIO_InitStruct;
// 配置GPIO模式为通用推挽输出
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
// 配置要初始化的引脚为PC13
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
// 配置GPIO输出速度为50MHz
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
// 应用初始化配置到GPIOC
GPIO_Init(GPIOC, &GPIO_InitStruct);
// 将PC13引脚设置为低电平(点亮LED,对于大多数开发板上的LED是低电平点亮)
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
// 进入无限循环,保持程序运行
while(1)
{
// 主循环为空,LED将保持点亮状态
}
}
实验现象:输入为低电平时,LED常亮
更多推荐



所有评论(0)