99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

liuxiaofei126
認證:VIP會員
所在專題目錄 查看專題
從IIC實測波形入手搞懂IIC通信
實例講解(一)移位寄存器
單片機之USB 硬件和數據的四種傳輸方式
實例講解(二)SPI通訊顯示電子星球
實例講解(三)之USB模擬串口
實例分析之可編程數控電源
作者動態 更多
stm32知識點總結
2021-11-24 23:12
工程師單片機LED項目
2021-11-11 07:46
電容型負載對跟隨器的影響
2021-10-28 23:33
圖騰柱和互補推挽兩個“小冤家”
2021-10-22 23:15
學習單片機的捷徑
2021-10-17 23:07

實例講解(三)之USB模擬串口

這段時間學習STM32的USB通信,今天分享USB模擬串口,先上最小系統板和原理圖

我們先來了解一下USB模擬串口方面的知識,記得D+要上拉1.5K電阻

1.stm32的USB固件庫

移植時,重點要修改USB_CONFIG文件夾下的代碼,USB_CORE下的代碼一般不用修改。

1.USB_CORE下的文件介紹

2.USB_CONFIG下的文件介紹

3.中斷

再看USB如何初始化

USB的配置通過上面三個函數完成:
       Set_USBClock();            //配置USB時鐘,即從72M主頻得到48M的USB時鐘(1.5分頻)
       USB_Interrupts_Config(); //設置USB喚醒中斷和USB低優先級數據處理中斷  
       USB_Init();                     //初始化USB,主要是調用Virtual_Com_Port_init函數,開啟USB部分的電源等
 一、USB虛擬串口數據發送:
//發送一個字節數據到USB虛擬串口
void USB_USART_SendData(u8 data)
{
	uu_txfifo.buffer[uu_txfifo.writeptr]=data;
	uu_txfifo.writeptr++;
	if(uu_txfifo.writeptr==USB_USART_TXFIFO_SIZE)//超過buf大小了,歸零.
	{
		uu_txfifo.writeptr=0;
	} 
}
該函數實現發送1字節數據到虛擬串口中。
這里用到了一個uu_txfifo結構體,該結構體是一個USB虛擬串口發送數據FIFO結構體,定義如下:
//定義一個USB USART FIFO結構體
typedef struct  
{										    
	u8  buffer[USB_USART_TXFIFO_SIZE];	//buffer
	vu16 writeptr;						//寫指針
	vu16 readptr;						//讀指針
}_usb_usart_fifo; 
extern _usb_usart_fifo uu_txfifo;		//USB串口發送FIFO
該結構體用于處理USB串口要發送的數據,所以通過USB串口發送的數據,都將先存到結構體的buffer數組(FIFO緩存區)里面,USB_USART_TXFIFO_SIZE定義了該數組的大小,通過writeptr和readptr來控制FIFO的寫入和讀出。該結構體buffer數據的寫入,是通過USB_USART_SendData()函數實現的。buffer數據的讀出(然后發送到USB)則是通過端點1的回調函數EP1_IN_Callback()函數實現的。
該函數在usb_endp.c中。代碼如下:
void EP1_IN_Callback (void)
{
	u16 USB_Tx_ptr;
	u16 USB_Tx_length; 
	if(uu_txfifo.readptr==uu_txfifo.writeptr)		//無任何數據要發送,直接退出
	{
		return;
	}
	if(uu_txfifo.readptr<uu_txfifo.writeptr)		//沒有超過數組,讀指針<寫指針
	{
		USB_Tx_length=uu_txfifo.writeptr-uu_txfifo.readptr;//得到要發送的數據長度
	}else											//超過數組了 讀指針>寫指針
	{
		USB_Tx_length=USB_USART_TXFIFO_SIZE-uu_txfifo.readptr;//得到要發送的數據長度 
	} 
	if(USB_Tx_length>VIRTUAL_COM_PORT_DATA_SIZE)	//超過64字節?
	{
		USB_Tx_length=VIRTUAL_COM_PORT_DATA_SIZE;	//此次發送數據量
	}
	USB_Tx_ptr=uu_txfifo.readptr;					//發送起始地址		
	uu_txfifo.readptr+=USB_Tx_length;				//讀指針偏移  
	if(uu_txfifo.readptr>=USB_USART_TXFIFO_SIZE)	//讀指針歸零
	{
		uu_txfifo.readptr=0;
	} 
	UserToPMABufferCopy(&uu_txfifo.buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
	SetEPTxCount(ENDP1, USB_Tx_length);
	SetEPTxValid(ENDP1);   
}
這個函數由USB中斷處理相關函數調用,將通過USB發送給電腦的數據拷貝到端點1的發送區,然后通過USB發送給電腦,從而實現串口數據的發送。
 因為每次傳輸數據長度不超過VIRTUAL_COM_PORT_DATA_SIZE,所以USB的發送數據長度:USB_Tx_length的最大值,只能是VIRTUAL_COM_PORT_DATA_SIZE。
 以上就是USB虛擬串口數據發送過程。
 二、我們看看USB虛擬串口數據接收:
USB虛擬串口的接收,通過端點3來實現,端點3的回調函數為EP3_OUT_Callback(),該函數也在usb_endp.c中,代碼如下:
void EP3_OUT_Callback(void)
{
	u16 USB_Rx_Cnt; 
	USB_Rx_Cnt = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);	//得到USB接收到的數據及其長度  
	USB_To_USART_Send_Data(USB_Rx_Buffer, USB_Rx_Cnt);	//處理數據(其實就是保存數據) 
	SetEPRxValid(ENDP3);								//時能端點3的數據接收
}
 該函數也是由USB中斷處理相關函數調用,該函數通過調用USB_To_USART_Send_Data函數,實現USB接收數據的保存,
該函數在hw_config.c中實現,代碼如下:
//處理從USB虛擬串口接收到的數據
//databuffer:數據緩存區
//Nb_bytes:接收到的字節數.
void USB_To_USART_Send_Data(u8* data_buffer, u8 Nb_bytes)
{ 
	u8 i;
	u8 res;
	for(i=0;i<Nb_bytes;i++)
	{  
		res=data_buffer[i]; 
		if((USB_USART_RX_STA&0x8000)==0)		//接收未完成
		{
			if(USB_USART_RX_STA&0x4000)			//接收到了0x0d
			{
				if(res!=0x0a)USB_USART_RX_STA=0;//接收錯誤,重新開始
				else USB_USART_RX_STA|=0x8000;	//接收完成了 
			}else //還沒收到0X0D
			{	
				if(res==0x0d)USB_USART_RX_STA|=0x4000;
				else
				{
					USB_USART_RX_BUF[USB_USART_RX_STA&0X3FFF]=res;
					USB_USART_RX_STA++;
					if(USB_USART_RX_STA>(USB_USART_REC_LEN-1))USB_USART_RX_STA=0;//接收數據錯誤,重新開始接收	
				}					
			}
		}   
	}  
} 

最后下載驗證

發送和接受一致

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 6
收藏 7
關注 211
成為作者 賺取收益
全部留言
0/200
  • dy-blNlwnWV 2021-02-25 21:44
    佩服樓主
    回復
  • keyhei66 2021-01-15 18:49
    可以
    回復
  • 星球居民-YBPLIKJ1 2021-01-14 19:52
    不錯不錯
    回復
  • lihui710884923 2021-01-07 10:44
    有資料嗎?
    回復
主站蜘蛛池模板: 九九九九网站 | 成人免费看98影视mp4 | 精品人伦一区二区三区蜜桃视频 | 国产精品成人无码久久久久久 | 久久精品国产一区二区三区四区 | 国产精品视频www | 久久久精品国产免费观看一区二区 | 欧美天天综合色影久久精品 | 久久精品国产乱子伦 | 国产精品自产拍在线观看55 | 在线免费观看a视频 | yellow视频在线观看免费 | 亚洲色欲色欱WWW在线 | 色av综合在线 | 无码专区国产精品第一页 | 在线A亚洲老鸭窝天堂 | 小黄文纯肉污到你湿 | 在线观看播放 | 欧美一区二区在线刺激视频 | 中出国产 | 亚洲无码一区二区三区 | 5252aⅴhaose我爱久久 | 国产乱子伦视频一区二区三区 | 午夜高清国产拍精品 | 日韩精品资源二区在线 | 欧美白嫩magnet| 日韩欧美国产系列 | 无码爆乳护士让我爽 | 亚洲欧洲成人在线 | 国产精品人成在线观看 | 午夜网站免费 | 大陆熟女丰满XXXXX富婆 | 久久综合99re88久久爱 | 久久久久国产一区二区 | 国产高潮流白浆喷水在线观看 | 橘梨纱av一区二区三区在线观看 | 草久久久久 | 久精品久久 | www480jcom四虎 | 精品国产免费久久久久久尖叫 | 久久久男女 |