STM学习笔记--STM32F10X中断
~NVIC_Group=0X1111 1100&0X0000 0111 ,得temp1=0X0000 0100即第3组,3位抢占优先级,1位相应优先级
当NVIC_Group=4;~NVIC_Group=0X1111 1011&0X0000 0111 ,得temp1=0X0000 0011即第4组,4位抢占优先级,0位相应优先级
temp1<<=8;从第8位开始
接着读改写。先清空先前分组,temp&=0X0000F8FF; //清空先前分组,高16位为0,低16位BIT11-8,为1000。再写入钥匙,0X05FA0000,再写入分组temp1,最后将temp1写入SCB->AIRCR寄存器。
NVIC配置理解
NVIC初始化函数
//设置NVIC
//NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority :响应优先级
//NVIC_Channel :中断编号
//NVIC_Group :中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组0:0位抢占优先级,4位响应优先级
//组1:1位抢占优先级,3位响应优先级
//组2:2位抢占优先级,2位响应优先级
//组3:3位抢占优先级,1位响应优先级
//组4:4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
{
u32 temp;
u8 IPRADDR=NVIC_Channel/4; //每组只能存4个,得到组地址
u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移
IPROFFSET=IPROFFSET*8+4; //得到偏移的确切位置
MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf;//取低四位
if(NVIC_Channel<32)
{
NVIC->ISER[0]|=1<
}
else
{
NVIC->ISER[1]|=1<<(NVIC_Channel-32);
}
NVIC->IPR[IPRADDR]|=temp<
}
(1)
u8 IPRADDR=NVIC_Channel/4; //每组只能存4个,得到组地址
u8 IPROFFSET=NVIC_Channel%4; //在组内的偏移
IPROFFSET=IPROFFSET*8+4; //得到偏移的确切位置
对于窗口 WWDG_IPQChanel 的中断编号为0X00,那么
IPRADDR=0X00/4=0; //得到第0组,IPR[0]
IPROFFSET=0X00%4=0; //在组内的偏移为0
IPROFFSET=0X00*8+4=4; //*8的意思是一个字节,就是跳过一个中断;+4的意思是,低4位无效
在IPR[IPRADDR]的中断组中,左移IPROFFSET的位置开始设置中断分组,temp为设置好的抢占优先级及响应优先级。
NVIC->IPR[IPRADDR]|=temp<
(2)
u32 temp;
temp=NVIC_PreemptionPriority<<(4-NVIC_Group); //抢占优先级设置
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); //相应优先级设置
temp&=0xf;//取低四位
例:NVIC_Group分组为1,则为1位抢占优先级,3位响应优先级
则NVIC_PreemptionPriority<<4-1
temp|=NVIC_SubPriority&(0x0000 1111>>1)=(0000 0BBB)
temp = (?AAA A000)|(0000 0BBB)
= (?AAAABBB)
那么AAAA只能是从0000-0001,BBB能从000-111刚好对应起来。
temp&=0X0F,因为只是bit[7:4]有效。
(3)
if(NVIC_Channel<32)
{
NVIC->ISER[0]|=1<
}
else
{
NVIC->ISER[1]|=1<<(NVIC_Channel-32);
}
则表示对应中断(0~59)使能,若中断编号小于32,则响应使能中断寄存器ISER[0],反之使能中断寄存器ISER[1]。
配置好NVIC后,接着配置外部中断寄存器EXTI
STM32的EXTI支持外部19个外部中断/事件,具有独立的中断屏蔽及状态位控制。
线0~15对应于外部IO的输入中断
线16连接到PVD
线17连接到RTC闹钟事件
线18连接到USB唤醒事件
/*------------------------ External Interrupt/Event Controller ---------------*/
typedef struct
{
vu32 IMR; //中断屏蔽寄存器 32bits,只有前19位有效
vu32 EMR; //事件屏蔽寄存器
vu32 RTSR; //上升沿触发选择寄存器
vu32 FTSR; //下降沿触发选择寄存器
vu32 SWIER; //软件中断寄存器 未设置IMR及EMR时,设置1,挂起PR,在PR清除后响应的SWIER清除
vu32 PR; //中断挂起寄存器 1表示中断响应,0表示未发生,向该寄存器写1,则清除挂起位
} EXTI_TypeDef
注:如果使用外部IO中断,还必须使用AFIO复用里的外部中断配置寄存器EXTICR。高16位保留,低16位有效。STM32任何一个IO口都可以配置成中断输入,但是IO口的数目远远大于中断线数(16个)。
GPIOA~GPIOG[15:0]分别对应中断线15:0,每条中断线对应于7个IO口。
例如:中断线0对应于GPIOA.0,GPIOB.0,GPIOC.0,GPIOD.0,GPIOE.0,GPIOF.0,GPIOG.0
![](../img/eep/emb/emb-51283ijknrjg0fvx.jpg)
EXTICR[0]~EXTICR[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)