[STM32G0]

TTL串口U盘模块,自适应波特率

[复制链接]
638|4
手机看帖
扫描二维码
随时随地手机跟帖
xfcjava2|  楼主 | 2025-3-1 20:33 | 显示全部楼层 |阅读模式
本帖最后由 xfcjava2 于 2025-3-1 20:45 编辑

#申请原创# TTL串口U盘模块,自适应波特率:

一、模块功能介绍:


TTL Serial MSC_1.png

TTL Serial MSC_2.png

TTL Serial MSC_3.png

TTL Serial MSC_5.png

TTL Serial MSC_6.png

TTL Serial MSC_7.png


二、程序源代码片段:


/**
  * @brief USART1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART1_UART_Init(uint8_t mode)
{   
  huart1.Instance = USARTx;
  huart1.Init.BaudRate = 460800;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;  
  
   /*##Configure the AutoBaudRate method */
  huart1.AdvancedInit.AdvFeatureInit =UART_ADVFEATURE_AUTOBAUDRATE_INIT;
  huart1.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_ENABLE;   
  
  switch(mode){  
  case 0:
    huart1.AdvancedInit.AutoBaudRateMode =
        UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT;
    break;
  case 1:
    huart1.AdvancedInit.AutoBaudRateMode =
        UART_ADVFEATURE_AUTOBAUDRATE_ONFALLINGEDGE;   
    break;
  case 2:
    huart1.AdvancedInit.AutoBaudRateMode =
        UART_ADVFEATURE_AUTOBAUDRATE_ON0X7FFRAME;
    break;   
   
  case 3:
    huart1.AdvancedInit.AutoBaudRateMode =
        UART_ADVFEATURE_AUTOBAUDRATE_ON0X55FRAME;
    break;   
  default:
    break;   
  }  
  
  if (HAL_UART_Init(&huart1) != HAL_OK){    
    Error_Handler();
  }
}

/****************************************************************************      
* 功    能:  USART1---自动波特率检测启动函数
*---------------------------------------------------------------------------*
* 入口参数:ni.
* 出口参数:nil
****************************************************************************/
void AutoBaudRate_DetectStart(void)
{  
  char temp_buf[64];
  uint32_t baudrateval;
  
  /* Wait until Receive enable acknowledge flag is set */
  while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_REACK) == RESET)
  {vTaskDelay(1);}
  
  /* Wait until Transmit enable acknowledge flag is set */
  while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TEACK) == RESET)
  {vTaskDelay(1);}
  
  /* Loop until the end of USART1_AutoBaudrate phase */
  while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ABRF) == RESET)
  {vTaskDelay(1);}
  
    /* If AutoBaudBate error occurred */
  if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ABRE)!= RESET){  
    Error_Handler();
  }else{  
    /* Wait until RXNE flag is set */
    while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) == RESET)
    {vTaskDelay(1);}
   
    HAL_UART_Receive(&huart1, (uint8_t *)aTxBuffer, TXBUFFERSIZE,100);
      
    /* Send acknowledgement message*/
    if (HAL_UART_Transmit(&huart1, (uint8_t *)aTxBuffer, strlen((char *)aTxBuffer),100)!= HAL_OK){         
      Error_Handler();
    }   
      
    while(__HAL_UART_GET_FLAG(&huart1,USART_FLAG_TC) == RESET)
    {vTaskDelay(1);}
   
    //计算波特率
    baudrateval = HAL_RCC_GetSysClockFreq() / USART1->BRR;
  
    sprintf(temp_buf,"\r\n检测到波特率为:%d \r\n",baudrateval);
   
    HAL_UART_Transmit(&huart1, (uint8_t *)temp_buf, strlen(temp_buf),100);
   
    while(__HAL_UART_GET_FLAG(&huart1,USART_FLAG_TC) == RESET)
    {vTaskDelay(1);}   
  }   
}


/*
***************************************************************************************
*        函 数 名: vTask_GetFiles_Data
*        功能说明: 获取文件命令数据任务
*-------------------------------------------------------------------------------------*
*        形    参: pvParameters 是在创建该任务时传递的形参
*        返 回 值: 无
****************************************************************************************
*/
static void vTask_GetFiles_Data(void *pvParameters)
{    
#if AUTOBAUDRATE_All_TEST_EN>0
  AutoBaudrate_AllParams_Test();
#else  
   MX_USART1_UART_Init(3); //初始化串口        
   AutoBaudRate_DetectStart(); //自动波特率检测   
  //使能串口1接收中断: 每接收1个字节,中断一次
   HAL_UART_Receive_IT(&huart1,&sRcv_data,1);      
   vTaskDelay(200);       
#endif
   
  while(1)
  {                    
    if(UART1_received==1){ //set----接收数据包完成        
      taskENTER_CRITICAL();
      UART1_received=0; //clear     
      taskEXIT_CRITICAL();  
      
      if(flag_UDisk_Ok==1){
        Real_UDisk_WriteFiles();  //U盘文件操作      
      }      
      HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_11);      
    }   
    vTaskDelay(10);
  }    
}


TTL Serial MSC_4.png

使用特权

评论回复
xfcjava2|  楼主 | 2025-3-1 20:37 | 显示全部楼层
小小模块,功能强大,方便单片机系统设备:大量数据的存储,生产试验结果报告的生成与导出,方便用上位机查看数据文件 等等......。

使用特权

评论回复
hjl2832| | 2025-3-2 22:04 | 显示全部楼层
这个要支持自动数据位计算和自动奇偶位计算才算完善

使用特权

评论回复
xionghaoyun| | 2025-3-3 08:58 | 显示全部楼层
说个价格让我死心

使用特权

评论回复
xfcjava2|  楼主 | 2025-3-3 09:45 | 显示全部楼层
xionghaoyun 发表于 2025-3-3 08:58
说个价格让我死心

带塑料外壳的,壹壹伍, 很便宜的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

470

帖子

43

粉丝