文章目录
花了一个多星期把江科协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 引脚定义表格
工程框架
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
中定义的中断处理函数。 - 库文件支持:用户代码和启动文件依赖库文件完成底层硬件操作,包括外设配置和内核寄存器的操作。