本帖最后由 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);
}
}
|