专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
STM32F4系列,如何实现usb host和usb device动态切换
2019-07-20 16:58
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
4780
16
1156
第一次发帖,请大家解答多谢;
STM32F4系列,如何实现usb host和usb device动态切换;
硬件设计是共用一个usb;
软件实现host和device的动态切换;
单独的host 和 device都是ok的;
而host切换到device也是好的;
device切到host不行??
请问切换需要注意什么么?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
jiafangshi
2019-07-21 15:14
[mw_shl_code=c,true]
void usb_application(void)
{
/*host*/
if(!usb.host_device)
{
USBH_Init(&USB_OTG_Core,
#ifdef USE_USB_OTG_FS
USB_OTG_FS_CORE_ID,
#else
USB_OTG_HS_CORE_ID,
#endif
&USB_Host,
&USBH_MSC_cb,
&USBH_USR_cb);
/*使能管脚,控制为Vbus管脚供电*/
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
GPIOA->MODER=(GPIOA->MODER&0xfff3ffff);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,0) ;
/*等待电平稳定*/
os_dly_wait(10);
}
/*device*/
else if(usb.host_device == 1)
{
USBD_Init(&USB_OTG_Core,
#ifdef USE_USB_OTG_FS
USB_OTG_FS_CORE_ID,
#elif defined USE_USB_OTG_HS
USB_OTG_HS_CORE_ID,
#endif
&USR_desc,
&USBD_CDC_cb,
&USBD_USR_cb);
/*使能管脚,控制不为Vbus管脚供电*/
GPIO_SetBits(GPIOC, GPIO_Pin_9);
GPIOA->MODER=(GPIOA->MODER&0xfff3ffff)|0x00080000;
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG1_FS) ;
/*等待电平稳定*/
os_dly_wait(10);
}
}
/*****************************************************************
** 函 数 名: TaskUSBCommu
** 输 入: 无
** 输 出: 无
** 功能描述: USB的通讯任务
** 作 者:
** 修改日期: 2008-09-30 15:19
****************************************************************/
__task void TaskUSBCommu(void)
{
OS_RESULT result;
__IO uint32_t i = 0;
u16 event,TaskTime=0xffff;
u8 init_num=0;
// u8 vcp_connect = 0; /*表示虚拟串口线第一次插入*/
/*初始化*/
usb.connect = 0;
usb.host_device=1;
usb.sec_time=0;
if((ProgUpdateStr.RTXSTCHECK&0x80000020)==0x80000020) ProgUpdateStr.RTXSTCHECK&=0xffffffdf;
while(1)
{
ClrHardDog();
RTXTASKCheck.TaskUSBCommu_RT=0;
result = os_evt_wait_or (0xffff, TaskTime);
RTXTASKCheck.TaskUSBCommu_RT=0x8258; //10分钟
if(result==OS_R_EVT) //有事件发生
{
event=os_evt_get (); //获取事件标志
os_evt_clr (event, tID_TaskEventManage); //清除已取出的事件
/*当有事件发生的时候,下面的也只执行一次即可*/
if(event&0x0001) //秒轮询事件
{
/*每次插拔U盘或者转换状态的时候,都需要重新进行一次初始化工作*/
if((init_num == 0))
{
init_num = 1;
usb_application();
}
usb.sec_time++;
/*-------------------USB host状态------------------------------------------*/
if(!usb.host_device)
{
/*插入U盘检测U盘已经插入*/
if((HCD_IsDeviceConnected(&USB_OTG_Core) == 1))
{
USBStatus=1;
usb.connect = 1;
/*USB已经连接上了*/
while(usb.connect == 1)
{
/* Host Task handler */
USBH_Process(&USB_OTG_Core, &USB_Host); /*USB的周期轮询任务*/
if(HCD_IsDeviceConnected(&USB_OTG_Core) == 0) break;
}
}
/*U盘已经拔出*/
else if((HCD_IsDeviceConnected(&USB_OTG_Core) == 0)&&(usb.connect))
{
usb.connect = 0;
init_num = 0;
USBStatus=0;
usb.sec_time=0;
usb.host_device=1;
}
}
/*---------------------------USB vcp状态---------------------------------------*/
else if(usb.host_device == 1)
{
/*检测到了串口线插上了*/
if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9) == Bit_SET))
{
usb.connect = 1;
}
/*未检出到串口线插上*/
else if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9) != Bit_SET))
{
if(usb.connect)
{
usb.connect = 0;
init_num = 0;
usb.sec_time=0;
}
if(usb.sec_time>30) //未检测到串口线,且非信息输出状态
{
usb.host_device=0; //切换为host
init_num = 0; //重新初始化
InfoOutputMode=0;
}
}
}
}
}
else //超时
{
}
}
}[/mw_shl_code]
加载中...
查看其它16个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
void usb_application(void)
{
/*host*/
if(!usb.host_device)
{
USBH_Init(&USB_OTG_Core,
#ifdef USE_USB_OTG_FS
USB_OTG_FS_CORE_ID,
#else
USB_OTG_HS_CORE_ID,
#endif
&USB_Host,
&USBH_MSC_cb,
&USBH_USR_cb);
/*使能管脚,控制为Vbus管脚供电*/
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
GPIOA->MODER=(GPIOA->MODER&0xfff3ffff);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,0) ;
/*等待电平稳定*/
os_dly_wait(10);
}
/*device*/
else if(usb.host_device == 1)
{
USBD_Init(&USB_OTG_Core,
#ifdef USE_USB_OTG_FS
USB_OTG_FS_CORE_ID,
#elif defined USE_USB_OTG_HS
USB_OTG_HS_CORE_ID,
#endif
&USR_desc,
&USBD_CDC_cb,
&USBD_USR_cb);
/*使能管脚,控制不为Vbus管脚供电*/
GPIO_SetBits(GPIOC, GPIO_Pin_9);
GPIOA->MODER=(GPIOA->MODER&0xfff3ffff)|0x00080000;
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG1_FS) ;
/*等待电平稳定*/
os_dly_wait(10);
}
}
/*****************************************************************
** 函 数 名: TaskUSBCommu
** 输 入: 无
** 输 出: 无
** 功能描述: USB的通讯任务
** 作 者:
** 修改日期: 2008-09-30 15:19
****************************************************************/
__task void TaskUSBCommu(void)
{
OS_RESULT result;
__IO uint32_t i = 0;
u16 event,TaskTime=0xffff;
u8 init_num=0;
// u8 vcp_connect = 0; /*表示虚拟串口线第一次插入*/
/*初始化*/
usb.connect = 0;
usb.host_device=1;
usb.sec_time=0;
if((ProgUpdateStr.RTXSTCHECK&0x80000020)==0x80000020) ProgUpdateStr.RTXSTCHECK&=0xffffffdf;
while(1)
{
ClrHardDog();
RTXTASKCheck.TaskUSBCommu_RT=0;
result = os_evt_wait_or (0xffff, TaskTime);
RTXTASKCheck.TaskUSBCommu_RT=0x8258; //10分钟
if(result==OS_R_EVT) //有事件发生
{
event=os_evt_get (); //获取事件标志
os_evt_clr (event, tID_TaskEventManage); //清除已取出的事件
/*当有事件发生的时候,下面的也只执行一次即可*/
if(event&0x0001) //秒轮询事件
{
/*每次插拔U盘或者转换状态的时候,都需要重新进行一次初始化工作*/
if((init_num == 0))
{
init_num = 1;
usb_application();
}
usb.sec_time++;
/*-------------------USB host状态------------------------------------------*/
if(!usb.host_device)
{
/*插入U盘检测U盘已经插入*/
if((HCD_IsDeviceConnected(&USB_OTG_Core) == 1))
{
USBStatus=1;
usb.connect = 1;
/*USB已经连接上了*/
while(usb.connect == 1)
{
/* Host Task handler */
USBH_Process(&USB_OTG_Core, &USB_Host); /*USB的周期轮询任务*/
if(HCD_IsDeviceConnected(&USB_OTG_Core) == 0) break;
}
}
/*U盘已经拔出*/
else if((HCD_IsDeviceConnected(&USB_OTG_Core) == 0)&&(usb.connect))
{
usb.connect = 0;
init_num = 0;
USBStatus=0;
usb.sec_time=0;
usb.host_device=1;
}
}
/*---------------------------USB vcp状态---------------------------------------*/
else if(usb.host_device == 1)
{
/*检测到了串口线插上了*/
if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9) == Bit_SET))
{
usb.connect = 1;
}
/*未检出到串口线插上*/
else if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9) != Bit_SET))
{
if(usb.connect)
{
usb.connect = 0;
init_num = 0;
usb.sec_time=0;
}
if(usb.sec_time>30) //未检测到串口线,且非信息输出状态
{
usb.host_device=0; //切换为host
init_num = 0; //重新初始化
InfoOutputMode=0;
}
}
}
}
}
else //超时
{
}
}
}[/mw_shl_code]
一周热门 更多>