STM32外部中断学习笔记
时间:11-20
来源:互联网
点击:
- void)
- {
- delay_ms(10);//消抖
- if(KEY2==1)//按键2
- {
- LED0=!LED0;
- LED1=!LED1;
- }
- EXTI->PR=1<0;//清除LINE0上的中断标志位
- }
- //外部中断15~10服务程序
- voidEXTI15_10_IRQHandler(void)
- {
- delay_ms(10);//消抖
- if(KEY0==0)//按键0
- {
- LED0=!LED0;
- }elseif(KEY1==0)//按键1
- {
- LED1=!LED1;
- }
- EXTI->PR=1<13;//清除LINE13上的中断标志位
- EXTI->PR=1<15;//清除LINE15上的中断标志位
- }
- //外部中断初始化程序
- //初始化PA0,PA13,PA15为中断输入.
- voidEXTIX_Init(void)
- {
- RCC->APB2ENR=1<2;//使能PORTA时钟
- JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD
- GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入
- GPIOA->CRL=0X08;
- GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入
- GPIOA->CRH=0X80800;
- GPIOA->ODR=1<13;//PA13上拉,PA0默认下拉
- GPIOA->ODR=1<15;//PA15上拉
- Ex_NVIC_Config(GPIO_A,0,RTIR);//上升沿触发
- Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发
- Ex_NVIC_Config(GPIO_A,15,FTIR);//下降沿触发
- MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);//抢占2,子优先级2,组2
- MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2
- }
其中的两个函数:Ex_NVIC_Config(GPIO_A,0,RTIR);和MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);这两个函数都是在sys.c里定义,分别完成了步骤2、3、4.函数原型如下:
[cpp]view plaincopy
- //外部中断配置函数
- //只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
- //参数:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
- //该函数一次只能配置1个IO口,多个IO口,需多次调用
- //该函数会自动开启对应中断,以及屏蔽线
- //待测试...
- voidEx_NVIC_Config(u8GPIOx,u8BITx,u8TRIM)
- {
- u8EXTADDR;
- u8EXTOFFSET;
- EXTADDR=BITx/4;//得到中断寄存器组的编号
- EXTOFFSET=(BITx%4)*4;
- RCC->APB2ENR=0x01;//使能io复用时钟
- AFIO->EXTICR[EXTADDR]&=~(0xF
- AFIO->EXTICR[EXTADDR]=GPIOx
- //自动设置
- EXTI->IMR=1
- //EXTI->EMR=1
- if(TRIM&0x01)EXTI->FTSR=1
- if(TRIM&0x02)EXTI->RTSR=1
- }
- AFIO->EXTICR[EXTADDR]=GPIOx
这个函数完成了两个步骤:
2、开启IO口复用时钟,设置IO口与中断线的映射关系
3、开启与该IO口相对的线上的中断/时间,设置触发条件
[cpp]view plaincopy
- //设置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的原则是,数值越小,越优先
- //CHECKOK
- //100329
- voidMY_NVIC_Init(u8NVIC_PreemptionPriority,u8NVIC_SubPriority,u8NVIC_Channel,u8NVIC_Group)
- {
- u32temp;
- u8IPRADDR=NVIC_Channel/4;//每组只能存4个,得到组地址
- u8IPROFFSET=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
- elseNVIC->ISER[1]=1<(NVIC_Channel-32);
- NVIC->IPR[IPRADDR]=temp
stm32外部中 相关文章:
- STM32笔记之外部中断GPIO(12-03)
- STM32学习之外部中断(12-02)
- STM32学习之--外部中断(11-26)
- STM32外部中断易出错总结(11-26)
- STM32中EXTI(外部中断)和NVIC(嵌套向量中断)的关系(11-25)
- STM32外部中断的使用(11-23)