STM32 usb_mem.c和usb_sil.c文件的分析
来源:互联网 发布:什么网络电话软件好 编辑:程序博客网 时间:2024/05/16 03:31
/******************************************************************************** Function Name : UserToPMABufferCopy* Description : 从用于内存区拷贝数据到PMA(数据包内存区)* Input : pbUsrBuf:指向用户的内存区* wPMABufAddr:要拷贝到PMA的wPMABufAddr地址处* wNBytes: 要拷贝的数据长度(单位:字)* Output : None.* Return : None.*******************************************************************************/void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes){ uint32_t n = (wNBytes + 1) >> 1; //n = (wNBytes + 1) / 2,表示多少字 uint32_t i, temp1, temp2; uint16_t *pdwVal; pdwVal = (uint16_t *)(wPMABufAddr * 2 + PMAAddr);//pdwVal存放要将数据存放的地址 for (i = n; i != 0; i--)//开始考被数据 { temp1 = (uint16_t) * pbUsrBuf; pbUsrBuf++; temp2 = temp1 | (uint16_t) * pbUsrBuf << 8;//整合2个16bit数据 *pdwVal++ = temp2;//把整合的数据拷贝PMA内 pdwVal++;//目的指针指向下一个地址 pbUsrBuf++;//源指针指向下一地址 }}/******************************************************************************** Function Name : PMAToUserBufferCopy* Description : Copy a buffer from user memory area to packet memory area (PMA)* Input : pbUsrBuf指向用户的内存区* wPMABufAddr PAM的地址* wNBytes要拷贝的字节数 * Output : None.* Return : None.*******************************************************************************/void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes){ uint32_t n = (wNBytes + 1) >> 1;//n = (wNBytes + 1) / 2,表示多少字 uint32_t i; uint32_t *pdwVal; pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr);//从PAM区中去读1字数据 for (i = n; i != 0; i--) { *(uint16_t*)pbUsrBuf++ = *pdwVal++;//拷贝用户的内存区中 pbUsrBuf++; }}
/******************************************************************************** Function Name : USB_SIL_Init* Description : 初始化USB设备IP和端点* Input : None.* Output : None.* Return : Status.*******************************************************************************/uint32_t USB_SIL_Init(void){#ifndef STM32F10X_CL /* USB interrupts initialization */ /* clear pending interrupts */ _SetISTR(0); //禁止所有的中断 wInterrupt_Mask = IMR_MSK; /* set interrupts mask */ _SetCNTR(wInterrupt_Mask); //使能一些中断 #else /* Perform OTG Device initialization procedure (including EP0 init) */ OTG_DEV_Init(); //执行初始化程序OTG设备(包括EP0初始化) #endif /* STM32F10X_CL */ return 0;}
/******************************************************************************** Function Name : USB_SIL_Write* Description : 往选中的端点中写入数据* Input : bEpAddr:非控制端点的地址 * pBufferPointer:指向要写入端点的缓冲数据* wBufferSize:要写入的数据长度(单位:字节) * Output : None.* Return : Status.*******************************************************************************/uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize){#ifndef STM32F10X_CL UserToPMABufferCopy(pBufferPointer, GetEPTxAddr(bEpAddr & 0x7F), wBufferSize);//把用户数据拷贝到PMA中 SetEPTxCount((bEpAddr & 0x7F), wBufferSize); //更新数据长度的控制寄存器 #else PCD_EP_Write (bEpAddr, pBufferPointer, wBufferSize); //使用使用PCD接口层函数来写入选择的端点 #endif /* STM32F10X_CL */ return 0;}/******************************************************************************** Function Name : USB_SIL_Read* Description : 从选中的端点中读出数据* Input : bEpAddr:非控制端点的地址* pBufferPointer:指向要保存的数据区地址 * Output : None.* Return : 返回读出来的数据长度(单位:字节)*******************************************************************************/uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer){ uint32_t DataLength = 0;#ifndef STM32F10X_CL DataLength = GetEPRxCount(bEpAddr & 0x7F); //从选中的端点中获取接收的数据长度 PMAToUserBufferCopy(pBufferPointer, GetEPRxAddr(bEpAddr & 0x7F), DataLength);//从PMA拷贝数据到用户区#else USB_OTG_EP *ep; ep = PCD_GetOutEP(bEpAddr);//获取选中端点的结构体指针 DataLength = ep->xfer_len;//获取接收到的数据长度 PCD_EP_Read (bEpAddr, pBufferPointer, DataLength);//使用PCD接口层函数读取选中的端口 #endif /* STM32F10X_CL */ return DataLength;//返回接收到的数据长度}
- STM32 usb_mem.c和usb_sil.c文件的分析
- STM32 usb_init.c和usb_int.c文件分析
- STM32 usb_endp.c和usb_istr.c文件分析
- STM32 usb_endp.c和usb_istr.c文件分析
- STM32 usb_pwr.c文件分析
- STM32 system_stm32f10x.c文件分析
- STM32学习笔记之 USB驱动usb_endp.c文件和usb_istr.c文件分析
- stm32的Core_cm3.c文件
- STM32 usb_core.c分析
- stm32 system_stm32f10x.c文件
- stm32 c和c++混合开发 头文件改变
- 单片机和C和STM32
- STM32 usb_prop.c文件分析与usb_core.h一些数据定义分析
- STM32启动文件的分析
- gt9xx.c和gt9xx.h文件分析
- STM32 C文件注释规范实例
- STM32启动过程和启动文件分析
- ks_sys.c 文件分析
- cvQueryFrame获取的图像和cvReleas…
- OpenCV中的内存泄露问题(cvLoadIm…
- OpenCV中的内存泄露问题(cvLoadIm…
- 计算程序运行时间
- 计算程序运行时间
- STM32 usb_mem.c和usb_sil.c文件的分析
- linux 下 opencv2.0 的编译与安装 …
- linux 下 opencv2.0 的编译与安装 …
- V4L2 usb 摄像头 测试
- V4L2 usb 摄像头 测试
- 摄像头究竟如何选购
- 摄像头究竟如何选购
- 读取随机文件
- Qt/Linux 下的摄像头捕获(Video4L…