0、STM32的三种开发模式

  1. 基于寄存器开发,就是和51单片机一样,直接对寄存器进行编程。基于寄存器编写的代码简练、执行效率高。但由于 STM32 微控制器的片上外设和寄存器数量太多,这种编程方式移植性差,寄存器名称记起来也很痛苦。
  2. 基于st官方的固件库进行开发,相比寄存器开发更加简单,我们不需要记住每个寄存器的地址和名称,只要会调用ST官方封装好的库函数进行编程就可以了。
  3. 基于STM32CubeMX进行开发,STM32cubemx使用的是st官方新推出的HAL库,然后我们可以通过软件内设计好的图形化界面进行配置,软件自动生成配置代码,然后再在IDE上编写自己的功能代码。

1、STM32的内部结构

STM32是一个单片计算机或单片微控制器,就是在一个芯片上集成了计算机或微控制器的基本功能部件,这些功能部件通过总线连在一起。

STM32的功能部件主要包括:Cortex-M内核、总线、复位和时钟控制RCC、程序存储器Flash、数据存储器、终端控制、调试接口以及各种(外设)功能部件。

常有的(外设)功能部件包括:输入/输出GPIO、定时/计数器TIMER/COUNTER、串行通信接口USART、串行总线I2C和SPI或I2S、SD卡结构SDIO、USB接口、FSMC等。

STM32的程序存储器、静态数据存储器、所有的外设都统一编址,但各自有固定的存储空间区域,使用不同的总线进行访问。

双stm32架构 stm32程序架构_功能部件


双stm32架构 stm32程序架构_双stm32架构_02

  • FSMC(Flexible Static Memory Controller,可变静态存储控制器),能够与同步或异步存储器和 16 位 PC 存储器卡连接,STM32 的 FSMC 接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM 等存储器。
  • DMA(Direct Memory Access,直接存储器访问) 它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。
  • SRAM(Static Random-Access Memory,静态随机存取存储器)所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持;
    DRAM(Dynamic Random Access Memory,动态随机存取存储器)里面所储存的数据就需要周期性地更新。
    然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存FLASH是不同的。
  • ICode总线 :
    将M3内核的指令总线与FLASH指令接口相连,用于指令预取
    DCode总线:
    将M3内核的数据总线与FLASH数据接口相连,常量加载和调试

2、STM32的时钟树

  • STM32可以选择内部时钟(内部RC振荡器),也可以选择外部时钟(外部晶振)。
  • STM32中有五个时钟源,分别为:
    (1)HSI:高速内部时钟,RC振荡器,频率为8MHz;
    (2)HSE:高速外部时钟,可接外部谐振器或时钟源,频率范围为4MHz~16MHz;
    (3)LSI:低速内部时钟,RC振荡器,频率为40kHz;
    (4)LSE:低速外部时钟,接频率为32.768kHz的石英晶体;
    PLL:锁相环倍频输出,其时钟输入源可选HSI/2、HSE或HSE/2。倍频可选2~16倍,但其输出频率最大为72MHz。
    高速时钟主要用于系统内核和总线上的外设时钟;低速时钟主要用于独立看门狗IWDG、实时时钟RTC。
  • 微控制器的运行必须依赖周期性的时钟脉冲,它往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种时钟“能量”扩散流动的路径,常称为“时钟树”。
  • 双stm32架构 stm32程序架构_双stm32架构_03

  • 我们将这个复杂的系统分成三个部分,第一个部分是时钟的输入,也就是时钟源;第二个部分是时钟的输出,也就是各种外设等应用模块;第三个部分就是连接输入与输出的枢纽,也就是锁相回路、分频器和倍频器等。
  • 双stm32架构 stm32程序架构_Memory_04

  • STM32微控制器的时钟树是可以自由配置的,任意一个时钟源都可以被独立的启动或关闭,同时任意一个外设的时钟也可以单独的被使能或关闭,这样,就可以从 软件上将系统功耗优化到最佳。
  • 在STM32中每个外设都有其单独的时钟,在使用某个外设之前必须打开该外设的时钟,那么为什么不使用同一个时钟来为所有外设提供时间基准呢,这是因为不同的外设对时钟频率有不同的要求,如果全使用高速时钟,势必会造成时钟资源浪费且增加功耗
  • 与时钟相关的几个概念(更多时钟类型
    (1)SYSCLK:系统时钟,STM32大部分器件的时钟来源。它由AHB预分频器分配到各个部件。
    (2)HCLK:由AHB预分频器直接输出得到,它是高速总线AHB的时钟信号,提供给存储器、DMA及Cortex内核,是Coex内核运行的时钟,CPU主频就是这个信号,它的大小与STM32运算速度、数据存取速度密切相关。
    (3)FCLK:同样由AHB预分频器输出得到,是内核的“自由运行时钟”(free running clock)。“自由”表现在它不来自时钟HCLK,因此在HCLK时钟停止时FCLK也会继续运行。它的存在,可以保证在处理器休眠时,也能够采样中断和跟踪休眠事件,它与HCLK互相同步。
    (4)PCLK1:外设时钟,由APB1预分频器输出得到,最大频率为36MHz,提供给挂载在APB1总线上的外设(低速外设)。
    (5)PCLK2:外设时钟,由APB2预分频器输出得到,最大频率可为72MHz,提供给挂载在APB2总线上的外设(高速外设)。
STM32的基本组成

STM32单片机内部由CPU、FLASH、RAM、总线、外设、电源、PLL锁相环和时钟管理器,只有电源不需要提供时钟输入,其他的外设和CPU的工作都需要提供时钟输入。