把STM32 想像类比成一台电脑。
CPU 通过 总线(Bus) 控制各类外设。
各部分功能如下:
CPU:包含运算器,控制器及若干寄存器,是单片机的控制和指挥中心。
ROM (STM32中称为FLASH):用于存放程序和数据,为只读储存器。更改(擦除)和写入程序都较为麻烦, 需要遵守FLASH相关的协议。可以认为是计算机的硬盘。
RAM(STM32中称为SRAM):用于存放运算的中间结果、数据暂存及数据缓冲等。可以随机读入或读出,读写速度快,读写方便;但是断电或复位会丢失数据。可以认为是计算机的内存。
总线矩阵:总线矩阵用于主控总线之间的访问仲裁管理,提高了各部件交流的效率。
寄存器:虽然图里面没有寄存器,但是后续会经常提到它。寄存器可以看成储存0和1的一个指定名字和功能的地址。如果我们要在某个引脚输出一个低电平,我们只要往相的引|脚对应的寄存器写一个1,即可实现。
GPIO:通用型输入输出(接口),意思是你可以随意使用它输出或输入0和1,甚至以115200次每秒的速度翻转或接收0和1。
说明:上面的各部分功能都集成在一个芯片上,集成度高。
ICode 总线
ICode 中的 I 表示 Instruction,即指令,它是专门用来取指令的。
我们写好的程序编译之后都是一条条指令,存放在 Flash 中,内核要读取这些指令来执行程序就必须通过 ICode 总线,它几乎每时每刻都需要被使用,是专门用来去指的。
驱动单元
1.DCode 总线
DCode 中的 D 表示 Data,即数据,那说明这条总线是用来取数的。我们在写程序的时
候,数据有常量和变量两种,常量就是固定不变的,在C语言中用const 关键字修饰,是放在内部Flash中,变量是可变的放在内部SRAM当中。
2.系统总线
系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通
过这根系统总线来完成的。
3.DMA 总线
DMA 总线也主要是用来传输数据,这个数据可以是在某个外设的数据寄存器,可以在SRAM,可以在内部的 FLASH。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。
4.总线矩阵
总线矩阵:主要负责协调内核总线与DMA主控总线之间的访问仲裁,因为系统内核总线和DMA主控总线都能访问数据(来自FLASH、SRAM或者某个外设),避免冲突,需要总线矩阵来仲裁决定在哪个总线进行访问。
被动单元
1.内部 FLASH
FLASH,我们编写好的程序就放在这个地方。
一般程序编译后的二进制代码存储的地方,常量或者const修饰的也放在这里。
内核通过 ICode 总线来取里面的指令。
2.内部 SRAM
内部SRAM:程序函数内部的局部变量和全局变量,堆(malloc分配)栈(局部变量)等。
内核通过DCODE总线访问SRAM
3.FSMC(Flexible static memory controller): 灵活静态存储控制器
灵活的静态的存储器控制器,通过 FSMC,我们可以扩展内存,如
外部的SRAM
NANDFLASH
NORFLASH
注意的是:FSMC 只能扩展静态的内存,即名称里面的 S: static。
不能是动态的内存,比如 SDRAM 就不能扩展。
4.AHB到APB的桥
从 AHB 总线延伸出来的两条 APB2 和 APB1 总线,上面挂载着 STM32 各种各样的特色外设。我们经常说的GPIO、串口、 I2C、 SPI这些外设就挂载在这两条总线上,这个是我们学习 STM32 的重点,就是要学会编程这些外设去驱动外部的各种设备。
AHB总线:是Advanced High performance Bus的缩写,译作高级高性能总线,这是一种【系统总线】。AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接。AHB 系统由主模块、从模块和基础结构(Infrastructure)3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。
APB1总线:连接的是低速外设,包括电源接口、备份接口、CAN、 USB、 12C1、 12C2、 USART2、 USART3、 UART4、 UART5、 SP12、 SP3等。
操作速度限制于36MHZ
APB2总线:连接的是高速外设,包括UART1、SPI1、 Timer1、 ADC1、 ADC2、 ADC3、所有的普通1/0口(PA-PE)、第二功能V/O (AFIO)口等。
操作速度限制于72MHZ。
STM32外设
MISC:把NVIC的外设驱动放在了misc.c中(NVIC提供中断控制器,用于总体管理异常,称之为“内嵌向量中断控制器)
ADC:模数转换
BKP:备份数据
CAN:CAN总线是一种通信方式。STM32主要负责程序的运行,而CAN总线只是一种通信协议。STM32之间的通信可以通过CAN总线进行数据交换。
CEC:网络模块
DAC:数模转换
DBGMCU:调试支持
DMA:直接内存存取控制器(传输数据)
EXTI:外部中断事件控制器
FLASH:闪存存储器
FSMC:灵活的静态存储器控制器
GPIO:通用输入输出
I2C:I2C接口
IWDG:独立看门狗
PWR:电源/功耗控制
RCC:复位与时钟控制器
RTC:实时时钟
SDIO:SDIO接口
SPI:串行外设接口
TIM:定时器
USART:通用同步/异步接收器
WWDG:窗口看门狗
STM32 开发方式
STM32的3种开发方式:寄存器开发,标准库,HAL库。
寄存器开发:通过直接操作寄存器进行开发,但是由于STM32的寄存器数量众多,逐个查询比较繁琐。
标准库:ST公司为每一款芯片都编写了一份库文件,也就是工程文件里的stm32F1XX…之类的,这些.c .h文件中包含了一些常用量的宏定义,一些外设也通过结构体进行包装起来,例如GPIO口时钟等,只需要配置结构体变量的成员就可以修改外置的配置寄存器。
HAL(Hardware Abstraction Layer)库:硬件抽象层。是ST公司为了更好的移植性推出的一个软件库。相对于标准库来说更为简洁。只要使用相通的外设,程序可以通用。ST公司研发的STM32CubeMX软件,可以通过图形化的配置功能,直接生成整个使用HAL库的工程文件。
STM32 启动方式
用户闪存存储器启动模式(Main Flash memory) 正常的用户工作模式,通过 jtag 和 swd 模式进行下载程序,重启后也直接从这启动程序。
系统存储器启动模式(System memory) 从系统存储器启动,这种模式启动的程序功能是由厂家设置的。
SRAM启动(Embedded Memory) SRAM,没有程序存储的能力,这个模式一般用于程序调试。