xfcjava2 发表于 2025-3-1 20:30

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

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

一、模块功能介绍:














二、程序源代码片段:


/**
* @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;
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);
}
}





tpgf 发表于 2025-4-10 10:22

这段代码的主要目的是通过 USART1 进行数据传输,并利用自动波特率检测功能来动态调整通信速率

Zuocidian 发表于 2025-4-14 20:15

该函数用于启动 USART1 的自动波特率检测过程,并在检测完成后发送确认消息。

Puchou 发表于 2025-4-14 21:31

它会进入自动波特率检测阶段,直到检测完成或发生错误

Xiashiqi 发表于 2025-4-14 22:41

如果宏定义 AUTOBAUDRATE_All_TEST_EN 大于0,则调用 AutoBaudrate_AllParams_Test 函数进行所有参数测试。

小海师 发表于 2025-4-15 08:52

使用临界区保护全局变量 UART1_received 和 flag_UDisk_Ok,确保线程安全

Haizangwang 发表于 2025-4-15 10:14

初始的波特率是不能实现检测的吧

小迷糊仙 发表于 2025-6-4 11:16

学习学习 感谢分享 辛苦

chenjun89 发表于 2025-6-4 22:06

沁恒的串口桥接芯片了解一下,比这个应用简单。
页: [1]
查看完整版本: TTL串口U盘模块,自适应波特率