找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2479|回復(fù): 1
收起左側(cè)

STM32F103 VCP代碼

[復(fù)制鏈接]
ID:521626 發(fā)表于 2019-6-5 23:59 | 顯示全部樓層 |閱讀模式
STM32F103 實現(xiàn)虛擬串口,進(jìn)行串口通信,實現(xiàn)了USB通信

單片機源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "stm32f10x.h"
  3. #include <stdio.h>
  4. /* Private typedef -----------------------------------------------------------*/

  5. /* Private define ------------------------------------------------------------*/

  6. /*LED燈相關(guān)定義*/
  7. #define RCC_GPIO_LED                    RCC_APB2Periph_GPIOD    /*LED使用的GPIO時鐘*/
  8. #define LEDn                            4                       /*神舟III號LED數(shù)量*/
  9. #define GPIO_LED                        GPIOD                  /*神舟III號LED燈使用的GPIO組*/

  10. #define DS1_PIN                         GPIO_Pin_8              /*DS1使用的GPIO管腳*/
  11. #define DS2_PIN                         GPIO_Pin_9                                /*DS2使用的GPIO管腳*/
  12. #define DS3_PIN                         GPIO_Pin_10                          /*DS3使用的GPIO管腳*/
  13. #define DS4_PIN                         GPIO_Pin_11                                /*DS4使用的GPIO管腳*/

  14. //按鍵的定義

  15. #define RCC_GPIO_KEY1                    RCC_APB2Periph_GPIOD    /*按鍵1使用的GPIO時鐘*/
  16. #define GPIO_KEY1                        GPIOD                  /*按鍵使用的GPIO組*/
  17. #define KEY1_PIN                         GPIO_Pin_0              /*按鍵1使用的GPIO管腳*/

  18. #define RCC_GPIO_KEY2                    RCC_APB2Periph_GPIOD    /*按鍵2使用的GPIO時鐘*/
  19. #define GPIO_KEY2                        GPIOD                  /*按鍵2使用的GPIO組*/
  20. #define KEY2_PIN                         GPIO_Pin_1              /*按鍵2使用的GPIO管腳*/

  21. #define RCC_GPIO_KEY3                    RCC_APB2Periph_GPIOD    /*按鍵3使用的GPIO時鐘*/
  22. #define GPIO_KEY3                        GPIOD                  /*按鍵3使用的GPIO組*/
  23. #define KEY3_PIN                         GPIO_Pin_2              /*按鍵3使用的GPIO管腳*/

  24. #define RCC_GPIO_KEY4                    RCC_APB2Periph_GPIOD    /*按鍵4使用的GPIO時鐘*/
  25. #define GPIO_KEY4                        GPIOD                  /*按鍵4使用的GPIO組*/
  26. #define KEY4_PIN                         GPIO_Pin_3              /*按鍵4使用的GPIO管腳*/


  27. //串口1                TX PA9 RX-PA10
  28. #define RCC_GPIO_UART1                                        RCC_APB2Periph_GPIOA    /*按鍵4使用的GPIO時鐘*/
  29. #define GPIO_UART1                       GPIOA                  /*按鍵4使用的GPIO組*/
  30. #define TX1_PIN                         GPIO_Pin_9              /*按鍵4使用的GPIO管腳*/
  31. #define RX1_PIN                         GPIO_Pin_10              /*按鍵4使用的GPIO管腳*/

  32. //串口2         TX -PA2  RX-PA3
  33. #define RCC_GPIO_USART2                                        RCC_APB2Periph_GPIOA    /*USART2的GPIO時鐘*/
  34. #define GPIO_USART2                      GPIOA                  /*USART2使用的GPIO組*/
  35. #define TX3_PIN                         GPIO_Pin_2              /*USART2使用的GPIO管腳*/
  36. #define RX3_PIN                         GPIO_Pin_3              /*USART2使用的GPIO管腳*/
  37. /* Private macro -------------------------------------------------------------*/

  38. /* Private function prototypes -----------------------------------------------*/
  39. //宏定義 為適合不同的編譯系統(tǒng)
  40. #ifdef __GNUC__
  41.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  42.      set to 'Yes') calls __io_putchar() */
  43.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  44. #else
  45.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  46. #endif /* __GNUC__ */

  47. /* Private variables ---------------------------------------------------------*/
  48. GPIO_InitTypeDef GPIO_InitStructure;
  49. USART_InitTypeDef USART_InitStructure;
  50. ErrorStatus HSEStartUpStatus;
  51. u8 count=0;

  52. /* Private function prototypes -----------------------------------------------*/
  53. void RCC_Configuration(void);
  54. void NVIC_Configuration(void);
  55. void Delay(vu32 nCount);
  56. void Turn_On_LED(u8 LED_NUM);

  57. /* Private functions ---------------------------------------------------------*/

  58. /*******************************************************************************
  59. * Function Name  : main
  60. * Description    : Main program.
  61. * Input          : None
  62. * Output         : None
  63. * Return         : None
  64. *******************************************************************************/
  65. int main(void)
  66. {
  67.         u8 i=1;
  68.         /* 配置神舟III號LED燈使用的GPIO管腳模式*/
  69.        
  70.         //        RCC_DeInit();
  71.         //        RCC_HSEConfig(RCC_HSE_ON);
  72.         //        RCC_HSICmd(ENABLE);
  73.         //        while(RCC_WaitForHSEStartUp()!=SUCCESS);
  74.         //        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_16 );
  75.         //        RCC_PLLCmd(ENABLE);
  76.         //
  77.         //        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK );
  78.         //LED設(shè)置
  79.         RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE); /*使能LED燈使用的GPIO時鐘*/
  80.        
  81.         GPIO_InitStructure.GPIO_Pin = DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN;
  82.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP ;
  83.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  84.        
  85.         GPIO_Init(GPIO_LED, &GPIO_InitStructure);  /*神州III號使用的LED燈相關(guān)的GPIO口初始化*/
  86.         GPIO_ResetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN);/*關(guān)閉所有的LED指示燈*/
  87.        
  88.         //按鍵1設(shè)置
  89.         RCC_APB2PeriphClockCmd(RCC_GPIO_KEY1, ENABLE); /*使能LED燈使用的GPIO時鐘*/
  90.        
  91.         GPIO_InitStructure.GPIO_Pin = KEY1_PIN;
  92.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU ;
  93.         GPIO_Init(GPIO_KEY1, &GPIO_InitStructure);  /*神州III號使用的按鍵1相關(guān)的GPIO口初始化*/
  94.        
  95.         //按鍵2設(shè)置
  96.         RCC_APB2PeriphClockCmd(RCC_GPIO_KEY2, ENABLE); /*使能按鍵2使用的GPIO時鐘*/
  97.        
  98.         GPIO_InitStructure.GPIO_Pin = KEY2_PIN;
  99.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU ;
  100.         GPIO_Init(GPIO_KEY2, &GPIO_InitStructure);  /*神州III號使用的按鍵1相關(guān)的GPIO口初始化*/
  101.        
  102.         //按鍵3設(shè)置
  103.         RCC_APB2PeriphClockCmd(RCC_GPIO_KEY3, ENABLE); /*使能按鍵3使用的GPIO時鐘*/
  104.        
  105.         GPIO_InitStructure.GPIO_Pin = KEY3_PIN;
  106.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU ;
  107.         GPIO_Init(GPIO_KEY3, &GPIO_InitStructure);  /*神州III號使用的按鍵1相關(guān)的GPIO口初始化*/
  108.        
  109.         //按鍵4設(shè)置
  110.         RCC_APB2PeriphClockCmd(RCC_GPIO_KEY4, ENABLE); /*使能按鍵4使用的GPIO時鐘*/
  111.        
  112.         GPIO_InitStructure.GPIO_Pin = KEY4_PIN;
  113.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU ;
  114.         GPIO_Init(GPIO_KEY4, &GPIO_InitStructure);  /*神州III號使用的按鍵1相關(guān)的GPIO口初始化*/
  115.        
  116.         //********************************************************************
  117.         //串口1端口
  118.         /* Enable GPIO clock */
  119.         RCC_APB2PeriphClockCmd( RCC_GPIO_UART1|RCC_APB2Periph_AFIO, ENABLE);
  120.        
  121.         /* Enable UART clock */
  122.        
  123.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  124.        
  125.         /* Configure USART Tx as alternate function push-pull */
  126.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  127.         GPIO_InitStructure.GPIO_Pin = TX1_PIN;
  128.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  129.         GPIO_Init(GPIO_UART1, &GPIO_InitStructure);
  130.        
  131.         /* Configure USART Rx as input floating */
  132.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  133.         GPIO_InitStructure.GPIO_Pin = RX1_PIN;
  134.         GPIO_Init(GPIO_UART1, &GPIO_InitStructure);
  135.        
  136.         /*串口1參數(shù)配置*/
  137.         USART_InitStructure.USART_BaudRate = 115200;                 /*設(shè)置波特率為115200*/
  138.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;  /*設(shè)置數(shù)據(jù)位為8位*/
  139.         USART_InitStructure.USART_StopBits = USART_StopBits_1;       /*設(shè)置停止位為1位*/
  140.         USART_InitStructure.USART_Parity = USART_Parity_No;          /*無奇偶校驗*/   
  141.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /*沒有硬件流控*/
  142.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;      /*發(fā)送與接收*/
  143.         /*完成串口COM1的時鐘配置、GPIO配置,根據(jù)上述參數(shù)初始化并使能*/
  144.         /* USART configuration */
  145.         USART_Init(USART1, &USART_InitStructure);
  146.                 /* Enable USART */
  147.         USART_Cmd(USART1, ENABLE);

  148.         //********************************************************************
  149.         //串口2端口
  150.         /* Enable GPIO clock */
  151.         RCC_APB2PeriphClockCmd( RCC_GPIO_USART2|RCC_APB2Periph_AFIO, ENABLE);
  152.        
  153.         /* Enable UART clock */
  154.        
  155.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  156.        
  157.         /* Configure USART Tx as alternate function push-pull */
  158.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  159.         GPIO_InitStructure.GPIO_Pin = TX3_PIN;
  160.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  161.         GPIO_Init(GPIO_USART2, &GPIO_InitStructure);
  162.        
  163.         /* Configure USART Rx as input floating */
  164.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  165.         GPIO_InitStructure.GPIO_Pin = RX3_PIN;
  166.         GPIO_Init(GPIO_USART2, &GPIO_InitStructure);


  167.         /*串口2參數(shù)配置*/
  168.         USART_InitStructure.USART_BaudRate = 115200;                 /*設(shè)置波特率為115200*/
  169.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;  /*設(shè)置數(shù)據(jù)位為8位*/
  170.         USART_InitStructure.USART_StopBits = USART_StopBits_1;       /*設(shè)置停止位為1位*/
  171.         USART_InitStructure.USART_Parity = USART_Parity_No;          /*無奇偶校驗*/   
  172.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /*沒有硬件流控*/
  173.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;      /*發(fā)送與接收*/
  174.         /*完成串口COM1的時鐘配置、GPIO配置,根據(jù)上述參數(shù)初始化并使能*/
  175.         /* USART configuration */
  176.         USART_Init(USART2, &USART_InitStructure);
  177.                 /* Enable USART */
  178.         USART_Cmd(USART2, ENABLE);


  179.         while(1)
  180.         {
  181.                 printf("\nSTM32F103實驗中。。。。。。\n");
  182.                 printf("數(shù)字是%d",i);
  183.                 i++;
  184.                 Delay(0x1ffFFFF);
  185.           }
  186. }

  187. /*點亮對應(yīng)燈*/
  188. void Turn_On_LED(u8 LED_NUM)
  189. {
  190.         switch(LED_NUM)
  191.         {
  192.         case 0:
  193.           GPIO_ResetBits(GPIO_LED,DS1_PIN);  /*點亮DS1燈*/
  194.           break;
  195.         case 1:
  196.           GPIO_ResetBits(GPIO_LED,DS2_PIN);  /*點亮DS2燈*/
  197.           break;
  198.         case 2:
  199.           GPIO_ResetBits(GPIO_LED,DS3_PIN);  /*點亮DS3燈*/
  200.           break;
  201.         case 3:
  202.           GPIO_ResetBits(GPIO_LED,DS4_PIN);  /*點亮DS4燈*/
  203.           break;         
  204.         default:
  205.                   GPIO_ResetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN); /*點亮所有的燈*/
  206.           break;
  207.         }
  208. }


  209. PUTCHAR_PROTOTYPE
  210. {
  211.   /* Place your implementation of fputc here */
  212.   /* e.g. write a character to the USART */
  213.   USART_SendData(USART2, (uint8_t) ch); /*發(fā)送一個字符函數(shù)*/

  214.   /* Loop until the end of transmission */
  215.   while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)/*等待發(fā)送完成*/
  216.   {
  217.   
  218.   }
  219.   return ch;
  220. }



  221. /*******************************************************************************
  222. * Function Name  : Delay
  223. * Description    : Inserts a delay time.
  224. * Input          : nCount: specifies the delay time length.
  225. * Output         : None
  226. * Return         : None
  227. *******************************************************************************/
  228. void Delay(vu32 nCount)
  229. {
  230.   for(; nCount != 0; nCount--);
  231. }



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

所有資料51hei提供下載:
STM32F103 實現(xiàn)虛擬串口,進(jìn)行串口通信,實現(xiàn)了USB通信.7z (540.68 KB, 下載次數(shù): 22)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:370824 發(fā)表于 2022-7-22 11:52 | 顯示全部樓層
編譯都沒通過,還封裝了一個靜態(tài)LIB.
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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