OpenEdv-开源电子网

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

求中断详解。。。。中断详细说明

[复制链接]

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-4-4 16:14:31 | 显示全部楼层 |阅读模式

void Ex_NVIC_Config(GPIO_A,0,  RTIR); //上升沿触发
void Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发
void MY_NVIC_Init(u8 抢占,u8 子优先,u8 中断名字,u8 组号) //抢占优先级,子优先级,通道0~59,组号)

例:MY_NVIC_Init(      3,          3, USART1_IRQChannel,2);//中断函数配置

 

//外部中断0服务程序
void EXTI0_IRQHandler(void)//中断EXTI0的中断内容
{
  delay_ms(10);//消抖
  if(KEY3==1)    //WK_UP 按键
  {          
    BEEP=!BEEP;  
  }      
  EXTI->R=1<<0;    //清除LINE0上的中断标志位  
}

原子哥:如果我要配置PA0~15这16个引脚分别对应EXTIpa0_IRQHandler;EXTIpa1_IRQHandler;EXTIpa2_IRQHandler;EXTIpa3_IRQHandler;EXTIpa4_IRQHandler以下依此类推我在
#define WWDG_IRQChannel              ((u8)0x00)  /* Window WatchDog Interrupt */
#define PVD_IRQChannel               ((u8)0x01)  /* PVD through EXTI Line detection Interrupt */
#define TAMPER_IRQChannel            ((u8)0x02)  /* Tamper Interrupt */
#define RTC_IRQChannel               ((u8)0x03)  /* RTC global Interrupt */
#define FLASH_IRQChannel             ((u8)0x04)  /* FLASH global Interrupt */
#define RCC_IRQChannel               ((u8)0x05)  /* RCC global Interrupt */
#define EXTI0_IRQChannel             ((u8)0x06)  /* EXTI Line0 Interrupt */
#define EXTI1_IRQChannel             ((u8)0x07)  /* EXTI Line1 Interrupt */
#define EXTI2_IRQChannel             ((u8)0x08)  /* EXTI Line2 Interrupt */
#define EXTI3_IRQChannel             ((u8)0x09)  /* EXTI Line3 Interrupt */
#define EXTI4_IRQChannel             ((u8)0x0A)  /* EXTI Line4 Interrupt */
#define DMA1_Channel1_IRQChannel     ((u8)0x0B)  /* DMA1 Channel 1 global Interrupt */
#define DMA1_Channel2_IRQChannel     ((u8)0x0C)  /* DMA1 Channel 2 global Interrupt */
#define DMA1_Channel3_IRQChannel     ((u8)0x0D)  /* DMA1 Channel 3 global Interrupt */
#define DMA1_Channel4_IRQChannel     ((u8)0x0E)  /* DMA1 Channel 4 global Interrupt */
#define DMA1_Channel5_IRQChannel     ((u8)0x0F)  /* DMA1 Channel 5 global Interrupt */
#define DMA1_Channel6_IRQChannel     ((u8)0x10)  /* DMA1 Channel 6 global Interrupt */
#define DMA1_Channel7_IRQChannel     ((u8)0x11)  /* DMA1 Channel 7 global Interrupt */
#define ADC1_2_IRQChannel            ((u8)0x12)  /* ADC1 et ADC2 global Interrupt */
#define USB_HP_CAN_TX_IRQChannel     ((u8)0x13)  /* USB High Priority or CAN TX Interrupts */
#define USB_LP_CAN_RX0_IRQChannel    ((u8)0x14)  /* USB Low Priority or CAN RX0 Interrupts */
#define CAN_RX1_IRQChannel           ((u8)0x15)  /* CAN RX1 Interrupt */
#define CAN_SCE_IRQChannel           ((u8)0x16)  /* CAN SCE Interrupt */
#define EXTI9_5_IRQChannel           ((u8)0x17)  /* External Line[9:5] Interrupts */
#define TIM1_BRK_IRQChannel          ((u8)0x18)  /* TIM1 Break Interrupt */
#define TIM1_UP_IRQChannel           ((u8)0x19)  /* TIM1 Update Interrupt */
#define TIM1_TRG_COM_IRQChannel      ((u8)0x1A)  /* TIM1 Trigger and Commutation Interrupt */
#define TIM1_CC_IRQChannel           ((u8)0x1B)  /* TIM1 Capture Compare Interrupt */
#define TIM2_IRQChannel              ((u8)0x1C)  /* TIM2 global Interrupt */
#define TIM3_IRQChannel              ((u8)0x1D)  /* TIM3 global Interrupt */
#define TIM4_IRQChannel              ((u8)0x1E)  /* TIM4 global Interrupt */
#define I2C1_EV_IRQChannel           ((u8)0x1F)  /* I2C1 Event Interrupt */
#define I2C1_ER_IRQChannel           ((u8)0x20)  /* I2C1 Error Interrupt */
#define I2C2_EV_IRQChannel           ((u8)0x21)  /* I2C2 Event Interrupt */
#define I2C2_ER_IRQChannel           ((u8)0x22)  /* I2C2 Error Interrupt */
#define SPI1_IRQChannel              ((u8)0x23)  /* SPI1 global Interrupt */
#define SPI2_IRQChannel              ((u8)0x24)  /* SPI2 global Interrupt */
#define USART1_IRQChannel            ((u8)0x25)  /* USART1 global Interrupt */
#define USART2_IRQChannel            ((u8)0x26)  /* USART2 global Interrupt */
#define USART3_IRQChannel            ((u8)0x27)  /* USART3 global Interrupt */
#define EXTI15_10_IRQChannel         ((u8)0x28)  /* External Line[15:10] Interrupts */
#define RTCAlarm_IRQChannel          ((u8)0x29)  /* RTC Alarm through EXTI Line Interrupt */
#define USBWakeUp_IRQChannel         ((u8)0x2A)  /* USB WakeUp from suspend through EXTI Line Interrupt */
#define TIM8_BRK_IRQChannel          ((u8)0x2B)  /* TIM8 Break Interrupt */
#define TIM8_UP_IRQChannel           ((u8)0x2C)  /* TIM8 Update Interrupt */
#define TIM8_TRG_COM_IRQChannel      ((u8)0x2D)  /* TIM8 Trigger and Commutation Interrupt */
#define TIM8_CC_IRQChannel           ((u8)0x2E)  /* TIM8 Capture Compare Interrupt */
#define ADC3_IRQChannel              ((u8)0x2F)  /* ADC3 global Interrupt */
#define FSMC_IRQChannel              ((u8)0x30)  /* FSMC global Interrupt */
#define SDIO_IRQChannel              ((u8)0x31)  /* SDIO global Interrupt */
#define TIM5_IRQChannel              ((u8)0x32)  /* TIM5 global Interrupt */
#define SPI3_IRQChannel              ((u8)0x33)  /* SPI3 global Interrupt */
#define UART4_IRQChannel             ((u8)0x34)  /* UART4 global Interrupt */
#define UART5_IRQChannel             ((u8)0x35)  /* UART5 global Interrupt */
#define TIM6_IRQChannel              ((u8)0x36)  /* TIM6 global Interrupt */
#define TIM7_IRQChannel              ((u8)0x37)  /* TIM7 global Interrupt */
#define DMA2_Channel1_IRQChannel     ((u8)0x38)  /* DMA2 Channel 1 global Interrupt */
#define DMA2_Channel2_IRQChannel     ((u8)0x39)  /* DMA2 Channel 2 global Interrupt */
#define DMA2_Channel3_IRQChannel     ((u8)0x3A)  /* DMA2 Channel 3 global Interrupt */
#define DMA2_Channel4_5_IRQChannel   ((u8)0x3B)  /* DMA2 Channel 4 and DMA2 Channel 5 global Interrupt */
发现这些是宏定义中断排序(中断0到中断59)
所以我想把中断pa0脚排在中断30开始      那pa15就排到中断45
要求pa0~7上升沿触发       pa8~16下降沿触发
void EXTIpa0_IRQHandler(void)//pa0脚上升沿触发,中断30号与中断31~45的中断内容不一样
void EXTIpa1_IRQHandler(void)
void EXTIpa2_IRQHandler(void)
void EXTIpa3_IRQHandler(void)
void EXTIpa4_IRQHandler(void)
void EXTIpa5_IRQHandler(void)
void EXTIpa6_IRQHandler(void)
void EXTIpa7_IRQHandler(void)
void EXTIpa8_IRQHandler(void)//pa8脚下降沿触发,中断号38
void EXTIpa9_IRQHandler(void)
void EXTIpa10_IRQHandler(void)
void EXTIpa11_IRQHandler(void)
void EXTIpa12_IRQHandler(void)
void EXTIpa13_IRQHandler(void)
void EXTIpa14_IRQHandler(void)
void EXTIpa15_IRQHandler(void)//pa15脚中断号45

原子哥,这函数怎么写?还有如何知道void MY_NVIC_Init(u8 抢占,u8 子优先,u8 EXTIpa15_IRQHandler,u8 组号) //抢占优先级,子优先级,通道0~59,组号)
怎么对应的PA15引脚和void EXTIpa15_IRQHandler(void)这函数的。
还有pa7脚中断触发需要暂时屏蔽pa8~10脚的中断,等Pa7中断运行结束了再开启pa8~10脚的中断。
跪求原子哥详细解说中断的工作原理。我在本论坛仔细查过中断的帖子,你们都是一笔带过,讲的很笼统。。。。。还有开发指南V1.2的85页注释下PLLMUL是倍频器(把频率翻倍x2,x3,x4。。。倍    我看了几天才发现是倍频器。你书上只说是PLL,我哪知道这是什么东东啊。。。)
还有抢占级1位,子优先级3是指:  抢占级范围0和1      子优先级000和001和010和011。。。111吗?
求详细解说

QQ750273008有好的资料记得发给我哦。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-4 18:53:32 | 显示全部楼层
1,这个中断函数的顺序是固定了的,不能改,也不需要改。
2,函数名可以随便你自己写,只是你在.s文件声明的,要和你外部(.c文件)写的服务函数一模一样,名字不能有丝毫差错。
3,MY_NVIC_Init,关于这个函数的使用介绍,请参考我们的教程,sys.c的介绍就有。如何使用,在外部中断实验里面,就有用到这个函数。请参考这个。
4,中断开关比较简单啊,这个在我们的PS/2鼠标实验里面就有类似的函数,专门开启/关闭外部某个引脚的中断,参考着写就OK了的。

关于中断,我们的教程我认为讲的很明白了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
 楼主| 发表于 2013-4-12 09:44:15 | 显示全部楼层
原子讲的中断太囫囵吞枣了,我来补充下:
EXTI是中断线。就像家里电灯的电线(有0~19根其中0~15对应0~15引脚,至于是PA的还是PB。。。PG的在AFIO_EXTICR[]里设置。
16是PVD17是RTC18是USB19是以太网)。
NVIC是中断号(中断号从0~59以0的响应最高。比如0和1同时触发,会先运行0再运行1)
#define EXTI0_IRQChannel             ((u8)0x06)  /* EXTI Line0 Interrupt */
#define EXTI1_IRQChannel             ((u8)0x07)  /* EXTI Line1 Interrupt */
#define EXTI2_IRQChannel             ((u8)0x08)  /* EXTI Line2 Interrupt */
#define EXTI3_IRQChannel             ((u8)0x09)  /* EXTI Line3 Interrupt */
#define EXTI4_IRQChannel             ((u8)0x0A)  /* EXTI Line4 Interrupt */
#define EXTI9_5_IRQChannel           ((u8)0x17)  /* External Line[9:5] Interrupts */
#define EXTI15_10_IRQChannel         ((u8)0x28)  /* External Line[15:10] Interrupts */
这里可以看到0~15引脚触发的中断线。但有些是共用的,0脚,1脚,2脚,3脚,4脚是独立的,5~9脚共用一中断号0x17;10~15脚共用一中断号0x28;比如说PE9脚和PA8脚配置中断后都是触发中断号0x17;
用法如下:
1宏定义引脚名字:#define    key   E8
2GPIOE_CRL的第8脚配置下
3GPIOE_ODR配置状态(上拉还是下拉,就是现在是高电平还是低电平)
4void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)//端口,引脚号,边沿 
5void MY_NVIC_Init(u8 NVIC_抢占,u8 NVIC_子优,u8 NVIC_中断号,u8 NVIC_分组) //抢占优先级,子优先级,通道0~59,组号)
这个1~5的步骤就是原子写的函数。
我补充下,比如PA5,PB5,PC6,PE7,PB8,PC9都是触发的0x17这中断号(#define EXTI9_5_IRQChannel 因为5~9脚是共用一个中断号)当触发了0x17这中断号,那就要去判断下5~9引脚到底是哪一个脚被触发了。中断函数完了之后要写中断清除EXTI_PR=1《对应位。
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-12 10:17:07 | 显示全部楼层
回复【3楼】 750273008 :
---------------------------------
以stm32开发指南为例:
先看了5.2.6节,中断管理函数介绍。
再看第十章,不至于看不懂写不了代码的。
而你在楼主位提到的,所谓的函数,其实是你没仔细看我的例程,以下摘自第十章:



另外,关于中断分组什么的,在5.2.6已经介绍的非常详细了,以下是表5.2.6.1的内容:


如果这样还是囫囵吞枣,我也没办法了。楼主出本非囫囵吞枣的书给大家拜读下吧。



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

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
 楼主| 发表于 2013-4-12 10:27:41 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
对不起,原子哥,我一直看的《例说stm32》这本书,可能确实是我太笨了。学的慢。《stm32开发指南》书什么时候有的卖啊?我想买一本
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-12 10:38:47 | 显示全部楼层
回复【5楼】750273008:
---------------------------------
例说STM32也可以的,基本上是同样的内容(章节不一样,但是章节名是一样的)。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-21 16:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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