📄 stm32f10x_usb.cpp
字号:
#include"stm32f10x_rcc.h"
#include"stm32f10x_nvic.h"
//-----------------------------------------------------------------------------
#include"stm32f10x_usb.hpp"
//-----------------------------------------------------------------------------
unsigned int EPxR_STATUS=0;
unsigned int* pEPxR_STATUS;
//-----------------------------------------------------------------------------
EPxR::EPxR(unsigned int id)
{
this->ID=id;
switch(this->ID)
{
case 0:
this->WORD=(volatile unsigned long*)(0x40005C00);
this->BITS=(volatile unsigned long*)(0x42000000+(0x00005c00<<5));
break;
case 1:
this->WORD=(volatile unsigned long*)(0x40005C04);
this->BITS=(volatile unsigned long*)(0x42000000+(0x00005c04<<5));
break;
}
unsigned int temp;
temp=(unsigned int)&EPxR_STATUS;
temp-=0x20000000;
temp<<=5;
temp+=0x22000000;
pEPxR_STATUS=(unsigned int*)temp;
}
//-----------------------------------------------------------------------------
void EPxR::TYPE(EP_TYPE Value)
{
switch(Value)
{
case BULK:
this->BITS[EP_TYPE_1]=0;
this->BITS[EP_TYPE_0]=0;
break;
case CONTROL:
this->BITS[EP_TYPE_1]=0;
this->BITS[EP_TYPE_0]=1;
break;
case ISO:
this->BITS[EP_TYPE_1]=1;
this->BITS[EP_TYPE_0]=0;
break;
case INTERRUPT:
this->BITS[EP_TYPE_1]=1;
this->BITS[EP_TYPE_0]=1;
break;
}
}
//-----------------------------------------------------------------------------
void EPxR::STAT_RX_TX(EP_STAT RxValue,EP_STAT TxValue)
{
EPxR_STATUS=this->WORD[0];
pEPxR_STATUS[DTOG_RX]=0;
pEPxR_STATUS[STAT_RX_1]=0;
pEPxR_STATUS[STAT_RX_0]=0;
pEPxR_STATUS[DTOG_TX]=0;
pEPxR_STATUS[STAT_TX_1]=0;
pEPxR_STATUS[STAT_TX_0]=0;
switch(RxValue)
{
case DISABLED:
pEPxR_STATUS[STAT_RX_1]=this->BITS[STAT_RX_1]^0;
pEPxR_STATUS[STAT_RX_0]=this->BITS[STAT_RX_0]^0;
break;
case STALL:
pEPxR_STATUS[STAT_RX_1]=this->BITS[STAT_RX_1]^0;
pEPxR_STATUS[STAT_RX_0]=this->BITS[STAT_RX_0]^1;
break;
case NAK:
pEPxR_STATUS[STAT_RX_1]=this->BITS[STAT_RX_1]^1;
pEPxR_STATUS[STAT_RX_0]=this->BITS[STAT_RX_0]^0;
break;
case VALID:
pEPxR_STATUS[STAT_RX_1]=this->BITS[STAT_RX_1]^1;
pEPxR_STATUS[STAT_RX_0]=this->BITS[STAT_RX_0]^1;
break;
}
switch(TxValue)
{
case DISABLED:
pEPxR_STATUS[STAT_TX_1]=this->BITS[STAT_TX_1]^0;
pEPxR_STATUS[STAT_TX_0]=this->BITS[STAT_TX_0]^0;
break;
case STALL:
pEPxR_STATUS[STAT_TX_1]=this->BITS[STAT_TX_1]^0;
pEPxR_STATUS[STAT_TX_0]=this->BITS[STAT_TX_0]^1;
break;
case NAK:
pEPxR_STATUS[STAT_TX_1]=this->BITS[STAT_TX_1]^1;
pEPxR_STATUS[STAT_TX_0]=this->BITS[STAT_TX_0]^0;
break;
case VALID:
pEPxR_STATUS[STAT_TX_1]=this->BITS[STAT_TX_1]^1;
pEPxR_STATUS[STAT_TX_0]=this->BITS[STAT_TX_0]^1;
break;
}
this->WORD[0]=EPxR_STATUS;
}
//-----------------------------------------------------------------------------
void EPxR::KIND(unsigned int Value)
{
EPxR_STATUS=this->WORD[0];
pEPxR_STATUS[DTOG_RX]=0;
pEPxR_STATUS[STAT_RX_1]=0;
pEPxR_STATUS[STAT_RX_0]=0;
pEPxR_STATUS[DTOG_TX]=0;
pEPxR_STATUS[STAT_TX_1]=0;
pEPxR_STATUS[STAT_TX_0]=0;
pEPxR_STATUS[EP_KIND]=
this->BITS[EP_KIND]^Value;
this->WORD[0]=EPxR_STATUS;
}
//-----------------------------------------------------------------------------
void EPxR::Clear_CTR_RX(void)
{
EPxR_STATUS=this->WORD[0];
pEPxR_STATUS[DTOG_RX]=0;
pEPxR_STATUS[STAT_RX_1]=0;
pEPxR_STATUS[STAT_RX_0]=0;
pEPxR_STATUS[DTOG_TX]=0;
pEPxR_STATUS[STAT_TX_1]=0;
pEPxR_STATUS[STAT_TX_0]=0;
pEPxR_STATUS[CTR_RX]=0;
this->WORD[0]=EPxR_STATUS;
}
//-----------------------------------------------------------------------------
void EPxR::Clear_CTR_TX(void)
{
EPxR_STATUS=this->WORD[0];
pEPxR_STATUS[DTOG_RX]=0;
pEPxR_STATUS[STAT_RX_1]=0;
pEPxR_STATUS[STAT_RX_0]=0;
pEPxR_STATUS[DTOG_TX]=0;
pEPxR_STATUS[STAT_TX_1]=0;
pEPxR_STATUS[STAT_TX_0]=0;
pEPxR_STATUS[CTR_TX]=0;
this->WORD[0]=EPxR_STATUS;
}
//-----------------------------------------------------------------------------
void EPxR::Set_COUNT_RX(unsigned short Value)
{
switch(this->ID)
{
case 0:
if(Value&0xffe0)
{
Value=(Value>>5)-1;
EP0_COUNT_RX=0x8000|(Value<<10);
}
else
{
Value=(Value>>1);
EP0_COUNT_RX=(Value<<10);
}
break;
case 1:
if(Value&0xffe0)
{
Value=(Value>>5)-1;
EP1_COUNT_RX=0x8000|(Value<<10);
}
else
{
Value=(Value>>1);
EP1_COUNT_RX=(Value<<10);
}
break;
}
}
//-----------------------------------------------------------------------------
void EPxR::Send(unsigned short* pBuffer,unsigned int Length)
{
unsigned int temp;
temp=Length>>1;
temp+=Length%2;
for(int i=0;i<temp;i++)
this->Tx_Buffer[i]=pBuffer[i];
switch(this->ID)
{
case 0:
EP0_COUNT_TX=Length;
break;
case 1:
EP1_COUNT_TX=Length;
break;
}
}
//-----------------------------------------------------------------------------
stm32f10x_usb::stm32f10x_usb(void)
:EP0R(0),EP1R(1)
{
this->Reserived_Data=0;
}
//-----------------------------------------------------------------------------
void stm32f10x_usb::Configuration(void)
{
NVIC_SETENA0|=EN_USB_LP;
RCC_APB1ENR_BITS[USB_EN]=1; //相应时钟使能
}
//-----------------------------------------------------------------------------
void stm32f10x_usb::SetAddress(unsigned short Value)
{
DADDR=Value;
DADDR_BITS[7]=1;
}
//-----------------------------------------------------------------------------
stm32f10x_usb usb0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -