微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM学习笔记--STM32F10X中断

STM学习笔记--STM32F10X中断

时间:09-16 来源:互联网 点击:

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;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top