原创 STM32 中断

2011-7-4 15:01 2838 8 8 分类: MCU/ 嵌入式

关于中断的NVIC寄存器的讲解,找了好久的资料,上传到这里pdf.gifDDI0337G_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条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条