
外部中断间隔时间80us,共8000个,80us时间USB发送4KByte数据,外部中断会少100多个。如果把USB发送屏蔽掉,8000个中断都能正常响应。所以还是USB发送打断了外部中断响应,还有个问题是,用示波器查看CDC_Transmit_HS函数发送4KByte,执行完只需要几个us。USB发送的机制到底是什么样的,是不是虽然CDC_Transmit_HS函数执行完了,不代表发送完成了,后台模块还会占用单片机资源,进行发送。有没有解决办法,期待回复,谢谢了。 |
CUEBIDE生成的APP程序,在写入FLASH之后无法正常跳转。
有关Cubeide IAP 问题
stm32驱动st7735屏幕区分地图上的障碍物.
STM32H7双核调试问题:CM7能成功调试但CM4始终报"Failed to read ROM table via AP 3"错误
stm32cubumx使用1.28.0固件包无法初始化fsmc
STM32 touch 4.24.2 生成代码,但是keil编译不通过问题 求助
stm32cubeIDE使用malloc失败
stm32G474的flash模式如何判定?single bank 和dual bank
请教为什么中断回调函数中不能使用接收中断开启函数
bootloader占用的flash起始地址一般在哪,从0x08000000地址开始的flash能够被用户使用吗
当USB控制器完成一次IN事务传输后,会触发传输完成中断。中断处理程序会调用 USBD_LL_DataInStage 函数。
在 USBD_LL_DataInStage 函数中,调用DataIn 回调函数 USBD_CDC_DataIn继续后续的数据发送,当全部数据发送完毕后,会再调用
CDC_TransmitCplt_FS()函数,它返回OK时即表征当前一批数据发送完成。
结合你的应用,建议将usb中断优先级相对调得低于EXTI的中断优先级,USB传输毕竟是基于缓冲和握手应答,它的中断优先级可以相对调低点。
DC_Transmit_HS函数执行完了,不代表发送完成。
调用 CDC_Transmit_FS 或 CDC_Transmit_HS 函数只是做好了发送数据的准备,实际的数据传输是由底层的 USB 驱动和硬件控制器完成的。
传输完成后,USB 控制器可以触发传输完成中断,并调用传输完成回调函数。
非常感谢您的回复,有几个问题请教:
1、您说的“传输完成后,USB 控制器可以触发传输完成中断,并调用传输完成回调函数”USB 控制器可以触发传输完成中断指的是OTG_HS_EP1_OUT吗?传输完成回调函数是CDC_TransmitCplt_HS()吗?我在CDC_Transmit_HS()中调用了CDC_TransmitCplt_HS(),是不是CDC_Transmit_HS()执行完,也就是发送全部完成了。
2、我的中断优先级代码:
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); HAL_NVIC_SetPriority(EXTI15_10_IRQn, 1, 1); HAL_NVIC_SetPriority(OTG_HS_IRQn, 2, 2);
3、发送数据部分代码
while(1) { if(loopnum>270336||loopnum==270336) { HAL_NVIC_DisableIRQ(EXTI15_10_IRQn); goto loop2; } else { if(pixnum==4096||pixnum>4096) { HAL_NVIC_EnableIRQ(OTG_HS_IRQn); num1++; pixnum=0; while(k==CDC_Transmit_HS((unsigned char *)(Scan_Data_Buff),2048)); HAL_NVIC_DisableIRQ(OTG_HS_IRQn); } } }
4、中断函数:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { unsigned char i,j,k; Scan_Data_Buff[pixnum]=(uint16_t)(Scan_data_Add_rel); loopnum++; pixnum++;
}
大致过程是外部中断270336次,其中每4096次就发送一次数据,数据个数是4096个。是代码有问题吗?对寄存器操作不全?现在问题还是USB发送打断了外部中断进入。导致中断次数不够。