异常和中断
RAM的编程中,凡是打断程序顺序执行的事件,都称为异常。当指令执行了"非法操作",或者"访问了被禁用的内存空间",这些操作都会产生"fault",以及"不可屏蔽的中断发生的时候"都称之为"异常"
“外部中断(IRQ)”:原本处于正常的状态,突然有个外部因素干扰,CPU就会停止当前正在做的事情,去处理干扰事件,解决后返回原来的正常状态。在中断产生的时候,一般是硬件触发了,然后去执行中断服务函数,实现特定的任务。
无特殊说明,后面:异常就是中断,中断就是异常
函数
在编译时,每一个函数都有一个入口地址,该地址就是函数名。
尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。
函数名相当于一个指向其函数入口指针常量。函数名后面加圆括号,表示函数的调用。若想得到函数的地址,直接用函数名就行。
函数名就是一个地址,是存放该函数代码在存储器空间上的起始地址。以一个子函数为例,编译器会分配一段内存空间用于存放改子函数代码内容,这段内存空间的起始地址是一个具体值,在程序里边就是函数名,当我们在程序其他位置调用该子函数时候,实际上就是让程序跳转到该函数名地址去运行子函数内容。
中断的处理
永远处理优先级高的中断。例如A,B两个中断,A的优先级高于B的优先级。
当A正在进行中断服务的时候,B发生了中断,这个时候,内核会先处理完A中断,在去处理B中断;
当B正在进行中断服务的时候,这个时候A发生了中断"它会打断B正在执行的中断服务函数,执行A的中断服务函数,执行完成后"再返回B的中断服务函数,接着执行。
这个就是中断优先级的作用。
中断向量表
MSP 主堆栈指针。
触发硬件中断,然后跳转到中断向量表上相应的存储器地址上(上面是中断服务函数名即中断服务函数的地址)“然后跳转到相应的中断服务函数中执行相应的程序”。
开机复位
复位选择
Cortex-M4内核从哪里复位是由BOOT0和BOOT1这两个引进决定的。
低电平复位
电容在上电的瞬间因为由电流所以电容是短路的状态且由上图看出电容的电压不会发生突变,因此上电的瞬间,电容短路接地,单片机开始复位,然后3.3V的电源开始给电容冲电,冲满后,电容没有电流通过,断开。REST引脚变成高电平,复位完成单片机正常工作。
STM32单片机低电平复位,高点平正常工作。
高电平复位
上电的瞬间,电容短路,接到3.3V的电平,51单片机开始复位,然后接通到地,电容进行放电,最后变成低电平,单片机正常工作。
MSP(主堆栈指针)初始值和复位向量
- 单片机,每次复位都是从存储器地址0x00000000取出MSP的值,这个值是堆栈指针,指向栈空间的栈顶,用于存储局部变量
三块可以启动存储器的物理地址
片上SRAM0x2000,0000
片上用户闪存地址0x0800,0000我们常用的启动地址
片上系统闪存(BootLoader)启动地址0x1FFF,0000
2. 从存储器地址0x00000004存储的是上面三块启动存储器的一个地址复位向量(程序开始执行的地址),复位函数在启动文件中Reset_Handler函数。
通过引脚的选择,0x0800,0000Flash上的空间的内存全部映射到了,复位函数的空间地址上了,两个flash空间的内容是完全相同的。