对于USB模块,因为其通讯流程比较复杂,因此配置硬件中断就显得很重要了.
STM32F103的中断寄存器位于另一个手册中,也就是下方蓝色标题的链接地址.
NVIC寄存器用于启用中断,中断向量表中有两个USB相关中断,从机设备仅需要RX中断,也就是表项20.因此只需要配置NVIC_ISER0寄存器的位20即可开启USB模块中断,至于中断优先级分组等情况,可以直接使用默认配置,若有需要可以手动配置其余NVIC与SCB寄存器来设置中断优先级.
配置完这些,就可以直接回到USB章节,继续配置USB_CNTR寄存器,使USB外设在特定情况下才会触发中断.我们只需要传输中断和复位中断就可以了.
(这里讲一下复位,复位就是将USB模块重置到初始状态,也就是除了分区缓冲区里面的内容,其余寄存器都会变成复位值,这个在枚举过程中会用到)
配置完这些就差不多了,最后在配置一下中断表就可以了.中断表位于.s启动文件里面(startup_stm32f10x_md.s),因为中断表编译后会处于代码区,所以需要编译前进行配置,编译后就不能再改动了.
可以看到中断表内USBRX函数是"USB_LP_CAN1_RX0_IRQHandler",只需要在前面用.extern符号声明一下,函数是从外部导入的即可
小结:
1.配置启动文件的中断表,使用外部函数替换表项
.extern USB_LP_CAN1_RX0_IRQHandler
2.实现中断初始化函数,并实现中断接收处理函数
(这个时候可以在处理函数内添加一下打印,然后运行代码,然后再将单片机typec口与电脑USB口链接,正常情况会触发中断)
/*USB中断初始化*/
void USBInterrupt()
{
/*NVIC寄存器*/
*(uint32_t*)0xE000E100 |= (1 << 20); //USBRX中断(从机仅需要RX中断)
//USB模块,允许RX中断与复位中断
*(uint32_t*)0x40005C40 |= 0x0400;
*(uint32_t*)0x40005C40 |= (1 << 15);
}
/*USB接收中断处理*/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
}