找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1806|回复: 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)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:591382 发表于 2020-8-17 18:56 | 只看该作者
值得学习。USB模块的知识,需要长期积累。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表