花了一个多星期把江科协STM32教程刷完了,也算是对STM32有所了解. 现在开始二刷,这次二刷打算半个月拿下STM32. 把代码敲一遍. 【STM32入门教程-2023版 细致讲解 中文字幕】https://www.bilibili.com/video/BV1th411z7sn?vd_source=2fd155d9ed7f2131791233620141a958

系统结构

STM32二刷学习笔记--STM32概述-LMLPHP

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 工程框架的运行流程通常分为启动文件用户代码文件库文件三大部分。下面根据图中流程进行详细介绍:
STM32二刷学习笔记--STM32概述-LMLPHP

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 等模块。

运行流程总结

  1. 复位中断:系统启动后,startup_xx.s 调用 SystemInit 进行初始化。
  2. 调用 main:初始化完成后,系统进入 main.c 中的 main 函数,执行用户程序。
  3. 中断响应:当外设或系统产生中断时,调用 stm32f10x_it.c 中定义的中断处理函数。
  4. 库文件支持:用户代码和启动文件依赖库文件完成底层硬件操作,包括外设配置和内核寄存器的操作。
12-20 01:17