1.系统架构
2.boot0和boot1
控制启动区域,三种启动模式。一般情况,程序启动都是从主闪存存储器(flash)中读取数据,启动程序,通过配置boot0和boot1可以使程序在不同位置启动。1-0系统存储器可以理解为串口下载,bootloader接收串口数据,下载到主闪存内,1-1为程序调试。
1.BOOT0=0, BOOT1任意(JLink和STLink调试下载:ICP)
通常我们是在Main memory 主存储区(0x0800 0000)运行程序,BOOT0引脚拉低即可。这种情况,KEIL软件给STM32烧录程序,就是直接在这个地址烧录,烧录完,直接在这个地址处运行。
2.BOOT0=1,BOOT1=0(串口直接下载:ISP)
这种情况就用在使用串口方式给STM32烧录程序,这时单片机从系统存储器(0x1FFF 0000)启动,运行的是出厂预置的BootLoader程序,可以接收串口发来的程序,并将其写入Main memory(0x0800 0000),程序烧录完成后,再将BOOT0引脚拉低,Main memory(0x0800 0000)处运行刚烧录的代码了。
3.BOOT0=1,BOOT1=1
这种情况是从内存中启动,内置SRAM(也就是STM32的内存中),既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。
3.GPIO八种模式
四输入:上拉(接上拉电阻)、下拉(接下拉电阻)、浮空(不接)、模拟(不经过施密特触发器,不对波形进行优化)
四输出:推挽(接P-MOS和N-MOS,具有驱动高低电平的能力)、开漏(只接N-MOS,只具有驱动低电平的能力)、复用推挽、复用开漏
开漏输出优点:适用于多设备共享同一信号线,实现线与功能,电平转换灵活。
缺点:需要外部上拉电阻,驱动能力较弱,不适合驱动大电流负载。
推挽输出优点:驱动能力强,输出电平稳定,适用于驱动大电流负载和高速数字电路。缺点:不能实现线与功能,多个推挽输出相连可能导致短路。
复用推挽输出是指GPIO引脚在执行特定外设功能的同时,仍然保持推挽输出的特性。也就是说,该引脚可以作为普通IO口使用,也可以用于特定的外设功能(如串行通信、定时器等)。
复用开漏输出是指GPIO引脚在执行特定外设功能的同时,仍然保持开漏输出的特性。也就是说,该引脚可以作为普通IO口使用,也可以用于特定的外设功能(如I2C、SPI等)。
最常用的模式为上拉输入(引脚默认为高电平)和推挽输出
输出时可以输入,输入时不可以输出
4.NVIC优先级分组
函数(此分组配置在整个工程中仅需调用一次,数字越小优先级越高):
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC为分组2
5.EXTI基本结构
6.AFIO(复用功能IO和调试配置)
AFIO不能同时接收多个同一引脚(PA0、PB0),因此中断定义时应采用不同的Pin。
/*AFIO选择中断引脚*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择。
7.中断流程
中断源:引起中断的事件称为中断源
中断请求:中断源向CPU提出处理的请求称为中断请求
中断向量:中断源的识别标志,中断服务程序的入口地址
中断向量表:按照中断类型号从小到大的顺序存储对应的中断向量,总共存储256个中断向量
断点:发生中断时被打断程序的暂停点称为断点
中断响应:CPU暂停现行程序转而为响应中断请求的过程称为中断响应
关中断:在保护现场和恢复现场过程中都要先关闭中断,避免堆栈错误
保存现场:保存程序当前断点执行所需的寄存器和相关数据
中断服务程序:处理中断源的程序称为中断处理程序
中断处理:CPU执行有关的中断服务函数称为中断处理
中断返回:返回断点的过程称为中断返回
8.中断的分类
1.硬/软中断
按中断源的不同,可分为:
硬件中断:由CPU外部的硬件,引入的中断,是随机的
软件中断:软件中断其实并不是真正的中断,它们只是可被调用执行的一般程序,是预先设计的
2.外/内中断
根据中断源所在的位置,可以分:
外部中断:一般指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等
内部中断:是指如运算出错(除数为零、运算溢出、单步中断等)所引起的中断
3.可/非屏蔽中断
按是否可屏蔽,可分为:
可屏蔽中断:通过INTR(Interrupt Require)线向CPU请求的中断,此类中断并不会影响系统运行,可随时处理,或不处理。此外,除受本身的屏蔽位控制外,还受一个总的中断允许标志位IF(Interrupt Flag)的控制
非屏蔽中断(不可屏蔽中断):非屏蔽中断是出现在NMI(Non Maskable Interrupt)线上的请求 ,不受中断标志位IF的影响,内部中断是不可屏蔽的中断
9.中断处理具体细节
关中断:进入不可响应中断请求的中断,由硬件自动完成
保存断点:把当前的程序计数器PC中的内容保存起来,用于中断处理结束后能继续执行主程序
识别中断源:有多个中断源同时请求时,只能响应最高优先级的,因此需进一步判断中断源
保存现场和屏蔽字:进入中断服务程序后,要先保存现场
设置新的屏蔽字:用于改变中断优先级和控制中断的产生
开中断:执行中断程序时,打开中断可实现更高优先级的中断响应,实现中断嵌套
执行中断服务程序:执行中断服务程序中的内容
再次关中断:使得恢复现场和屏蔽字时不会被中断打断
恢复现场和屏蔽字:使现场和屏蔽字恢复到中断之前的状态
再次开中断:中断执行完,现场恢复完后,可以打开中断
中断返回:返回原程序继续执行
中断的整个处理过程,由硬件和软件共同完成,具体处理细节如下图:
10.中断向量表
定义:中断向量表(interrupt vector table)包含中断服务程序地址的特定内存区域,这些服务程序是处理外部硬件中断请求的代码。
特点:这些中断服务程序(函数)在中断向量表中的位置是由半导体厂商定好的,当某个中断被触发以后就会自动跳转到中断向量表中对应的中断服务程序(函数)入口地址处。
在CPU接收到外部中断请求时,它会先查询中断向量表,以查找到相应的中断服务程序地址。首先会保护现场,然后CPU会将控制转移到该地址,以执行相应的中断服务。完成中断服务程序后,控制会恢复到中断发生前的程序流程。
11.中断注意事项
1.不存放过长代码,过长代码会导致程序阻塞
2.不在中断函数和主函数操作同一硬件设备,保护现场和恢复现场只针对cpu而言,对于外部硬件并没有进行保护。
12.EXTI外部中断函数流程
中断初始化:
1.开启GPIO时钟,初始化需要的引脚
2.配置AFIO,将外部中断的x号线映射到GPIOx
3.EXTI初始化
4.配置NVIC优先级分组
5.配置NVIC
中断响应函数:
1.判断相应的函数是否为自己配置的
2.执行操作
3.中断标志位清零
中断初始化函数:
外部中断函数: