没事的时候把喜爱的照片放到数码相框里。而这个相框又是个开发板,不是是很爽地事情。
呵呵。其实有开发板的童鞋,只要自己动动手就可以做出显示自己喜欢的图片的数码相框。
其实我是从例程:\STM32F429I-Discovery_FW_V1.0.1\Projects\Peripheral_Examples\LTDC_AnimatedPictureFromUSB
得到的启发,动手做出来地。
一定要记住,显示的图片一定是BMP的,且宽240高320地。
这个可以用看图软件,如1234看图王来转换。
下面先说下运行机制:
应用相关文件:
板子相关
>> GPIO连接:DM、DP、Vbus、SOF…
>> 系统中断NVIC配置和使能
>> 系统用到的延时功能
应用相关
>> 各种用户回调函数
>> 应用相关的初始化、实现等
MSC类相关文件:
处理BOT流程
MSC类特有命令和request处理
存储介质访问
各种SCSI命令处理
用户只需调用:
USBH_Init(&USB_OTG_Core,
USB_OTG_HS_CORE_ID
&USBH_MSC_cb,
&USR_cb);
其中
USR_cb是用户回调函数:
USBH_Usr_cb_TypeDef USR_cb =
{
USBH_USR_Init,
USBH_USR_DeInit,
USBH_USR_DeviceAttached,
USBH_USR_ResetDevice,
USBH_USR_DeviceDisconnected,
USBH_USR_OverCurrentDetected,
USBH_USR_DeviceSpeedDetected,
USBH_USR_Device_DescAvailable,
USBH_USR_DeviceAddressAssigned,
USBH_USR_Configuration_DescAvailable,
USBH_USR_Manufacturer_String,
USBH_USR_Product_String,
USBH_USR_SerialNum_String,
USBH_USR_EnumerationDone,
USBH_USR_UserInput,
USBH_USR_MSC_Application,
USBH_USR_DeviceNotSupported,
USBH_USR_UnrecoveredError
};
USBH_MSC_cb是类回调函数
USBH_Class_cb_TypeDef USBH_MSC_cb =
{
USBH_MSC_InterfaceInit,
USBH_MSC_InterfaceDeInit,
USBH_MSC_ClassRequest,
USBH_MSC_Handle,
};
运行时调用:
While(1){
USBH_Process(&USB_OTG_Core,&USB_Host);
}
其中USB_OTG_Core的数据结构为:
typedef struct _HCD
{
uint8_t Rx_Buffer [MAX_DATA_LENGTH];
__IO uint32_t ConnSts;
__IO uint32_t ErrCnt[USB_OTG_MAX_TX_FIFOS];
__IO uint32_t XferCnt[USB_OTG_MAX_TX_FIFOS];
__IO HC_STATUS HC_Status[USB_OTG_MAX_TX_FIFOS];
__IO URB_STATE URB_State[USB_OTG_MAX_TX_FIFOS];
USB_OTG_HC hc [USB_OTG_MAX_TX_FIFOS];
uint16_t channel [USB_OTG_MAX_TX_FIFOS];
}
HCD_DEV , *USB_OTG_USBH_PDEV;
USBH_HOST的数据结构是:
typedef struct _Host_TypeDef
{
HOST_State gState; /* USBH_Process大循环的switch */
HOST_State gStateBkp;
ENUM_State EnumState; /* 用于USBH_HandleEnum循环 */
CMD_State RequestState; /* USBH_CtlReq循环 */
USBH_Ctrl_TypeDef Control;
USBH_Device_TypeDef device_prop;
USBH_Class_cb_TypeDef *class_cb;
USBH_Usr_cb_TypeDef *usr_cb;
} USBH_HOST, *pUSBH_HOST;
USBH_HOST USB_Host
MSC、HID类的回调函数
用户回调函数整个过程如下图所示:
首先U盘插上主机通过中断函数检测到U盘插上。
• return (pdev->host.ConnSts)
• 如果检测到插入,状态从HOST_IDEL HOST_DEV_ATTACHED
• phost->gState = HOST_DEV_ATTACHED
插出也是通过中断
phost->gState = HOST_DEV_DISCONNECTED
为设备的双向0端点各分配一个channel,并打开
读取状态寄存器 pdev->regs.HPRT0,其中有2个bit域表示速度信息
然后是杖举。杖举结束后。就发出各种请求。
case HOST_USR_INPUT:
if ( phost->usr_cb->UserInput() == OK)
{
if ( (phost->class_cb->Init (pdev, phost)) == OK)
{ phost->gState = HOST_CLASS_REQUEST; }
}
case HOST_CLASS_REQUEST:
status = phost->class_cb->Requests (pdev, phost);
if(status == USBH_OK)
{ phost->gState = HOST_CLASS; }
else
{ USBH_ErrorHandle(phost, status); }
case HOST_CLASS:
status = phost->class_cb->Machine (pdev, phost);
USBH_ErrorHandle(phost, status);
break;
一系列杖举和发请求之后,最终到了用户处理函数。
pphost->usr_cb->UserApplication()
int USBH_USR_MSC_Application(void)
{
USBH_USR_ApplicationState
= USH_USR_FS_INIT: f_mount( 0, &fatfs )
= USH_USR_FS_READLIST: Explore_Disk("0:/", 1)
f_opendir(&dir, path);
f_readdir(&dir, &fno);
= USH_USR_FS_WRITEFILE: f_mount(0, &fatfs )
f_open(&file, "0:STM32.TXT",FA_CREATE_ALWAYS | FA_WRITE)
f_write (&file, writeTextBuff, bytesToWrite, (void *)&bytesWritten);
…………….
f_close(&file)
f_mount(0, NULL)
= USH_USR_FS_DRAW: f_mount( 0, &fatfs )
Image_Browser("0:/")
}
本帖最后由 ddllxxrr 于 2014-2-19 19:56 编辑