一、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引脚定义

在这里插入图片描述

引脚分类及功能

  1. 电源引脚
    • VDD:芯片的电源输入引脚,为芯片内部数字电路提供电源 ,一般接正电源(如 3.3V )。有多组 VDD 引脚(如 VDD_1、VDD_2 等),用于不同区域供电 。
    • VSS:芯片的接地引脚,为电路提供电位参考点 ,有多组 VSS 引脚(如 VSS_1、VSS_2 等) 。
    • VDDA 和 VSSA:分别是模拟电源和模拟地引脚,为芯片内模拟电路(如 ADC 等)供电 ,确保模拟信号处理的稳定性和精度 。
  2. 复位引脚
    • NRST:复位引脚,低电平有效 。当该引脚接收到低电平信号时,芯片内部电路会进入复位状态,重新初始化寄存器等,恢复到初始工作状态 。
  3. 晶振引脚
    • OSC_IN 和 OSC_OUT:外部高速晶振(HSE)引脚 ,用于连接外部高速晶体振荡器,为芯片提供高速时钟信号,一般连接 8MHz 晶振 ,经内部锁相环(PLL)倍频后为系统提供高频工作时钟 。
    • OSC32_IN 和 OSC32_OUT:外部低速晶振(LSE)引脚 ,用于连接 32.768kHz 的低速晶体振荡器,常为 RTC(实时时钟)等模块提供时钟信号 。
  4. 通用输入输出引脚(GPIO)
    • 以 PAx、PBx、PCx(x = 0 - 15 )形式命名 ,如 PA0、PB10 等 。这些引脚可通过软件配置为输入模式(浮空输入、上拉输入、下拉输入)、输出模式(推挽输出、开漏输出)、复用功能输出、复用功能输入等多种模式 。
    • 例如,在作为普通输出引脚时,可控制外部 LED 亮灭;作为输入引脚时,可读取外部按键状态 ;在复用功能下,可用于 SPI、I2C、USART 等通信接口 。
  5. 通信接口引脚
    • 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(接收引脚)等 ,用于异步串行通信 ,可实现与计算机串口等设备的数据传输 。
  6. 定时器引脚
    • 如 TIM1_CH1/TIM2_CH1 等 ,定时器引脚可用于输入捕获(测量外部信号频率、脉宽等)和输出比较(输出 PWM 波等)功能 。例如在电机调速应用中,可通过定时器输出 PWM 波控制电机转速 。
  7. 其他功能引脚
    • 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 / .hstm32f10x_adc.c / .h 等:封装了操作外设的函数,将复杂的寄存器操作封装成简单函数调用,提高开发效率,用户可直接调用实现外设功能,如 ADC 数据采集等。

库函数配置文件(stm32f10x_conf.h)

  • 功能:用于配置要使用的库函数,可通过宏定义选择启用或禁用某些外设库函数头文件,方便根据项目需求裁剪库函数,减少代码体积。

/ .hstm32f10x_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常亮

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐