⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32f10x_usb.cpp

📁 STM32 USB HID
💻 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 + -