嵌套向量中断控制器
- 68个中断通道
- 16级优先级
- 电源管理控制
- 系统控制寄存器的时间
系统滴答
系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。
中断和异常向量
68个中断,按照分组,可以分成:(小容量的有不同,比如增加了TIM8的中断,FSMC中断等,但是少了OTG等中断)
- 窗口定时器,电源电压PVD,侵入检测,RTC实时时钟和闹钟中断,FLASH全局,RCC(复位和时钟控制),一共8个
- 外部中断,EXTI0EXTI4,一共5个,59共用一个,中断10~15共用一个。
- DMA和DMA2 7个通道+5个通道,一共12个
- ADC1和ADC2全局
- CAN1的4个中断和CAN2的4个
- TIM1高级定时器1,4个,TIM2,3,4全局共7个,以及定时器567各一个全局,
- I2C两个模块的时间和错误,一共4个
- SPI1和SPI2全局各1各
- USART1到USART5一共5个全局
- 以太网全局和唤醒,两个
- OTG唤醒和全局
另外要注意的是,每一个模块有很多的中断源,比如SPI通信,这里只有一个全局的中断,具体模块中的中断源,需要在使用具体模块时进行设置,并打开全局中断。
外部中断/事件控制器
对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,每个输入线可以独立地配置输入类型(脉冲
或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。
唤醒事件
可以通过外部或者内部事件来唤醒内核,配置方法如下:
- 在外设中设置中断时,不设置NVIC使能,而是设置SEVONPEND位,CPU唤醒以后,需要软件进行清除。
- 也可以设置EXTI为事件模式,用来唤醒内核。
功能说明
外部中断可以做中断,也可以作为事件,如果作为事件,则要先配置并使能事件线,配置方法如下:
- 硬件中断
- 打开屏蔽位
- 设置触发选择
- 设置NVIC通道使能和屏蔽位
- 硬件事件
硬件事件则只需要配置两步,同上 - 软件中断/软件事件
- 配置屏蔽位,设置软件中断寄存器请求位
端口映射
- 端口一共有PA0,PB0,PC0PG0,一共7组端口的第0位挂在EXT10上,同样,PA1,PB1,挂在EXTI1上,这样PA0~PA15一共占16个通道。
- 另外还有4根单独的先,分配给PVD,RTC,USB唤醒和以太网唤醒。
库函数介绍
初始化和去初始化,以及结构体初始化函数
初始化结构体如下:
- uint32_t EXTI_Line //具体的中断线
- FunctionalState EXTI_LineCmd //使能
- EXTIMode_TypeDef EXTI_Mode //中断OR事件
- EXTITrigger_TypeDef EXTI_Trigger //触发沿
状态位 GetFlagStatus ClearFlag
这个简单,入口参数是某条中断线,返回的参数是是否产生了中断,这个在中断服务程序中使用。
中断和挂起 GetITStatus 和ClearITPendingBit
同上,挂起和查询某条中断线的标志。
GenerateSWInterrupt
产生一个软件中断,由软件来控制,相当于虚拟一个硬件中断。
GPIO_EXTILineConfig
在GPIO的头文件中,有一个GPIO_EXTILineConfig函数,函数的功能是使用某个脚作为中断线。
下面的中断口配置功能中,用到了这些函数。
void EXTI0_Config(void)
{
//使能GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//设置A0初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//使用的是A0的复用功能,打开复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//使用GPIOA的PIN0作为中断线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
//配置中断线的初始化
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//配置中断优先级和使能中断,并配置中断服务程序的位置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
网友评论