STM学习笔记--STM32F10X中断
CM3支持256个中断,16个内核中断+240个外部中断,并具有256级可编程中断
STM32支持76个中断,16个内核中断+60个外部中断,16个可编程优先级
16个内核中断:每个中断占用地址为0X0000_0004
60个可屏蔽中断:其中0,1,2,3,4表示中断编号IRQ Channels在STM32F10x_lib.h程序中体现
16个中断优先级
先看看嵌套中断向量控制器的定义STM32F10X_map.h
/*------------------------ Nested Vectored Interrupt Controller --------------*/
typedef struct
{
vu32 ISER[2]; //Interrupt set-enable registers 2个32BITS
u32 RESERVED0[30];
vu32 ICER[2]; //Interrupt clear-enable registers
u32 RSERVED1[30];
vu32 ISPR[2]; //Interrupt set-pending registers
u32 RESERVED2[30];
vu32 ICPR[2]; //Interrupt clear-pending registers
u32 RESERVED3[30];
vu32 IABR[2]; //Interrupt active bit registers 只读寄存器
u32 RESERVED4[62];
vu32 IPR[15]; //Interrupt priority registers
} NVIC_TypeDef;
其中vu32 IPR[15],表示Interrupt Priority Registers中断优先级寄存器
表示15个32bit寄存器,每个屏蔽中断占用8位,只用到高4位,低4位没用到。
每个屏蔽寄存器拥有的中断编号为4个,即32bit/8bit=4
IPR[0]—[31-24] [23-16] [15-8] [7-4] 对应中断3,2,1,0
IPR[1]—[31-24] [23-16] [15-8] [7-4] 对应中断7,6,5,4
IPR[2]—[31-24] [23-16] [15-8] [7-4] 对应中断11,10,9,8
IPR[3]—[31-24] [23-16] [15-8] [7-4] 对应中断15,14,13,12
IPR[4]—[31-24] [23-16] [15-8] [7-4] 对应中断19,18,17,16
IPR[5]—[31-24] [23-16] [15-8] [7-4] 对应中断23,22,21,20
IPR[6]—[31-24] [23-16] [15-8] [7-4] 对应中断27,26,25,24
IPR[7]—[31-24] [23-16] [15-8] [7-4] 对应中断31,30,29,28
IPR[8]—[31-24] [23-16] [15-8] [7-4] 对应中断35,34,33,32
IPR[9]—[31-24] [23-16] [15-8] [7-4] 对应中断39,38,37,36
IPR[10]—[31-24] [23-16] [15-8] [7-4] 对应中断43,42,41,40
IPR[11]—[31-24] [23-16] [15-8] [7-4] 对应中断47,46,45,44
IPR[12]—[31-24] [23-16] [15-8] [7-4] 对应中断51,50,49,48
IPR[13]—[31-24] [23-16] [15-8] [7-4] 对应中断55,54,53,52
IPR[14]—[31-24] [23-16] [15-8] [7-4] 对应中断59,58,57,56
IPR[15]—[31-24] [23-16] [15-8] [7-4] 未使用
STM32将中断分为5组,组数为0-5。由控制器SCB->AIRCR寄存器控制
例如如果AIRCR为100,则60个中断(15个中断优先级寄存器)的每个中断的高3位为抢占优先级,低1位为响应优先级。那么抢占优先级可以设置7个,由000~111,而响应优先级只能为0或者1。数值越小,表示优先级越高,同时抢占优先级高于响应优先级。如果抢占优先级与响应优先级一致,则看哪个中断先发生,哪个先执行;高优先级的抢占优先级可以打断正在进行的低抢占优先级的,高响应优先级的不能打断低响应优先级的中断。
AIRCR—应用程序中断及复位控制寄存器,它是属于SCB中的一个。
//System control space memory map
typedef struct
{
vuc32 CPUID;
vu32 ICSR;
vu32 VTOR;
vu32 AIRCR;
vu32 SCR;
vu32 CCR;
vu32 SHPR[3];
vu32 SHCSR;
vu32 CFSR;
vu32 HFSR;
vu32 DFSR;
vu32 MMFAR;
vu32 BFAR;
vu32 AFSR;
} SCB_TypeDef;
如需修改SCB->AIRCR寄存器的值,首先得写入访问钥匙0X05FA,遵循读—改—写的操作步骤。
下面是设置NVIC分组函数:
//设置NVIC分组
//NVIC_Group:NVIC分组 0~4 总共5组
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
{
u32 temp,temp1;
temp1=(~NVIC_Group)&0x07;//取后三位
temp1<<=8;
temp=SCB->AIRCR; //读取先前的设置
temp&=0X0000F8FF; //清空先前分组
temp|=0X05FA0000; //写入钥匙
temp|=temp1;
SCB->AIRCR=temp; //设置分组
}
当NVIC_Group=0;~NVIC_Group=0X1111 1111&0X0000 0111 ,得temp1=0X0000 0111即第0组 ,0位抢占优先级,4位相应优先级
当NVIC_Group=1;~NVIC_Group=0X1111 1110&0X0000 0111 ,得temp1=0X0000 0110即第1组,1位抢占优先级,3位相应优先级
当NVIC_Group=2;~NVIC_Group=0X1111 1101&0X0000 0111 ,得temp1=0X0000 0101即第2组,2位抢占优先级,2位相应优先级
当NVIC_Group=3;
- STM32F10x 使用SysTick的延时函数(12-02)
- 基于STM32F10x的uC/GUI初始化设置(12-02)
- 基于正点原子建立STM32F10x库函数版本的工程自己例程(11-28)
- 启动过程都在这个文件的开头描述了system_stm32f10x.c(11-27)
- stm32f10x_it.c 定义的程序列表,编程时参考(11-27)
- stm32f10x的AD配置(11-26)