用STM32做一个USB-TTL工具吧

某宝1分钱白嫖一个STM32C6T6的板子,然后手里的CH340挂了。那么自己做一个吧。

串口没有使用DMA空闲中断等等机制,有兴趣的加上了call我炒一下。

惯例CUBEMAX配置

1.usb-fs

2.usb-cdc

3.串口开一个中断,使用LL库

贴代码了

usart.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    usart.c
  * @brief   This file provides code for the configuration
  *          of the USART instances.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "usart.h"

/* USER CODE BEGIN 0 */
#include "usbd_cdc_if.h"
/* USER CODE END 0 */

/* USART1 init function */

void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  LL_USART_InitTypeDef USART_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* Peripheral clock enable */
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);

  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
  /**USART1 GPIO Configuration
  PA9   ------> USART1_TX
  PA10   ------> USART1_RX
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = LL_GPIO_PIN_10;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USART1 interrupt Init */
  NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
  NVIC_EnableIRQ(USART1_IRQn);

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
	
  USART_InitStruct.BaudRate = 115200;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  LL_USART_Init(USART1, &USART_InitStruct);
  LL_USART_ConfigAsyncMode(USART1);
  LL_USART_Enable(USART1);
  /* USER CODE BEGIN USART1_Init 2 */
  
  /* USER CODE END USART1_Init 2 */

}
/* USART2 init function */

void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  LL_USART_InitTypeDef USART_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* Peripheral clock enable */
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);

  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
  /**USART2 GPIO Configuration
  PA2   ------> USART2_TX
  PA3   ------> USART2_RX
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USART2 interrupt Init */
  NVIC_SetPriority(USART2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
  NVIC_EnableIRQ(USART2_IRQn);

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  USART_InitStruct.BaudRate = 115200;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  LL_USART_Init(USART2, &USART_InitStruct);
  LL_USART_ConfigAsyncMode(USART2);
  LL_USART_Enable(USART2);
  /* USER CODE BEGIN USART2_Init 2 */
  LL_USART_EnableIT_RXNE(USART2);
  //LL_USART_EnableIT_IDLE(USART2);
  /* USER CODE END USART2_Init 2 */

}

/* USER CODE BEGIN 1 */
/* USER CODE BEGIN 0 */

#if 1
#pragma import(__use_no_semihosting)
//??????????
struct __FILE
{
    int handle;
};
 
FILE __stdout;
/**
 * @brief ??_sys_exit()??????????
 * @param void
 * @return  void
 */
void _sys_exit(int x)
{
    x = x;
}
 
int fputc(int ch, FILE *f)
{
  while(LL_USART_IsActiveFlag_TXE(USART1) == RESET){}
  LL_USART_TransmitData8(USART1,ch);     
	while(LL_USART_IsActiveFlag_TC(USART1) == RESET){}

    return ch;
}
#endif


uint32_t g_bCharFormat[]={LL_USART_STOPBITS_1,LL_USART_STOPBITS_1_5,LL_USART_STOPBITS_2};
uint32_t g_bParityType[]={LL_USART_PARITY_NONE,LL_USART_PARITY_EVEN,LL_USART_PARITY_ODD,LL_USART_PARITY_NONE,LL_USART_PARITY_NONE};
uint32_t now_dwDTERate=0;
uint8_t now_bCharFormat=0;
uint8_t now_bParityType=0;
uint8_t now_bDataBits=0;
void MX_USART2_UART_GetConfig(uint32_t *dwDTERate,uint8_t *bCharFormat,uint8_t *bParityType,uint8_t *bDataBits)
{
	printf("get dwDTERate=%d,bCharFormat=%d,bParityType=%d,bDataBits=%d\n",now_dwDTERate,now_bCharFormat,now_bParityType,now_bDataBits);
	*dwDTERate=now_dwDTERate;
	*bCharFormat=now_bCharFormat;
	*bParityType=now_bParityType;
	*bDataBits=now_bDataBits;
}
//5, 6, 7, 8 or 16
void MX_USART2_UART_reConfig(uint32_t dwDTERate,uint8_t bCharFormat,uint8_t bParityType,uint8_t bDataBits)
{
	printf("set dwDTERate=%d,bCharFormat=%d,bParityType=%d,bDataBits=%d\n",dwDTERate,bCharFormat,bParityType,bDataBits);
	now_dwDTERate=dwDTERate;
	now_bCharFormat=bCharFormat;
	now_bParityType=bParityType;
	now_bDataBits=bDataBits;
	if(now_dwDTERate==0)return;
	
	LL_USART_Disable(USART2);
  LL_USART_InitTypeDef USART_InitStruct = {0};
  USART_InitStruct.BaudRate = dwDTERate;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;

  if(bCharFormat < sizeof(g_bCharFormat)/sizeof(uint32_t))
  {
       USART_InitStruct.StopBits = g_bCharFormat[bCharFormat];
  }
    if(bParityType < sizeof(g_bParityType)/sizeof(uint32_t))
  {
       USART_InitStruct.Parity = g_bParityType[bParityType];
  }
  
  LL_USART_Init(USART2, &USART_InitStruct); 
	
	LL_USART_Enable(USART2);
}

__IO uint8_t led_status=LED_OFF;
#define BUF_SIZE 256
uint8_t r_buf[BUF_SIZE];
__IO uint16_t r_len = 0;
/*
uint8_t r_buf1[BUF_SIZE];
__IO uint16_t r_len1 = 0;
uint8_t r_buf2[BUF_SIZE];
__IO uint16_t r_len2 = 0;
*/
void usart2_irq_recv(uint8_t a)
{
   if(r_len<BUF_SIZE)
		 r_buf[r_len++] = a;

  led_status = LED_ON;
}
void uart2_to_usb()
{
  if(r_len>0)
  {
    CDC_Transmit_FS(r_buf,r_len);
		//usart2_send(r_buf,r_len);
    r_len = 0;
  }
}

/* USER CODE END 0 */


void usart2_send(uint8_t *p,uint16_t len)
{
  while(len--)
  {
      while(LL_USART_IsActiveFlag_TXE(USART2) == RESET);
		
       LL_USART_TransmitData8(USART2,*p++);     
  }
	
	while(LL_USART_IsActiveFlag_TC(USART2) == RESET);
	led_status = LED_ON;
}


/* USER CODE END 1 */

main.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "crc.h"
#include "rtc.h"
#include "usart.h"
#include "usb_device.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usart.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */
  uint32_t last_tick = 0;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  //MX_CRC_Init();
  //MX_RTC_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */
	printf("start\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    if(last_tick>0)
    {
        if(HAL_GetTick()-last_tick>50)
        {
          last_tick=0;
          led_status=LED_OFF;
          LL_GPIO_SetOutputPin(LED_GPIO_Port,LED_Pin);
        }
    }
    else
    {
      if(led_status == LED_ON)
      {
        LL_GPIO_ResetOutputPin(LED_GPIO_Port,LED_Pin);
        last_tick = HAL_GetTick();
      }
    }
		uart2_to_usb();
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

   
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USB;
  PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

usbd_cdc_if.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : usbd_cdc_if.c
  * @version        : v2.0_Cube
  * @brief          : Usb device for Virtual Com Port.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "usbd_cdc_if.h"

/* USER CODE BEGIN INCLUDE */
#include "usart.h"
/* USER CODE END INCLUDE */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
  * @brief Usb device library.
  * @{
  */

/** @addtogroup USBD_CDC_IF
  * @{
  */

/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
  * @brief Private types.
  * @{
  */

/* USER CODE BEGIN PRIVATE_TYPES */

/* USER CODE END PRIVATE_TYPES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
  * @brief Private defines.
  * @{
  */

/* USER CODE BEGIN PRIVATE_DEFINES */
/* USER CODE END PRIVATE_DEFINES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
  * @brief Private macros.
  * @{
  */

/* USER CODE BEGIN PRIVATE_MACRO */

/* USER CODE END PRIVATE_MACRO */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
  * @brief Private variables.
  * @{
  */
/* Create buffer for reception and transmission           */
/* It's up to user to redefine and/or remove those define */
/** Received data over USB are stored in this buffer      */
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];

/** Data to send over USB CDC are stored in this buffer   */
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];

/* USER CODE BEGIN PRIVATE_VARIABLES */

/* USER CODE END PRIVATE_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
  * @brief Public variables.
  * @{
  */

extern USBD_HandleTypeDef hUsbDeviceFS;

/* USER CODE BEGIN EXPORTED_VARIABLES */

/* USER CODE END EXPORTED_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
  * @brief Private functions declaration.
  * @{
  */

static int8_t CDC_Init_FS(void);
static int8_t CDC_DeInit_FS(void);
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

/**
  * @}
  */

USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
  CDC_Init_FS,
  CDC_DeInit_FS,
  CDC_Control_FS,
  CDC_Receive_FS
};

/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Initializes the CDC media low layer over the FS USB IP
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Init_FS(void)
{
  /* USER CODE BEGIN 3 */
  /* Set Application Buffers */
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
  return (USBD_OK);
  /* USER CODE END 3 */
}

/**
  * @brief  DeInitializes the CDC media low layer
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_DeInit_FS(void)
{
  /* USER CODE BEGIN 4 */
  return (USBD_OK);
  /* USER CODE END 4 */
}

/**
  * @brief  Manage the CDC class requests
  * @param  cmd: Command code
  * @param  pbuf: Buffer containing command data (request parameters)
  * @param  length: Number of data to be sent (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
  /* USER CODE BEGIN 5 */
	uint32_t dwDTERate;
	uint8_t bCharFormat;
	uint8_t bParityType;
	uint8_t bDataBits;
	printf("cmd=%02x,length=%d\n",cmd,length);
  switch(cmd)
  {
    case CDC_SEND_ENCAPSULATED_COMMAND:

    break;

    case CDC_GET_ENCAPSULATED_RESPONSE:

    break;

    case CDC_SET_COMM_FEATURE:

    break;

    case CDC_GET_COMM_FEATURE:

    break;

    case CDC_CLEAR_COMM_FEATURE:

    break;

  /*******************************************************************************/
  /* Line Coding Structure                                                       */
  /*-----------------------------------------------------------------------------*/
  /* Offset | Field       | Size | Value  | Description                          */
  /* 0      | dwDTERate   |   4  | Number |Data terminal rate, in bits per second*/
  /* 4      | bCharFormat |   1  | Number | Stop bits                            */
  /*                                        0 - 1 Stop bit                       */
  /*                                        1 - 1.5 Stop bits                    */
  /*                                        2 - 2 Stop bits                      */
  /* 5      | bParityType |  1   | Number | Parity                               */
  /*                                        0 - None                             */
  /*                                        1 - Odd                              */
  /*                                        2 - Even                             */
  /*                                        3 - Mark                             */
  /*                                        4 - Space                            */
  /* 6      | bDataBits  |   1   | Number Data bits (5, 6, 7, 8 or 16).          */
  /*******************************************************************************/
    case CDC_SET_LINE_CODING:
				memcpy(&dwDTERate,pbuf,4);
				bCharFormat=pbuf[5];
			  bParityType=pbuf[6];
			  bDataBits=pbuf[7];
				MX_USART2_UART_reConfig(dwDTERate,bCharFormat,bParityType,bDataBits);
    break;

    case CDC_GET_LINE_CODING:
				MX_USART2_UART_GetConfig(&dwDTERate,&bCharFormat,&bParityType,&bDataBits);
				memcpy(pbuf,&dwDTERate,4);
				pbuf[5] = bCharFormat;
				pbuf[6] = bParityType;
				pbuf[7] = bDataBits;
    break;

    case CDC_SET_CONTROL_LINE_STATE:

    break;

    case CDC_SEND_BREAK:

    break;

  default:
    break;
  }

  return (USBD_OK);
  /* USER CODE END 5 */
}

/**
  * @brief  Data received over USB OUT endpoint are sent over CDC interface
  *         through this function.
  *
  *         @note
  *         This function will issue a NAK packet on any OUT packet received on
  *         USB endpoint until exiting this function. If you exit this function
  *         before transfer is complete on CDC interface (ie. using DMA controller)
  *         it will result in receiving more data while previous ones are still
  *         not sent.
  *
  * @param  Buf: Buffer of data to be received
  * @param  Len: Number of data received (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  usart2_send(Buf,*Len);
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
  /* USER CODE END 6 */
}

/**
  * @brief  CDC_Transmit_FS
  *         Data to send over USB IN endpoint are sent over CDC interface
  *         through this function.
  *         @note
  *
  *
  * @param  Buf: Buffer of data to be sent
  * @param  Len: Number of data to be sent (in bytes)
  * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
  */
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
  if (hcdc->TxState != 0){
    return USBD_BUSY;
  }
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
	
  /* USER CODE END 7 */
  return result;
}

/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */

/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

/**
  * @}
  */

/**
  * @}
  */

TTL线刷机前的准备 1. 购买USBTTL线,价格一般在12到20之间。 2. 在PC上装好TTL线驱动(一定要先装驱动在将TTL线插到电脑上)。 3. 认识TTL线。TTL线一头是USB接口,另外一头一般有4个带杜邦头的插管,分别是GND、RX、TX、VCC,一般GND是黑色,VCC是红色,其他是RX和TX,不清楚的一定要咨询卖家。见下图,你手上的TTL线可能与我提供的图片不同。 4. 下载并安装SecureCRT v6.5.8.380 汉化版, SecureCRT-v6.58H.rar下载地址:http://u.115.com/file/f672fcb574安装好后,我们在PC windows上打开设备管理器,点开端口,我们能看到COM x已经作为TTL通信口。(根据每台电脑的具体情况,COM口会不一样,大多数会是COM2口,我自己的是COM5口,需要自己去设备管理器里查看) 如上图那样选中Prolific USB-to Serial Comm Port (COMx), 鼠标右键弹出菜单, 选择属性,然后如下图那样进行设置 5. 拆开机器。初看上去,设备的后盖一般是看不到螺钉的。但后盖4个角上一般都有4个圆形的海绵垫片,螺钉就藏在下面,请先去除之,然后拧开螺钉,打开后盖,我们就能看到电路板了。下面就请在电路上寻找TTL插针,4 个插针是并排的,一般而言,电路板上只有这样一组并排插针,所以并不难找。请注意并排插针的引脚标注GND,标有GND的插针就是GND。而靠近GND右边一般都是RXD插针,其他依次是TXD、VCC插针。请将TTL线的GND的细长型插管插到GND插针上。TTL线的RXD插到RXD插针上,TXD也如此办理。但VCC插针请不要插,千万小心。 上面我们描述的是一般规律,但也有例外。 RG100A-AA、DCHG-800-A、G120-T、HA910、H108Bv1.2电路板上TTL的GND右边依次是RXD、TXD、但VCC却在 GND左边,其详细接线图请参考chinadsl.net 站长yesdong提供的示意图: 6.将网线一段连入猫的LAN口,任意一个都可以,另一段连接电脑。设置电脑的IP地址为192.168.1.100 ,255.255.255.0 ,192.168.1.1  OK,到此我们的准备工作就好了 下面我们就开始刷机过程。 刷机步骤 1. 重复检查准备工作。 2. 我们在PC上启动程序SecureCRT 选择菜单“文件”,然后选择快速连接,并按下图进行设置 SecureCRT快速连接 点击连接,我们就能看到如下界面: SecureCRT快速连接2 3. 然后打开电源,这时SecureCRT窗口会有E文滚动,当滚动到*** Press any key to stop auto run (1 seconds) ***,任意按下键盘任意一个键,就会进入CFE> ,这样我们就进入了CFE命令行界面。 4.CFE>e a 回车 再输入y回车(目的是清空flash) 这一步也有可能要输入用户名和密码,telecomadmin/telecomadmin 或者telecomadmin/nE7jA%5m 5.浏览器地址栏输入192.168.1.1,如果提示要用户名和密码则输入telecomadmin/telecomadmin 或者telecomadmin/nE7jA%5m,进入后会看到FW界面(忘记截图了,不过很简单的,都是中文) 6.1,到这一步要分两种情况对待了,如果你能确定你的CFE可以刷openwrt,直接进入6.2。 我现在只知道RG100A V1.1电信原版的CFE可以刷openwrt,其他不知。保险的方法是先刷至电信原版带CFE固件。我之前就在这个地方走了弯路,因为CFE不合适,刷不上openwrt的。我之前是DLINK固件。 RG100A V1.1电信原版带CFE下载地址(一定不要断电或者接触不良等突发状况,不然就只能JTAG了) 刷好原版固件后,会自动重启,按上面的方法进入CFE。再次e a,进入下一步。 6.2,e a后在浏览器进入192.168.1.1,这次要选择openwrt固件刷新了,openwrt固件不含CFE,刷不死的。这里有下载,LUCI3.12版 最新版本可去openwrt中文网查找。 7.设备刷完后会再次重启,我们也要再次进入CFE状态。 b        修改board ID、MAC地址、FLASH格式等等信息。 e         就是人们经常说的清nvram操作,输入e 回车后会看到帮助信息。 i         清除配置文件。 r         run命令,启动已经刷好的系统。 我们先输入b,回车(接上边说的,有些猫刷完2次FW后已经停在这个界面了)。 第一步是boardID,CFE会返回所有支持的型号,输入型号后边的数字来定义,如果找不到你自己的设备,保持默认就好。 之后会让你修改MAC长度,一般为12,这里务必修改正确。 回车后会让你输入MAC地址,一般会有个默认地址,按照列出的默认地址格式修改就可,当然嫌麻烦也可以不修改。 后边还有几项设置,一般不需要修改,一路回车就好。 我的CFE启动信息及配置: CFE> Boot Address 0xbe000000 Initializing Arena. Initializing Devices. Parallel flash device: name AM29LV320MT|S29GL128-A, id 0x2201, size 16384KB Flash Layout: Boot[0,0xbe000000] Kern[1,0xbe020000]               AuxFS[95,0xbebe0000] Misc[125,0xbefa0000] PSI[127,0xbefe0000] Flash RootFS Partition Length: 12320768 CPU type 0x2A010: 300MHz, Bus: 133MHz, Ref: 64MHz CPU running TP0 Total memory: 33554432 bytes (32MB) Total memory used by CFE: 0x80401000 - 0x80529860 (1214560) Initialized Data:          0x8041E740 - 0x80421060 (10528) Board IP address                  : 192.168.1.1:ffffff00  Host IP address                   : 192.168.1.100  Gateway IP address                :    Run from flash/host (f/h)         : f  Default host run file name        : vmlinux  Default host flash file name      : bcm963xx_fs_kernel  Boot delay (0-9 seconds)          : 1  Board Id (0-8)                    : 96358VW  Number of MAC Addresses (1-32)    : 12  Base MAC Address                  : 见你的路由器背面,格式为XX:XX:XX:XX:XX:XX PSI Size (1-64) KBytes            : 64  Flash Block Size (1-128) in KBytes: 128  Auxillary File System Size Percent: 24  Main Thread Number [0|1]          : 0 再进行一下清除操作 输入“e n”,回车 按提示输入y 回车 清nvram 输入 i   回车 按提示输入y 回车 清除配置文件 完成了上述修改和清除操作后,输入 r 回车 系统就会启动 不必关了电源再开。 到这里刷新完毕,如果顺利,你已经可以进入http页面了。 END 参考资料: OpenWrt刷机教程 http://www.openwrt.org.cn/hdwiki/index.php?doc-innerlink-OpenWrt刷机教程 [新手教学]TTL线修改CFE参数 和通过CFE刷新固件的流程 http://www.chinadsl.net/thread-28078-1-2.html RG100A-AA、DCHG-800-A、G120-T、HA910、H108Bv1.2等设备的TTL接线图 http://www.chinadsl.net/viewthread.php?tid=30576&highlight=ttl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值