微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32--USB详细使用说明

STM32--USB详细使用说明

时间:11-27 来源:互联网 点击:

B上电连接

//对USB模块强制复位,类似于USB总线上的复位信号。USB模块将一直保持在复位状态下
//直到软件清除此位。如果USB复位中断被使能,将产生一个复位中断。
wRegVal = CNTR_FRES;//强制复位
_SetCNTR(wRegVal);

wInterrupt_Mask = 0;
_SetCNTR(wInterrupt_Mask);//清除复位信号

_SetISTR(0);

//复位中断屏蔽位 挂起中断屏蔽位 唤醒中断屏蔽位使能
wInterrupt_Mask = CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM;

_SetCNTR(wInterrupt_Mask);
#endif

return USB_SUCCESS;
}

usb_istr.c文件里面,下面只写了进入到复位中断函数,进入到USB连接状态

void USB_Istr(void)

{

wIstr = _GetISTR();

#if (IMR_MSK & ISTR_RESET)//USB复位请求中断
if (wIstr & ISTR_RESET & wInterrupt_Mask)
{
_SetISTR((uint16_t)CLR_RESET);//清楚复位中断标志
Device_Property.Reset();//进入到复位中断
#ifdef RESET_CALLBACK
RESET_Callback();
#endif
}
#end

}

usb_prop.c文件里面,实现对端点的设置。

void Joystick_Reset(void)
{

pInformation->Current_Configuration = 0;
pInformation->Current_Interface = 0;

pInformation->Current_Feature = Joystick_ConfigDescriptor[7];//供电模式选择

#ifdef STM32F10X_CL

OTG_DEV_EP_Init(EP1_IN, OTG_DEV_EP_TYPE_INT, 4);
#else

SetBTABLE(BTABLE_ADDRESS);//分组缓冲区描述表地址设置

SetEPType(ENDP0, EP_CONTROL);//初始化为控制端点类型
SetEPTxStatus(ENDP0, EP_TX_STALL); //端点以STALL分组响应所有的发送请求。

//也就是端点状态设置成发送无效,也就是主机的IN令牌包来的时候,回送一个STALL。
SetEPRxAddr(ENDP0, ENDP0_RXADDR);//设置端点0描述符的接受地址,

SetEPTxAddr(ENDP0, ENDP0_TXADDR);//设置端点0描述符的发送地址

Clear_Status_Out(ENDP0);

//仅用于控制端点 如果STATUS_OUT位被清除,OUT分组可以包含任意长度的数据
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);

//设置端点0的接受字节寄存器的最大值是64
SetEPRxValid(ENDP0);//设置接受端点有效

SetEPType(ENDP1, EP_INTERRUPT);//初始化为中断端点类型
SetEPTxAddr(ENDP1, ENDP1_TXADDR);//设置发送数据的地址
SetEPTxCount(ENDP1, 4);//设置发送的长度
SetEPRxStatus(ENDP1, EP_RX_DIS);//设置接受端点关闭
SetEPTxStatus(ENDP1, EP_TX_NAK);//设置发送端点端点非应答

SetDeviceAddress(0);//设置设备用缺省地址相应
#endif

bDeviceState = ATTACHED;//当前状态连接
}

usb_sil.c的文件里面,主要是使能了如下这些中断

CNTR_CTRM 正确传输(CTR)中断使能 CNTR_WKUPM 唤醒中断使能
CNTR_SUSPM 挂起(SUSP)中断使能 CNTR_ERRM 出错中断使能
CNTR_SOFM 帧首中断使能 CNTR_ESOFM 期望帧首中断使能CNTR_RESETM 设置此位将向PC主机发送唤醒请求。根据USB协议,如果此位在1ms到15ms内保持有效,主机将对USB模块实行唤醒操作。

uint32_t USB_SIL_Init(void)
{
#ifndef STM32F10X_CL

_SetISTR(0);//清除中断标志
wInterrupt_Mask = IMR_MSK;

//这组寄存器用于定义USB模块的工作模式,中断的处理,设备的地址和读取当前帧的编号
_SetCNTR(wInterrupt_Mask);//设置相应的控制寄存器
#else

OTG_DEV_Init();
#endif

return 0;
}

***************(3)**************

1.获取设备描述符

usb_int.c的文件里面

低优先级中断 在控制 中断 批量传输下使用(在单缓冲模式下使用)
当一次正确的OUT,SETUP,IN数据传输完成后,硬件会自动设置此位为NAK状态,使应用程序有足够的时间处理完当前传输的数据后,响应下一个数据分组

void CTR_LP(void)
{
__IO uint16_t wEPVal = 0;

while (((wIstr = _GetISTR()) & ISTR_CTR) != 0)
{

EPindex = (uint8_t)(wIstr & ISTR_EP_ID);//读出端点ID
if (EPindex == 0)//如果是端点0
{


SaveRState = _GetENDPOINT(ENDP0);//读取端点0寄存器USB_EP0R
SaveTState = SaveRState & EPTX_STAT;//保存发送状态位
SaveRState &= EPRX_STAT;//保存接受状态位
_SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK);//端点以NAK分组响应所有的发送和接受请求(解释在上面)

if ((wIstr & ISTR_DIR) == 0)//IN令牌,数据被取走

{

_ClearEP_CTR_TX(ENDP0);//清除正确发送标志位
In0_Process();//处理INT事件

_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
return;
}
else
{

wEPVal = _GetENDPOINT(ENDP0);//得到端点0寄存器的数据
if ((wEPVal &EP_SETUP) != 0)//SETUP分组传输完成标志
{
_ClearEP_CTR_RX(ENDP0);
Setup0_Process();//处理SETUP事件

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top