找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2219|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32 MyUSB源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:777520 發(fā)表于 2020-6-16 15:38 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
發(fā)現(xiàn)論壇里好多都是基于51單片機(jī)設(shè)計(jì)的,分享一下手里關(guān)于STM32的設(shè)計(jì)資料,同時(shí)樓主也在學(xué)習(xí)相關(guān)知識(shí)

通過QT 實(shí)現(xiàn)將數(shù)據(jù)傳輸至ARM FSMC至FPGA

單片機(jī)源程序如下:
  1. #include "stm32f10x_lib.h"
  2. #include "usb_lib.h"
  3. #include "usb_desc.h"
  4. #include "hw_config.h"
  5. #include "usb_pwr.h"
  6. #include "queue.h"
  7. #include "string.h"
  8. #include "stdio.h"

  9. extern u16 count_out;
  10. extern u8 buffer_out[VIRTUAL_COM_PORT_DATA_SIZE];
  11. extern u8 buffer_in[VIRTUAL_COM_PORT_DATA_SIZE];
  12. extern u16 count_in;
  13. extern u8 USART1_Tx_Char;
  14. extern void set_fpga(u8 * dat,u16 len);
  15. extern void rd_fpga(u8 * dat);
  16. extern void set_flash(u8 * dat,u16 len);
  17. extern void rd_flash(u8 * dat);
  18. void usb_send(u8 *buf,u16 len);

  19. vu8 Flag_UARTSendOver = 1;
  20. vu8 Flag_USBSendOver=1;
  21. vu8 Flag_USBDataReceive = 0;

  22. u8 QueueWriteFull(DataQueue *Buf, QUEUE_DATA_TYPE Data, u8 Mod)
  23. {
  24.     Mod = Mod;
  25.     //Uart1_PutString("Queue Full\n" , strlen("Queue Full\n"));
  26.     if(!Flag_UARTSendOver)
  27.                 USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  28.     while(!Flag_UARTSendOver);
  29.         if( QUEUE_OK == QueueRead(&USART1_Tx_Char, (void *)buf_usb_to_uart))
  30.     {
  31.                 USART_SendData(USART1, USART1_Tx_Char);
  32.         }
  33.     return QueueWrite((void *)Buf, Data);           // 數(shù)據(jù)重新入隊(duì)
  34. }

  35. void InitQueue(void)
  36. {
  37.           //初始化USB接收隊(duì)列
  38.         QueueCreate((void *)buf_usb_to_uart,sizeof(buf_usb_to_uart),NULL,(u8 (*)())QueueWriteFull);

  39.           //初始化USB  發(fā)送隊(duì)列
  40.         QueueCreate((void *)buf_uart_to_usb,sizeof(buf_uart_to_usb),NULL,(u8 (*)())QueueWriteFull);
  41. }

  42. void usb_recv_proc()
  43. {
  44.         //usb_send(buffer_out,count_out);
  45.        
  46.         if(( buffer_out[0] == 's')&&(buffer_out[1] == 'f'))
  47.         {
  48.                 set_fpga(&buffer_out[2],count_out);
  49.         }       
  50.         else if(( buffer_out[0] == 'r')&&(buffer_out[1] == 'f'))
  51.         {
  52.                 rd_fpga(&buffer_out[2]);
  53.         }
  54.         else if(( buffer_out[0] == 'f')&&(buffer_out[1] == 's'))
  55.         {
  56.                 set_flash(&buffer_out[2],count_out);
  57.         }
  58.         else if(( buffer_out[0] == 'f')&&(buffer_out[1] == 'r'))
  59.         {
  60.                 rd_flash(&buffer_out[2]);
  61.         }
  62. }

  63. void usb_recv_chk()
  64. {
  65.         if(Flag_USBDataReceive)       
  66.         {
  67.                 count_out = GetEPRxCount(ENDP3);         //獲得接收到的數(shù)據(jù)長度
  68.                 PMAToUserBufferCopy(buffer_out, ENDP3_RXADDR, count_out); //將數(shù)據(jù)從USB EP3 RX的緩沖區(qū)拷貝到用戶指定的數(shù)組中

  69.                 usb_recv_proc();

  70.                 SetEPRxValid(ENDP3);                                 //完成拷貝后置有效狀態(tài),從而EP3發(fā)送ACK主機(jī)可以進(jìn)行下一個(gè)數(shù)據(jù)包的發(fā)送
  71.                 Flag_USBDataReceive=0;
  72.         }
  73. }

  74. void usb_send_chk()
  75. {
  76.         u16 i,count,recvCount;
  77.         u8 temp;

  78.         if(Flag_USBSendOver)
  79.         {
  80.                 Flag_USBSendOver=0;
  81.                 recvCount=0;

  82.                 count = QueueNData((void *)buf_uart_to_usb);
  83.                 if( count > 64 )
  84.                 {
  85.                         for(i=0;i<64;i++)
  86.                         {
  87.                                 if( QUEUE_OK == QueueRead(&temp, (void *)buf_uart_to_usb) )
  88.                                 buffer_in[recvCount++] = temp;
  89.                         }
  90.                         UserToPMABufferCopy(buffer_in, ENDP1_TXADDR, recvCount);
  91.                         SetEPTxCount(ENDP1,recvCount);
  92.                         SetEPTxValid(ENDP1);     
  93.                 }
  94.                 else
  95.                 {
  96.                         for(i=0;i<count;i++)
  97.                         {
  98.                                 if( QUEUE_OK == QueueRead(&temp, (void *)buf_uart_to_usb) )
  99.                                 buffer_in[recvCount++] = temp;
  100.                         }
  101.                         UserToPMABufferCopy(buffer_in, ENDP1_TXADDR, recvCount);
  102.                         SetEPTxCount(ENDP1,recvCount);
  103.                         SetEPTxValid(ENDP1);      
  104.                 }
  105.         }       
  106. }

  107. void usb_send(u8 *buf,u16 len)
  108. {
  109.         while(len--)
  110.         {
  111.                 QueueWrite((void *)buf_uart_to_usb,*(buf++));
  112.         }
  113. }
  114. extern void my_dac_init();
  115. extern void pwm_init();
  116. int main(void)
  117. {
  118.         Set_System();

  119.         USB_Cable_Config(DISABLE);
  120.         InitQueue();
  121.         Set_USBClock();
  122.         USB_Interrupts_Config();
  123.         USB_Init();
  124.         pwm_init();
  125.         //my_dac_init();

  126.         while (1)
  127.         {
  128.                 if ( bDeviceState == CONFIGURED )  
  129.                 {
  130.                         usb_recv_chk();
  131.                         usb_send_chk();
  132.                 }
  133.         }
  134. }

  135. #ifdef  DEBUG
  136. void assert_failed(u8* file, u32 line)
  137. {
  138.   /* Infinite loop */
  139.   while (1)
  140.   {}
  141. }
  142. #endif


  143. //不使用半主機(jī)模式
  144. #if 1 //如果沒有這段,則需要在target選項(xiàng)中選擇使用USE microLIB
  145. #pragma import(__use_no_semihosting)
  146. struct __FILE  
  147. {  
  148.         int handle;  
  149. };  
  150. FILE __stdout;  

  151. _sys_exit(int x)  
  152. {  
  153.         x = x;  
  154. }
  155. #endif

  156. int fputc(int ch, FILE *f)
  157. {
  158.         QueueWrite((void *)buf_uart_to_usb,ch);
  159.         return ch;
  160. }


  161. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
復(fù)制代碼

所有資料51hei提供下載:
MyUSB.7z (1.17 MB, 下載次數(shù): 18)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:591382 發(fā)表于 2020-8-17 18:56 | 只看該作者
值得學(xué)習(xí)。USB模塊的知識(shí),需要長期積累。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表