OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3456|回复: 9

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

[复制链接]

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-4-10
在线时间
6 小时
发表于 2019-4-16 09:03:47 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 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次中断线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_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,编号是多少,是怎样区分的?


最佳答案

查看完整内容[请看2#楼]

外部中断0你要么连只PA0,要么连只PB0,或是只连PC0,就一根线,你不可以同时连多个。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2019-4-16 09:03:48 | 显示全部楼层
外部中断0你要么连只PA0,要么连只PB0,或是只连PC0,就一根线,你不可以同时连多个。
回复

使用道具 举报

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-4-10
在线时间
6 小时
 楼主| 发表于 2019-4-16 09:30:13 | 显示全部楼层
整个工程文件我压缩如下 :

10-EXTI-KEY LED.zip (1.16 MB, 下载次数: 0)
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-4-23
在线时间
6 小时
发表于 2019-4-16 17:23:07 | 显示全部楼层
进了中断再判定IO口电平也!!
回复

使用道具 举报

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-4-10
在线时间
6 小时
 楼主| 发表于 2019-4-16 17:37:30 | 显示全部楼层
周广佩 发表于 2019-4-16 17:23
进了中断再判定IO口电平也!!

PA0--KEYA
PB0--KEYB

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

在同一个工程中,允许2个按键都占用中断线0吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-4-17 02:02:10 | 显示全部楼层

不允许。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-4-10
在线时间
6 小时
 楼主| 发表于 2019-4-17 21:55:45 | 显示全部楼层
查了好多资料,最后也只能这样了,ST的设计思路吧。
回复

使用道具 举报

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-4-10
在线时间
6 小时
 楼主| 发表于 2019-4-17 21:56:16 | 显示全部楼层
弦子的弦 发表于 2019-4-17 10:59
外部中断0你要么连只PA0,要么连只PB0,或是只连PC0,就一根线,你不可以同时连多个。


查了好多资料,最后也只能这样了,ST的设计思路吧。
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2019-4-18 00:17:16 | 显示全部楼层
csz9981 发表于 2019-4-17 21:56
查了好多资料,最后也只能这样了,ST的设计思路吧。

应该不叫是思路,硬件如此。
回复

使用道具 举报

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-4-10
在线时间
6 小时
 楼主| 发表于 2019-4-20 10:51:16 | 显示全部楼层
弦子的弦 发表于 2019-4-17 10:59
外部中断0你要么连只PA0,要么连只PB0,或是只连PC0,就一根线,你不可以同时连多个。

怎样设置 最佳答案?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 18:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表