Question
Hi everyone I need help understanding what I am doing wrong. I would like my buffers to work properly, but when I run the program my terminal starts sending all sorts of strange characters. I use stm32f411e-Disco
#define UART_RX_BUF_SIZE 20
#define UART_TX_BUF_SIZE 20
int8_t uart_put_char(char data);
int8_t uart_get_char(char *data);
volatile char uart_rxBuff[UART_RX_BUF_SIZE];
volatile char uart_txBuff[UART_TX_BUF_SIZE];
void uart_put_string(char *s);
typedef struct {
volatile char *const buffer;
uint8_t head;
uint8_t tail;
} circ_buffer_t;
volatile circ_buffer_t uart_rx_circBuff = { uart_rxBuff, 0, 0 };
volatile circ_buffer_t uart_tx_circBuff = { uart_txBuff, 0, 0 };
int8_t uart_put_char(char data) {
uint8_t head_temp = uart_tx_circBuff.head + 1;
if (head_temp == UART_TX_BUF_SIZE)
head_temp = 0;
if (head_temp == uart_tx_circBuff.tail)
return 0; //0
uart_tx_circBuff.buffer[head_temp] = data;
//uart_tx_circBuff.buffer[uart_tx_circBuff.head] = data;
uart_tx_circBuff.head = head_temp;
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
return 0;
}
int8_t uart_get_char(char *data) {
if (uart_rx_circBuff.head == uart_rx_circBuff.tail)
return -1;
uart_rx_circBuff.tail++;
if (uart_rx_circBuff.tail == UART_RX_BUF_SIZE)
uart_rx_circBuff.tail = 0;
*data = uart_rx_circBuff.buffer[uart_rx_circBuff.tail];
return 0;
}
void uart_put_string(char *s) {
while (*s)
uart_put_char(*s++);
}
void USART1_IRQHandler( void ) {
HAL_UART_IRQHandler(&huart1);
//if ( __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE) != RESET) {
if(UART_IT_RXNE !=RESET){
uint8_t head_temp = uart_rx_circBuff.head + 1;
if (head_temp == UART_RX_BUF_SIZE)
head_temp = 0;
if (head_temp == uart_rx_circBuff.tail) {
//USART_ClearITPendingBit(&huart1, USART_IT_RXNE);
__HAL_UART_CLEAR_FLAG(&huart1, UART_IT_RXNE);
}
else {
HAL_UART_Receive_IT(&huart1,
(uint8_t*) &uart_rx_circBuff.buffer[head_temp], 1);
uart_rx_circBuff.head = head_temp;
}
}
//if ( __HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE) != RESET) {
if(UART_IT_TXE !=RESET){
if (uart_tx_circBuff.head == uart_tx_circBuff.tail) {
__HAL_UART_DISABLE_IT(&huart1, UART_IT_TXE);
} else {
uart_tx_circBuff.tail++;
if (uart_tx_circBuff.tail == UART_TX_BUF_SIZE)
uart_tx_circBuff.tail = 0;
HAL_UART_Transmit_IT(&huart1,
(uint8_t*) &uart_tx_circBuff.buffer[uart_tx_circBuff.tail],
1);
}
}
}
int main(void) {
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM10_Init();
/* USER CODE BEGIN 2 */
uint8_t head_temp = uart_rx_circBuff.head + 1;
HAL_UART_Receive_IT(&huart1,(uint8_t*) &uart_rx_circBuff.buffer[head_temp], 1);
uart_rx_circBuff.head = head_temp;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1) {
uart_put_string("abcdefxxxxxxxxxx");
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
}
//Configuration
/*
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;
*/