| 
 
| 本帖最后由 xfcjava2 于 2025-3-1 20:45 编辑 
 #申请原创#  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[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);
 }
 }
 
 
 
 | 
 
  |