|
外部中断间隔时间80us,共8000个,80us时间USB发送4KByte数据,外部中断会少100多个。如果把USB发送屏蔽掉,8000个中断都能正常响应。所以还是USB发送打断了外部中断响应,还有个问题是,用示波器查看CDC_Transmit_HS函数发送4KByte,执行完只需要几个us。USB发送的机制到底是什么样的,是不是虽然CDC_Transmit_HS函数执行完了,不代表发送完成了,后台模块还会占用单片机资源,进行发送。有没有解决办法,期待回复,谢谢了。 |
非官方开发板第一次下载成功,之后就各种失败
STM32F407VGT6 开发板Beak at address "0x0" with no debug information our outside
STM32H5F/E 相比 STM32F4 系列最大的优势是什么?
BootLoader 与 DFU 模式的区别
调度器原子变量相关问题
运行到 WRITE_REG (FLASH->OPTKEYR, FLASH_OPTKEY1)跳转 HardFaultHandler
ST TOF问题请教
STM32F417IG 单端外部时钟旁路HSE Bypass问题
STM32F4的SPI端口,如何实现多通道输入?
STM32L4A6 SDMMC 无法使用 1.8V IO 驱动 microSD 卡
微信公众号
手机版
当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发送打断了外部中断进入。导致中断次数不够。