关于中断的NVIC寄存器的讲解,找了好久的资料,上传到这里DDI0337G_cortex_m3_r2p0_trm.pdf。关于中断的理解,要注意以下几点:
1.只能高抢先优先级的中断可以打断低优先级的中断服务,构成中断嵌套。
2.当抢先优先级相同时,STM32首先响应子优先级高的中断。
3.当抢先优先级和子优先级相同时,STM32首先响应中断通道所对应的中断地址低的那个中断。
下面是一个没有用库的中断程序示例,当PC0的按键按下时,PA1所接的灯亮。
#include<stm32f10x_lib.h>
#define GPIO_A 0
#define GPIO_B 1
#define GPIO_C 2
#define FTIR 1//下降沿触发
#define RTIR 2//上升沿触发
void LED_Config(){
RCC->APB2ENR|=1<<2;
GPIOA->CRL&=0xFFFFFF0F;
GPIOA->CRL|=0x00000030;
}
void KEY_Config(){
RCC->APB2ENR|=1<<4;
GPIOC->CRL&=0xFFFFFFF0;
GPIOC->CRL|=0xFFFFFFF8;
GPIOC->ODR|=1<<0;
}
void NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM){
u8 EXTIADDR;
u8 EXTIOFFSET;
EXTIADDR=BITx/4;
EXTIOFFSET=(BITx%4)*4;
RCC->APB2ENR|=0x01;
AFIO->EXTICR[EXTIADDR]&=~(0x000F<<EXTIOFFSET);
AFIO->EXTICR[EXTIADDR]|=GPIOx<<EXTIOFFSET;
EXTI->IMR|=1<<BITx;
if(TRIM&0x01)
EXTI->FTSR|=1<<BITx;
if(TRIM&0x02)
EXTI->RTSR|=1<<BITx;
}
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;
}
void Priority_Config(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group){
u32 temp;
u8 IPRADDR=NVIC_Channel/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&=0x0000000F;
NVIC->ISER[NVIC_Channel/32]|=1<<(NVIC_Channel%32);
NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;
}
void EXTI_Config(){
NVIC_Config(GPIO_C,0,FTIR);
Priority_Config(2,2,EXTI0_IRQChannel,2);
}
void EXTI0_IRQHandler(){//中断处理
GPIOA->ODR|=1<<1;
EXTI->PR=1<<0;//清除边沿事件
}
int main(){
LED_Config();
KEY_Config();
EXTI_Config();
while(1){}
}
文章评论(0条评论)
登录后参与讨论