硬汉嵌入式论坛

 找回密码
 立即注册
查看: 611|回复: 3
收起左侧

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

[复制链接]

8

主题

54

回帖

78

积分

初级会员

积分
78
发表于 2025-3-1 20:16:48 | 显示全部楼层 |阅读模式
TTL串口U盘模块,自适应波特率:

一、模块功能介绍:



TTL串口U盘模块---论坛.png

TTL串口U盘模块_TCC2.png


TTL串口U盘模块_TCC3.png

TTL串口U盘模块_TCC4.png

TTL串口U盘模块_无外壳.png

TTL串口U盘模块_TCC5.png

TTL串口U盘模块_波特率参数.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);
  }  
  
}



回复

使用道具 举报

6

主题

683

回帖

701

积分

金牌会员

积分
701
QQ
发表于 2025-3-2 09:25:46 | 显示全部楼层
这需求有点东西
回复

使用道具 举报

15

主题

65

回帖

110

积分

初级会员

积分
110
发表于 2025-3-2 16:05:49 来自手机 | 显示全部楼层
我也做了个类似的,但是有几点疑问,1,U盘是否不适合小数据连续写入,担心寿命不如sd卡,所以我做了个大buffer,攒够数据一次写入。2, 自动波特率需要串口发送特殊字符吧。3,如果需要实现lcd显示,使用lvgl实现,gui太慢了,不要gui可以实现115200满速,开gui后会丢数据
回复

使用道具 举报

8

主题

54

回帖

78

积分

初级会员

积分
78
 楼主| 发表于 2025-3-2 20:59:17 | 显示全部楼层
Superusrss 发表于 2025-3-2 16:05
我也做了个类似的,但是有几点疑问,1,U盘是否不适合小数据连续写入,担心寿命不如sd卡,所以我做了个大bu ...

1、数据连续写入,跟缓冲后一次写入,对于U盘,还是SD卡都是一样的。
2、自动波特率,开始时,是要发送特殊字符,我图片上有说明的,发送: 0x55.
3、使用GUI,也不会太慢,就看你用什么接口驱动LCD了,要是SPI的话,开启DMA后,会快的很,我发的帖子
    里有的:SPI DMA; 开GUI,要使用嵌入式系统的话,就不会有你说的丢数据的现象发生!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 06:14 , Processed in 0.047802 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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