stm32f4有重映射么_stm32f4,CDC迁移为Bulk设备

搞懂以下问题,来理解USB

主机发送2字节时,小于端点的容量,怎么标志包的结束

内部自动完成,发送几个数都可以。是底层自动完成的

主机发送513字节时,大于端点的容量,怎么分包?

txFifo空中断中,将数据拷贝到FIFO,调整指针。

数据如何从stm32发给电脑:

app调用usbd_cdc_if.c中的CDC_Transmit_HS();

CDC_Transmit_HS调用usbd_cdc.c中的USBD_CDC_TransmitPacket();

USBD_CDC_TransmitPacket调用usbd_conf.c中的USBD_LL_Transmit();

USBD_LL_Transmit调用  stm32f4_hal_pcd.c中的HAL_PCD_EP_Transmit();

HAL_PCD_EP_Transmit调用stm32f4_ii_usb.c中的USB_EPStartXfer();

USB_EPStartXfer设置了发送数据大小,并使能IN端点;   要发送的数据时怎么让USB外设知道的:

CDC_Transmit_HS调用usbd_cdc.c中的USBD_CDC_SetTxBuffer

USBD_CDC_SetTxBuffer中设置hcdc->TxBuffer,hcdc->TxLength

HAL_PCD_EP_Transmit中设置ep->xfer_buff,ep->xfer_len

stm32f4_ii_usb.c中的USB_EPStartXfer设置打开TX FIFO空中断;

stm32f4xx_hal_pcd.c中的HAL_PCD_IRQHandler,IN端点中断调用PCD_WriteEmptyTxFifo();

PCD_WriteEmptyTxFifo调用stm32f4_ii_usb.c中的USB_WritePacket,并调整buff指针和len;

USB_WritePacket将数据搬运到usb的fifo中

注意,数据传输完的总中断:

programmed size(全部数据)传输完毕后,stm32f4_hal_pcd.c中的HAL_PCD_IRQHandler()中断调用usbd_conf.c中的HAL_PCD_DataInStageCallback

HAL_PCD_DataInStageCallback调用usbd_core.c中的USBD_LL_DataInStage ,其中调用了pdev->pClass->DataIn()

实际usbd_cdc.c中的USBD_CDC_DataIn通过注册已经绑定为pdev->pClass->USBD_CDC_DataIn;

USBD_CDC_DataIn中判断长度如果时整数包长度,就发送一个0长度的包,否则不发送。

一次发送至此,结束。

综上,stm32发给电脑,完全是主动方式,期间不需要电脑的参与。

数据如何从电脑发给stm32:

电脑发给stm32一个包;

stm32进入中断的RXFIFO noEmpty中断,其中GRXSTSP中指明是哪个out端点中断

中断的是out数据包,且个数不为0,调用stm32f4_ii_usb.c中的USB_ReadPacket();

USB_ReadPacket将FIFO数据读入ep->xfer_buff,

usbd_cdc.c中的USBD_CDC_Init、和usbd_cdc_if.c中的USBD_CDC_ReceivePacket调用USBD_LL_PrepareReceive()已经设置了缓冲区指针,上一步相当于直接写入用户自定义数组中。

要接收的大小,一旦这个programmed大小传输完,就会进入out中断XFRC,标志所有数据传输完毕,接着调用用户程序,然后再次调用prepare,准备好下一次接收。

怎么理解数据都是由主机发送的?从机不能主动发送数据给从机,在主机没发起的情况下?

修改VID,PID,即能识别为光谱仪

usbd_conf.c中包含bsp.h文件,设定中断vect

uc/osiii不能够设置断点调试,解决方式:https://blog.csdn.net/qq_24276421/article/details/52461061

串口中断的优先级需要调整,大于0

USB只能接收一次,

USBD_StatusTypeDef  USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum,uint8_t *pdata)

端点0在内部处理

其它端点通过回调函数处理:pdev->pClass->DataIn(pdev, epnum);

在usb_conf中,这个函数调用的:void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)

HAL_PCD_DataInStageCallback

在stm32f4xx_hal_pcd.c的,void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)中调用

HAL_PCD_IRQHandler_HS

在usb_conf.c的void HAL_PCD_IRQHandler_HS(void)中调用

HAL_PCD_IRQHandler_HS

BSP_IntVectSet(BSP_INT_ID_OTG_HS, HAL_PCD_IRQHandler_HS);

在osIII的中断向量表映射至OTG_HS

DOEPTSIZx

PKTCNT是组成XFRSIZE需要多少数据包

XFRSIZE是传输的总数据,可以设置为max packet size of EP,这样每个数据包都会XFRC中断,可以进行处理;也可以设置大于max packet size,这样core会自动把多个数据包存入memory,最后一个包进入XFRC中断;XFRC中断的条件:1,XFRSIZE=0;2,size

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值