Files
E32_433_dev/Core/Src/usart.c

277 lines
7.1 KiB
C
Raw Permalink Normal View History

2026-04-10 20:26:51 +08:00
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file usart.c
* @brief This file provides code for the configuration
* of the USART instances.
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "usart.h"
/* USER CODE BEGIN 0 */
#include <stdbool.h>
#include "fifo.h"
#include "usbd_cdc_if.h"
uint8_t usb_rx_data;
uart_feature current_feature = FUNC_FEATURE1;
static uint8_t tmp;
static uint8_t fifo_buffer[1024];
static fifo_t fifo_uart1_rx;
static volatile uint32_t uart1_rx_timeout = 0;
static bool uart1_rx_done = false;
/* USER CODE END 0 */
UART_HandleTypeDef huart1;
/* USART1 init function */
void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
/* USER CODE END USART1_Init 2 */
}
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* USART1 clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspInit 1 */
/* USER CODE END USART1_MspInit 1 */
}
}
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{
if(uartHandle->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspDeInit 0 */
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
/* USART1 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspDeInit 1 */
/* USER CODE END USART1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
void uart1_reconfig( uint32_t rate )
{
/* ԭ<>д<EFBFBD><D0B4><EFBFBD>1<EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC> */
huart1.Instance = USART1;
huart1.Init.BaudRate = rate;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/* <20><><EFBFBD><EFBFBD>E22<32><32><EFBFBD>ڽ<EFBFBD><DABD>ն<EFBFBD><D5B6><EFBFBD>
<EFBFBD>Ƽ<EFBFBD>ʹ<EFBFBD>ö<EFBFBD><EFBFBD><EFBFBD>+<EFBFBD><EFBFBD>ʱ<EFBFBD>ϰ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>E22ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>ijЩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if( fifo_create( &fifo_uart1_rx, fifo_buffer , sizeof(fifo_buffer)) != FIFO_OK )
{
///@todo
/* <20><><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ʧ<EFBFBD><CAA7> */
while(1);
}
/* <20><><EFBFBD><EFBFBD>E22<32><32><EFBFBD><EFBFBD><EFBFBD>жϽ<D0B6><CFBD><EFBFBD> (<28><><EFBFBD>ֽ<EFBFBD><D6BD>ж<EFBFBD>) */
HAL_UART_Receive_IT( &huart1, &tmp, 1);
uart1_rx_timeout = 0;
uart1_rx_done = false;
}
void uart1_rx_timeout_1ms_callback(void)
{
/* <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>лͣˢ<CDA3>µ<EFBFBD><C2B5><EFBFBD>ʱ
<EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>ʱÿ1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>ڻ<EFBFBD>ݼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ */
if( uart1_rx_timeout > 0 )
{
uart1_rx_timeout--;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զϰ<D4B6><CFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if( uart1_rx_timeout == 0 )
{
uart1_rx_done = true;
}
}
}
void uart1_wait_response_blocked( uint8_t * buffer, uint16_t *length )
{
uint32_t fifo_rx_len = 0;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD>ն<EFBFBD><D5B6><EFBFBD> */
fifo_clear( &fifo_uart1_rx );
/* <20>趨100ms<6D><73><EFBFBD><EFBFBD>ʱ <20>δ<EFBFBD>ʱ<EFBFBD><CAB1>1ms<6D>ж<EFBFBD><D0B6>ڲ<EFBFBD><DAB2>ϵݼ<CFB5>*/
systick_set_user_timeout(100);
/* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
while( uart1_rx_done == false )
{
/* <20><><EFBFBD>100ms<6D><73><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if( systick_get_user_timeout() == 0)
{
///@todo
/* <20><>ʱ<EFBFBD><CAB1> ģ<><C4A3><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6> */
usb_printf( "Response Timeout!!! \r\n");
while(1);
}
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if( uart1_rx_done == true )
{
uart1_rx_done = false;
/* <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ڽ<EFBFBD><DABD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> */
fifo_get_length( &fifo_uart1_rx , &fifo_rx_len);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD> */
fifo_read( &fifo_uart1_rx, buffer, fifo_rx_len );
*length = fifo_rx_len;
}
}
bool uart1_check_rx_done( uint8_t *buffer , uint32_t *length )
{
bool ret = false;
uint32_t fifo_rx_len = 0;
if( uart1_rx_done == true )
{
uart1_rx_done = false;
/* <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ڽ<EFBFBD><DABD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> */
fifo_get_length( &fifo_uart1_rx , &fifo_rx_len);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD> */
fifo_read( &fifo_uart1_rx, buffer, fifo_rx_len );
*length = fifo_rx_len;
ret = true;
}
return ret;
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
uint8_t rd,rd_2;
if (huart->Instance == USART1)
{
switch (current_feature)
{
case FUNC_FEATURE1:
rd_2 = huart->Instance->DR;
fifo_write(&fifo_uart1_rx,&rd_2,1);
CDC_Transmit_FS(&usb_rx_data,1);
HAL_UART_Receive_IT( &huart1, &usb_rx_data, 1);
uart1_rx_timeout = 10;
break;
case FUNC_FEATURE2:
rd = huart->Instance->DR;
fifo_write(&fifo_uart1_rx,&rd,1);
HAL_UART_Receive_IT( &huart1, &tmp, 1);
uart1_rx_timeout = 10;
break;
default:
break;
}
}
}
void usb_receive_to_tx_send( void )
{
HAL_Delay(1);
if(usb_rx_complete)
{
HAL_UART_Transmit(&huart1,my_usb_rx_data, my_usb_rx_num ,500);
memset(my_usb_rx_data, 0, my_usb_rx_num);
my_usb_rx_num = 0;
usb_rx_complete = 0;
}
}
/* USER CODE END 1 */