Files
E32_433_dev/Core/Src/usart.c
2026-04-10 20:26:51 +08:00

277 lines
7.1 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* 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>
<20>Ƽ<EFBFBD>ʹ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD>+<2B><>ʱ<EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>E22ģ<32><C4A3><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>Ϊ<EFBFBD><CEAA>ijЩ<C4B3><D0A9><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B4AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><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>ʱ
<20><><EFBFBD>δ<EFBFBD>ʱÿ1<C3BF><31><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڻ<EFBFBD>ݼ<EFBFBD><DDBC><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 */