
外部中断间隔时间80us,共8000个,80us时间USB发送4KByte数据,外部中断会少100多个。如果把USB发送屏蔽掉,8000个中断都能正常响应。所以还是USB发送打断了外部中断响应,还有个问题是,用示波器查看CDC_Transmit_HS函数发送4KByte,执行完只需要几个us。USB发送的机制到底是什么样的,是不是虽然CDC_Transmit_HS函数执行完了,不代表发送完成了,后台模块还会占用单片机资源,进行发送。有没有解决办法,期待回复,谢谢了。 |
stm32支持canfd和dma结合使用吗
NUCLEO-F401RE板卡,连接USB,在KEIL下可以找到ST-LINK仿真器,也可以下载代码。在电脑上看不到NODE_F401RE的磁盘,有知道是什么原因?
程序进入HardFault_Handler求解
stm32h725
STM32CUBEIDE
This example describes how to configure the FMC controller to access the SDRAM memory in low power mode
STM32407 使用串口闲时中断+DMA方式接收最大接收字节是多少
USB_CDC_HOST 标准库里边USBH_DeAllocate_AllChannel()函数的疑问?
STM32部署机器学习算法硬件至少要使用哪个系列的芯片?
重新配置SCB->VTOR = 0x08010000后,再次复位,程序异常,发现不进tick中断,IIC读数卡死在准备查询循环中。
当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发送打断了外部中断进入。导致中断次数不够。