stm32学习笔记之USB中断配置初始化函数
2018-06-15 来源:eefocus
● 中断映射单元:将可能产生中断的USB事件映射到三个不同的NVIC请求线上:
─ USB低优先级中断(通道20):可由所有USB事件触发(正确传输,USB复位等)。固件在处理中断前应当首先确定中断源。
─ USB高优先级中断(通道19):仅能由同步和双缓冲批量传输的正确传输事件触发,目的是保证最大的传输速率。
─ USB唤醒中断(通道42):由USB挂起模式的唤醒事件触发。
USB_HP_CAN1_TX_IRQn= 19, /*!< USB Device High Priority or CAN1 TX Interrupts */
USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */
USBWakeUp_IRQn= 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */
/USB中断配置
void USB_Interrupts_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* Configure the EXTI line 18 connected internally to the USB IP */
EXTI_ClearITPendingBit(EXTI_Line18);
// 开启线18上的中断
EXTI_InitStructure.EXTI_Line = EXTI_Line18; // USB resume from suspend mode
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //line 18上事件上升降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable the USB interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //组2,优先级次之
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the USB Wake-up interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn; //组2,优先级最高
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_Init(&NVIC_InitStructure);
}
复习关于STM32的中断与事件:
这张图是一条外部中断线或外部事件线的示意图
图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套。
图中的蓝色虚线箭头,标出了外部中断信号的传输路径,
首先外部信号从编号1的芯片管脚进入,
经过编号2的边沿检测电路,
通过编号3的或门进入中断挂起请求寄存器,
最后经过编号4的与门输出到NVIC中断检测电路,
这个边沿检测电路受上升沿或下降沿选择寄存器控制,
用户可以使用这两个寄存器控制需要哪一个边沿产生中断,
因为选择上升沿或下降沿是分别受2个平行的寄存器控制,
所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了.
按下来是编号3的或门,这个或门的另一个输入是软件中断/事件寄存器,
从这里可以看出,软件可以优先于外部信号请求一个中断或事件,
即当软件中断/事件寄存器的对应位为'1'时,不管外部信号如何,编号3的或门都会输出有效信号.
一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化.
外部请求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为'0',则该请求信号不能传输到与门的另一端,实现了中断的屏蔽.
明白了外部中断的请求机制,就很容易理解事件的请求机制了.
图中红色虚线箭头,标出了外部事件信号的传输路径,
外部请求信号经过编号3的或门后,进入编号5的与门,
这个与门的作用与编号4的与门类似,
用于引入事件屏蔽寄存器的控制;最后脉冲发生器的一个跳变的信号转变为一个单脉冲,
输出到芯片中的其它功能模块.
从这张图上我们也可以知道,从外部激励信号来看,中断和事件的产生源都可以是一样的.之所以分成2个部分,由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件,是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等;
简单举例:
外部I/O触发AD转换,来测量外部物品的重量;如果使用传统的中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;要是使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果;相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务了。
总结:
可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法;