金牌会员
 
- 积分
- 1635
- 金钱
- 1635
- 注册时间
- 2012-8-28
- 在线时间
- 71 小时
|
EXTI是中断线。就像家里电灯的电线(有0~19根其中0~15对应0~15引脚,至于是PA的还是PB。。。PG的在AFIO_EXTICR[]里设置。
16PVD。17RTC。18USB。19是以太网)。
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右移对应位。
寄存器的流程:
1使能端口时钟,(比如PA,PB,PC,,,,,,,)
2GPIO_CRL或CRH (配置输入输出)
3GPIO_ODR是 高电平还是低电平
4开复用时钟AFIO
5配置外部中断AFIO_EXTICR[] (配置0~15引脚是PA,PB,PC还是。。。PG)
6EXTI_触发沿 (RTIR上升 还是 FTIR下降)
7SCB_AIRCR (设置分组 钥匙0x5FA0000&分组)
8NVIC_ISER[] (开启对应的中断号)
9NVIC_IPR[] (该中断号的抢占,子优先级的设置)
|
|