本帖最后由 csz9981 于 2019-4-16 09:27 编辑
在第十章 外部中断实验中,我把IO口改成了自己的PA0,PC0,PC1,按键配置如下:void KEY_Init(void){RCC->APB2ENR|=0X14; //使能 PORT AC 时钟GPIOA->CRL&=0XFFFFFFF0; //清空PA0设置GPIOA->CRL|=0X00000008; //PA0 设置成输入1000上拉/下拉输入模式,默认下拉 GPIOC->CRL&=0XFFFFFF00; //清空PC10设置GPIOC->CRL|=0X00000044; //PC0/1 浮空输入 //GPIOC->IDR|=0X03; //通过ODR设置PC1.0 上拉 00000011b}
外部中断 初始化 函数如下:void EXTIX_Init(void){KEY_Init();//初始化按键输入模式Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发Ex_NVIC_Config(GPIO_C,0,FTIR); //下降沿触发Ex_NVIC_Config(GPIO_C,1,FTIR); //下降沿触发MY_NVIC_Init(2,3,EXTI0_IRQn,2); //抢占 2,子优先级 3,组 2 MY_NVIC_Init(2,1,EXTI0_IRQn,2); //抢占 2,子优先级 1,组 2 MY_NVIC_Init(2,0,EXTI1_IRQn,2); //抢占 2,子优先级 0,组 2 }
因为用到了2次中断线0,MY_NVIC_Init(2,3,EXTI0_IRQn,2); //抢占 2,子优先级 3,组 2 MY_NVIC_Init(2,1,EXTI0_IRQn,2); //抢占 2,子优先级 1,组 2 这两个函数,怎样区分是配置的PA0,还是配置的PC0的优先级?
//外部中断 配置 函数如下://只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个//参数://GPIOx:0~6,代表GPIOA~G//BITx:需要使能的位;//TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发//该函数一次只能配置1个IO口,多个IO口,需多次调用//该函数会自动开启对应中断,以及屏蔽线 void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) { u8 EXTADDR; u8 EXTOFFSET; EXTADDR=BITx/4; //除4,得整数,得到中断寄存器组的编号AFIO_EXTICR[x] EXTOFFSET=(BITx%4)*4; //除4,得余数,*4,AFIO_EXTICR[x][yyyy] RCC->APB2ENR|=0x01; //使能AFIO复用时钟 AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET); //清除原来设置!!! AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET; //EXTI.BITx映射到GPIOx.BITx //自动设置 EXTI->IMR|=1<<BITx; // 开启line BITx上的中断 //EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!) if(TRIM&0x01)EXTI->FTSR|=1<<BITx; //line BITx上事件下降沿触发 if(TRIM&0x02)EXTI->RTSR|=1<<BITx; //line BITx上事件上升降沿触发}
MY_NVIC_Init(2,3,EXTI0_IRQn,2);函数原形如下:void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) //设置NVIC //NVIC_PreemptionPriority:抢占优先级//NVIC_SubPriority :响应优先级//NVIC_Channel :中断编号 0-59//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; MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组 temp=NVIC_PreemptionPriority<<(4-NVIC_Group); temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); temp&=0xf; //取低四位 NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位,开启对应的中断(要清除的话,相反操作就OK) NVIC->IP[NVIC_Channel]|=temp<<4; //8位宽度,高4位有效,设置响应优先级和抢断优先级 }
//NVIC_Channel :中断编号 0-59 怎样区分PA0/PC0的中断编号?都使用??? EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */
另外, Stm32f10x.h中,EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ EXTI9_5_IRQn = 23, 编号都是23,具体EXTI8/EXTI6,编号是多少,是怎样区分的?
查了好多资料,最后也只能这样了,ST的设计思路吧。
应该不叫是思路,硬件如此。
一周热门 更多>