
外部中断间隔时间80us,共8000个,80us时间USB发送4KByte数据,外部中断会少100多个。如果把USB发送屏蔽掉,8000个中断都能正常响应。所以还是USB发送打断了外部中断响应,还有个问题是,用示波器查看CDC_Transmit_HS函数发送4KByte,执行完只需要几个us。USB发送的机制到底是什么样的,是不是虽然CDC_Transmit_HS函数执行完了,不代表发送完成了,后台模块还会占用单片机资源,进行发送。有没有解决办法,期待回复,谢谢了。 |
STM32中比较适合做FOC控制的芯片
谜之BUG求解
STM32G030F6P6写FLASH最后8字节出错
程序卡死在vPortFree函数中
STM32F334如何配置PB1输出HRTIM同步信号
stm32f4系列sdio 时钟如何获取
哪里能下载ST官方展示的NUCLEO-G071RB配合X-NUCLEO-GFX01M1运行TouchGFX案例的源程序?
stm32f407这个STM32_RCC_PERIPHCLK_SDMMC 是哪里定义的
STM32 CUBEIDE 编译报error: expected identifier or '(' before '__asm'
I2C从模式编程之STOP中断
当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发送打断了外部中断进入。导致中断次数不够。