PA0/PC0的中断编号 NVIC_Channel 是怎样区分的?

2019-07-21 02:39发布

本帖最后由 csz9981 于 2019-4-16 09:27 编辑

在第十章 外部中断实验中,我把IO口改成了自己的PA0PC0PC1按键配置如下: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次中断线0MY_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_SubPriorityNVIC_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,编号是多少,是怎样区分的?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
弦子的弦
1楼-- · 2019-07-21 07:32
外部中断0你要么连只PA0,要么连只PB0,或是只连PC0,就一根线,你不可以同时连多个。
csz9981
2楼-- · 2019-07-21 11:23
整个工程文件我压缩如下 :

10-EXTI-KEY LED.zip (1.16 MB, 下载次数: 0) 2019-4-16 09:30 上传 点击文件名下载附件
周广佩
3楼-- · 2019-07-21 16:16
进了中断再判定IO口电平也!!
csz9981
4楼-- · 2019-07-21 20:21
周广佩 发表于 2019-4-16 17:23
进了中断再判定IO口电平也!!

PA0--KEYA
PB0--KEYB

那么中断线0线要配置2遍?

在同一个工程中,允许2个按键都占用中断线0吗?
正点原子
5楼-- · 2019-07-21 22:58
 精彩回答 2  元偷偷看……
csz9981
6楼-- · 2019-07-21 23:36
查了好多资料,最后也只能这样了,ST的设计思路吧。

一周热门 更多>