Iam鼎!
DMA框架解析1
DMA框架解析2
DMA框架解析3
储存空间映射
上一篇讲了关于储存空间映射的问题,下面讲一讲储存器重映射的问题。
程序是怎么运行的
简单说一下,复位之后,总是从地址0x04拿到复位代码的起始地址,以及从地址0x0取堆栈指针,开始执行复位程序。
这个0x04地址里面存的东西就是很关键的东西,大白话讲,它就是程序的开头索引。
目前STM32有四块可用于启动储存器的物理地址,0x04里面存放的地址就是它们之一:
片上SRAM起始地址:0x2000_0000
片上用户Flash起始地址:0x0800_0000
片上系统闪存(BootLoader)起始地址:0x1FFF_0000
外部RAM
分析一下这四种:
首先说结论:片上Flash最常用,严格来说这种方式只要不是太奇葩的项目都可以。
如果在调试阶段,需要反复的擦写程序,理论上调试用SRAM,调试结束用Flash最好,实际上却一般不用SRAM,因为Flash擦写虽然有寿命,但是寿命最少达到1W次(实际可能10W都可能),做个计算,每天擦写20次,也需要坚持一年半不停才能用坏,即使是实验板,也足够了。
片上系统闪存:也就是系统储存器,里面的程序由ST在生产线上写入,ISP下载方式用的就是它,目前STM407系列及其不推荐这种下载程序的方式,容易把芯片以锁死的方式报废,推荐通过STLINK的方式下载程序,方便快捷。
外部RAM用的更少了,这个不讨论。
BOOT引脚重映射
上图是程序启动的四种方式,前面三种:片上SRAM,片上用户Flash.片上系统闪存,可通过硬件BOOT0和BOOT1引脚以及重映射寄存器来设置,而最后面一种,只能通过重映射寄存器来设置。
先介绍BOOT引脚的设置方法,如下图:
经过我们的分析,只要将BOOT0设置为0(低电平),复位后,会在SYSCLK的第四个上升沿锁存BOOT引脚的值,单片机就会采用Flash的方式来启动,下图是实际电路图:
这里有几个注意点:
BOOT0为专用引脚,专门为这个功能服务的。
BOOT1则与GPIO引脚共用,在系统时钟第四个上升沿之后,就可以作为GPIO使用。
器件退出待机模式时,还会对BOOT引脚重新采样。因此,当器件处于待机模式时,这些引脚必须保持所需的自举模式配置。
如果器件从SRAM自举,在应用程序初始化代码中,需要使用NVIC异常及中断向量表和偏移寄存器来重新分配SRAM中的向量表。
重映射寄存器
还有一种设置方式,是通过重映射寄存器
这个用到的不多,不做分析。
总结:
最后,做一个总结。上一篇文章有这么一个图:
我们以Flash为启动举例:开机复位之后,在SYSCLK第四个上升沿,系统检测到BOOT0引脚是低电平,选择主Flash启动,这个时候,通过单片机内部的操作,把地址0x0000_0000~0x000FFFF地址的内容变为和Flash地址内容一样(不是复制,如果设置的是SRAM,那么内容就和SRAM中内容相同),同时把0x00写入重映射寄存器中,开始程序的执行。
下一节,讲解位带的操作。