久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2201|回復: 1
收起左側

STM32 MyUSB源程序

[復制鏈接]
ID:777520 發表于 2020-6-16 15:38 | 顯示全部樓層 |閱讀模式
發現論壇里好多都是基于51單片機設計的,分享一下手里關于STM32的設計資料,同時樓主也在學習相關知識

通過QT 實現將數據傳輸至ARM FSMC至FPGA

單片機源程序如下:
  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);           // 數據重新入隊
  34. }

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

  39.           //初始化USB  發送隊列
  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);         //獲得接收到的數據長度
  68.                 PMAToUserBufferCopy(buffer_out, ENDP3_RXADDR, count_out); //將數據從USB EP3 RX的緩沖區拷貝到用戶指定的數組中

  69.                 usb_recv_proc();

  70.                 SetEPRxValid(ENDP3);                                 //完成拷貝后置有效狀態,從而EP3發送ACK主機可以進行下一個數據包的發送
  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. //不使用半主機模式
  144. #if 1 //如果沒有這段,則需要在target選項中選擇使用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****/
復制代碼

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

使用道具 舉報

ID:591382 發表于 2020-8-17 18:56 | 顯示全部樓層
值得學習。USB模塊的知識,需要長期積累。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久一区二区三区 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 91av视频在线免费观看 | 韩日一区二区三区 | 亚洲国产精品久久久 | 国产欧美一区二区三区国产幕精品 | 精品国产色| 麻豆国产一区二区三区四区 | 国产精品视频久久久 | 日韩在线| 国产欧美日韩一区 | 久久久久久免费毛片精品 | 自拍偷拍亚洲视频 | 欧美亚洲一区二区三区 | 欧美精品一区在线 | 亚洲精品综合一区二区 | 日本福利视频免费观看 | 国产亚洲精品久久午夜玫瑰园 | 91久久久久久久久久久久久 | 亚洲高清在线观看 | 日韩成人免费中文字幕 | 97精品超碰一区二区三区 | 91在线观看| 国产成人福利视频在线观看 | 日韩在线免费视频 | 成人影视网 | 欧美日韩精品在线免费观看 | 人人干在线 | 成人免费一区二区 | 日韩在线一区二区三区 | 午夜精品一区二区三区在线播放 | 免费一区二区 | 在线看一区二区三区 | a在线视频 | 国产做a爱片久久毛片 | 亚洲二区在线 | 国产精品爱久久久久久久 | 日韩精品一区二区三区中文字幕 | 国产不卡视频在线 | 欧美1—12sexvideos | 久久久久久91香蕉国产 |