文章目录
花了一个多星期把江科协STM32教程刷完了,也算是对STM32有所了解. 现在开始二刷,这次二刷打算半个月拿下STM32. 把代码敲一遍. 【STM32入门教程-2023版 细致讲解 中文字幕】https://www.bilibili.com/video/BV1th411z7sn?vd_source=2fd155d9ed7f2131791233620141a958
系统结构
Cortex-M3 内核
Cortex-M3 是 ARM 公司推出的专为嵌入式系统设计的 32 位 RISC 内核,具有以下特点:
- 高效执行:支持 Thumb-2 指令集,提高代码密度和执行效率。
- 多总线系统:包含 ICode 总线、DCode 总线 和 系统总线,分别访问 Flash、SRAM 等存储器。
- 中断管理:提供 NVIC(嵌套向量中断控制器),支持 240 个中断向量及 256 个优先级。
多总线结构
STM32 使用多总线系统来提高数据传输效率:
- ICode 总线:连接 Flash 接口,用于取指令。
- DCode 总线:访问存储器(SRAM、Flash)用于数据读取。
- 系统总线:连接各种外设和 SRAM,实现数据的高速传输。
存储器结构
STM32 包含 Flash 和 SRAM 存储器:
- Flash:用于存储程序代码和不可变数据。通过 Flash 接口 与内核连接。
- SRAM:用于数据存储和运行时变量。
- FSMC(灵活静态存储器控制器):用于连接外部存储器(如 NOR Flash、SRAM 和 LCD 显示屏)。
外设总线和桥接器
STM32 系统分为三种总线:
- AHB(高级高性能总线):最快,用于连接高带宽模块,如内核、DMA、SDIO 和 RCC。
- APB2(高级外设总线 2):快,连接高速外设,如 GPIOA-GPIOG、ADC1-ADC3、SPI1、USART1 等。
- APB1(高级外设总线 1):不快,连接低速外设,如 I2C1-I2C2、SPI2-SPI3、USART2-5、TIM2-7、RTC 等。
桥接器将 AHB 系统总线与 APB1 和 APB2 连接,实现数据传输。
DMA 控制器
STM32 包含两个 DMA 控制器(DMA1 和 DMA2),用于在存储器和外设之间实现数据搬运,减轻 CPU 负担。 类似于传输数据的小秘书.具有和总线一样的控制权,访问数据.
- DMA1:有 7 个通道,可以与 AHB 总线进行数据传输。
- DMA2:有 5 个通道,负责更高速的数据传输任务。
特点:
- 支持外设到内存、内存到外设、内存到内存的传输。
- 数据传输过程中 CPU 可执行其他任务,提升系统性能。
复位和时钟控制(RCC)
RCC(Reset and Clock Control)是 STM32 的时钟系统核心,提供以下功能:
- 复位管理:控制系统上电复位(POR)、看门狗复位、软件复位等。
- 时钟配置:通过 PLL(锁相环)提供多种时钟源,如 HSI、HSE、LSE 和 LSI。
- 总线时钟分频:配置 AHB、APB1 和 APB2 不同的时钟频率。
外设模块
STM32 提供丰富的外设模块,包括:
- GPIO(通用输入输出):GPIOA 到 GPIOG,用于控制输入输出信号。
- ADC(模数转换器):ADC1 到 ADC3,12 位分辨率,高速采样。
- USART/UART(串行通信接口):支持同步和异步通信。
- SPI/I2S:用于高速数据通信和音频传输。
- I2C:用于连接传感器等低速设备。
- Timers(定时器):TIM1 到 TIM8(高级定时器) 和 TIM2 到 TIM7(通用定时器)。
- RTC(实时时钟):用于时间管理和定时唤醒功能。
- USB 和 CAN:支持 USB 设备模式和 CAN 总线通信。
SDIO 接口
STM32 通过 SDIO(Secure Digital Input/Output)接口支持 SD 卡和 SDIO 设备,实现大容量数据存储和高速传输。
STM32F103C8T6 引脚定义表格
引脚号 | 引脚名称 | 类型 | I/O 口 | 主功能 | 默认复用功能 | 重定义功能 | 备注介绍 |
---|---|---|---|---|---|---|---|
1 | VBAT | S | - | - | - | - | 备用电池供电引脚,维持RTC和备份寄存器供电。 |
2 | PC13-TAMPER-RTC | I/O | PC13 | TAMPOER-RTC | RTC 时钟 | - | 连接 RTC 外部时钟或触发器。 |
3 | PC14-OSC32_IN | I/O | PC14 | OSC32_IN | 32.768kHz 晶振输入 | - | 外部 32.768kHz 晶振输入端,用于 RTC 时钟。 |
4 | PC15-OSC32_OUT | I/O | PC15 | OSC32_OUT | 32.768kHz 晶振输出 | - | 外部 32.768kHz 晶振输出端,用于 RTC 时钟。 |
5 | OSC_IN | I | OSC_IN | HSE 晶振输入 | 高速外部时钟 | - | 连接外部高速时钟(HSE)输入端。 |
6 | OSC_OUT | O | OSC_OUT | HSE 晶振输出 | 高速外部时钟 | - | 连接外部高速时钟(HSE)输出端。 |
7 | NRST | I | NRST | 复位引脚 | 系统复位 | - | 系统复位引脚,低电平触发复位。 |
8 | VSSA | S | - | 模拟地 | - | - | 模拟电路地引脚。 |
9 | VDDA | S | - | 模拟电源 | - | - | 模拟电源引脚,为 ADC、DAC 等提供电源。 |
10 | PA0-WKUP | I/O | PA0 | WKUP/USART2_CTS/ADC12_IN0 | TIM2_CH1_ETR | - | 唤醒引脚,ADC 输入引脚,USART 控制线 CTS。 |
11 | PA1 | I/O | PA1 | USART2_RTS/ADC12_IN1/TIM2_CH2 | TIM2_CH2 | - | USART2 发送线 RTS,ADC 输入引脚,TIM 定时器通道 2。 |
12 | PA2 | I/O | PA2 | USART2_TX/ADC12_IN2/TIM2_CH3 | USART2_TX | - | USART2 数据发送引脚,ADC 输入引脚,TIM 定时器通道 3。 |
13 | PA3 | I/O | PA3 | USART2_RX/ADC12_IN3/TIM2_CH4 | USART2_RX | - | USART2 数据接收引脚,ADC 输入引脚,TIM 定时器通道 4。 |
14 | PA4 | I/O | PA4 | SPI1_NSS/USART2_CK/ADC12_IN4 | SPI1_NSS | - | SPI 片选引脚,USART2 时钟输出引脚,ADC 输入。 |
15 | PA5 | I/O | PA5 | SPI1_SCK/ADC12_IN5 | SPI1_SCK | - | SPI 时钟引脚,ADC 输入引脚。 |
16 | PA6 | I/O | PA6 | SPI1_MISO/ADC12_IN6/TIM3_CH1 | SPI1_MISO/TIM3_CH1 | - | SPI 数据输入引脚,ADC 输入引脚,TIM3 定时器通道 1。 |
17 | PA7 | I/O | PA7 | SPI1_MOSI/ADC12_IN7/TIM3_CH2 | SPI1_MOSI/TIM3_CH2 | - | SPI 数据输出引脚,ADC 输入引脚,TIM3 定时器通道 2。 |
18 | PB0 | I/O | PB0 | ADC12_IN8/TIM3_CH3 | ADC12_IN8/TIM3_CH3 | - | ADC 输入引脚,TIM3 定时器通道 3。 |
19 | PB1 | I/O | PB1 | ADC12_IN9/TIM3_CH4 | ADC12_IN9/TIM3_CH4 | - | ADC 输入引脚,TIM3 定时器通道 4。 |
20 | PB2 | I/O | PB2 | BOOT1 | - | - | BOOT1 引脚用于系统启动模式选择。 |
21 | PB10 | I/O | PB10 | I2C2_SCL/USART3_TX | I2C2_SCL | - | I2C 时钟引脚,USART3 数据发送引脚。 |
22 | PB11 | I/O | PB11 | I2C2_SDA/USART3_RX | I2C2_SDA | - | I2C 数据引脚,USART3 数据接收引脚。 |
23 | VSS1 | S | - | 电源地 | - | - | 系统地引脚,供电返回路径。 |
24 | VDD1 | S | - | 电源正 | - | - | 为数字电路供电。 |
25 | PB12 | I/O | PB12 | SPI2_NSS/I2C2_SMBA/USART3_CK | SPI2_NSS | - | SPI2 片选引脚,I2C 地址引脚,USART3 时钟引脚。 |
26 | PB13 | I/O | PB13 | SPI2_SCK/USART3_CTS/TIM1_CH1N | SPI2_SCK | - | SPI2 时钟信号引脚,USART3 控制线 CTS,引脚支持 TIM1 通道功能。 |
27 | PB14 | I/O | PB14 | SPI2_MISO/USART3_RTS/TIM1_CH2N | SPI2_MISO | - | SPI2 数据输入引脚,USART3 控制线 RTS,引脚支持 TIM1 通道功能。 |
28 | PB15 | I/O | PB15 | SPI2_MOSI/TIM1_CH3N | SPI2_MOSI | - | SPI2 数据输出引脚,TIM1 通道 3N 输出引脚。 |
29 | PA8 | I/O | PA8 | USART1_CK/TIM1_CH1/MCO | TIM1_CH1 | - | USART1 时钟输出引脚,TIM1 通道 1,引脚支持微控制器时钟输出。 |
30 | PA9 | I/O | PA9 | USART1_TX/TIM1_CH2 | USART1_TX | - | USART1 数据发送引脚,TIM1 通道 2。 |
31 | PA10 | I/O | PA10 | USART1_RX/TIM1_CH3 | USART1_RX | - | USART1 数据接收引脚,TIM1 通道 3。 |
32 | PA11 | I/O | PA11 | USART1_CTS/USB_DM/CAN_RX | USB_DM | PA11 | USART1 控制线 CTS,引脚支持 USB 数据线负极功能。 |
33 | PA12 | I/O | PA12 | USART1_RTS/USB_DP/CAN_TX | USB_DP | PA12 | USART1 控制线 RTS,引脚支持 USB 数据线正极功能。 |
34 | PA13 | I/O | PA13 | JTMS/SWDIO | JTMS/SWDIO | - | 调试接口引脚,用于 SWD/JTAG 调试通信。 |
35 | VSS2 | S | - | 系统地 | - | - | 系统地引脚,为数字电路提供参考地。 |
36 | VDD2 | S | - | 电源正 | - | - | 数字电路电源引脚。 |
37 | PA14 | I/O | PA14 | JTCK/SWCLK | JTCK/SWCLK | - | JTAG/SWD 调试时钟引脚。 |
38 | PA15 | I/O | PA15 | JTDI | JTDI | - | JTAG 数据输入引脚。 |
39 | PB3 | I/O | PB3 | JTDO | JTDO | TIM2_CH2/USART3_CK | JTAG 数据输出引脚,也支持 TIM2 和 USART3 时钟功能。 |
40 | PB4 | I/O | PB4 | NJTRST | NJTRST | SPI1_MISO/TIM3_CH1 | JTAG 复位引脚,复用为 SPI1 数据输入和 TIM3 通道 1。 |
41 | PB5 | I/O | PB5 | I2C1_SMBA | I2C1_SMBA | - | I2C 地址报警引脚,连接 I2C 设备。 |
42 | PB6 | I/O | PB6 | I2C1_SCL/TIM4_CH1 | I2C1_SCL | USART1_TX | I2C 时钟信号引脚,TIM4 通道 1,USART1 数据发送引脚。 |
43 | PB7 | I/O | PB7 | I2C1_SDA/TIM4_CH2 | I2C1_SDA | USART1_RX | I2C 数据引脚,TIM4 通道 2,USART1 数据接收引脚。 |
44 | BOOT0 | I | - | BOOT0 | 系统启动模式选择 | - | 引脚控制 MCU 启动方式(BootLoader、用户代码等)。 |
45 | PB8 | I/O | PB8 | TIM4_CH3 | TIM4_CH3 | I2C1_SCL | TIM4 定时器通道 3,也支持 I2C1 时钟功能。 |
46 | PB9 | I/O | PB9 | TIM4_CH4 | TIM4_CH4 | I2C1_SDA | TIM4 定时器通道 4,也支持 I2C1 数据功能。 |
47 | VSS3 | S | - | 系统地 | - | - | 系统地引脚。 |
48 | VDD3 | S | - | 电源正 | - | - | 数字电路电源引脚。 |
工程框架
STM32 工程框架的运行流程通常分为启动文件、用户代码文件和库文件三大部分。下面根据图中流程进行详细介绍:
1. 启动文件:startup_xx.s
- 作用:完成系统复位、初始化工作,并调用用户主程序
main
。 - 功能模块:
- 复位中断:在系统复位时,调用
SystemInit
函数完成系统初始化。 - 调用 SystemInit:该函数位于
system_xx.c
文件中,主要完成系统时钟初始化。 - 调用 main:系统初始化完成后,执行用户编写的主函数
main
。 - 其他中断:调用中断处理函数,这些函数通常由用户在
stm32f10x_it.c
中进行定义。
- 复位中断:在系统复位时,调用
2. 用户代码文件
用户代码主要包括三个文件:
system_xx.c / .h:
- 定义 SystemInit:完成系统时钟、PLL 等初始化配置。
- 系统初始化:主要为复位中断后调用的第一个函数,确保系统硬件处于稳定状态。
main.c:
- 定义 main:用户程序的入口函数,包含主要业务逻辑。
stm32f10x_it.c / .h:
- 定义中断处理函数:响应不同外设或系统中断请求,例如定时器中断、外部中断等。
- 调用中断函数:在启动文件中,当其他中断触发时,会调用这些处理函数。
其他用户文件:
- 用户根据实际需求自定义的代码文件,比如驱动外设、应用程序模块等。
3. 库文件
库文件是 STM32 标准库或 HAL 库的一部分,主要包括:
stm32f10x.h:
- 外设寄存器描述:定义了 STM32 外设的寄存器地址、位定义等。
core_cm3.c / .h:
- 内核寄存器描述:针对 ARM Cortex-M3 内核的寄存器描述及相关配置。
库函数文件 (misc.c、stm32f10x_adc.c 等):
- 提供外设驱动的库函数,例如 ADC、GPIO、USART 等外设的初始化和控制函数。
stm32f10x_conf.h:
- 库函数配置文件:用于配置哪些库函数模块需要被包含,比如 ADC、UART、I2C 等模块。
运行流程总结
- 复位中断:系统启动后,
startup_xx.s
调用SystemInit
进行初始化。 - 调用 main:初始化完成后,系统进入
main.c
中的main
函数,执行用户程序。 - 中断响应:当外设或系统产生中断时,调用
stm32f10x_it.c
中定义的中断处理函数。 - 库文件支持:用户代码和启动文件依赖库文件完成底层硬件操作,包括外设配置和内核寄存器的操作。