|
9 | 9 | #include "irq.h"
|
10 | 10 | #include "usart.h"
|
11 | 11 |
|
12 |
| -#define USART_TIMEOUT 0x100000 |
| 12 | +#define BAUD_RATE 115200 |
| 13 | +#define UART_ONE_BIT_TIME_US (1000000 / BAUD_RATE) |
| 14 | +// max timeout is 0xffffffff * UART_ONE_BIT_TIME_US |
| 15 | +#define UART_TIMEOUT_MS (2) |
13 | 16 |
|
14 | 17 | UART_HandleTypeDef uart;
|
15 | 18 | UART_HandleTypeDef *huart = &uart;
|
@@ -60,7 +63,7 @@ void ble_usart_init(void) {
|
60 | 63 | HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
61 | 64 |
|
62 | 65 | huart->Instance = UART4;
|
63 |
| - huart->Init.BaudRate = 115200; |
| 66 | + huart->Init.BaudRate = BAUD_RATE; |
64 | 67 | huart->Init.WordLength = UART_WORDLENGTH_8B;
|
65 | 68 | huart->Init.StopBits = UART_STOPBITS_1;
|
66 | 69 | huart->Init.Parity = UART_PARITY_NONE;
|
@@ -122,7 +125,10 @@ void ble_usart_init(void) {
|
122 | 125 | HAL_NVIC_ClearPendingIRQ(UART4_IRQn);
|
123 | 126 | HAL_NVIC_EnableIRQ(UART4_IRQn);
|
124 | 127 |
|
125 |
| - __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); |
| 128 | + HAL_UART_EnableReceiverTimeout(huart); |
| 129 | + HAL_UART_ReceiverTimeout_Config( |
| 130 | + huart, (UART_TIMEOUT_MS * 1000) / UART_ONE_BIT_TIME_US); |
| 131 | + __HAL_UART_ENABLE_IT(huart, UART_IT_RTO); |
126 | 132 | HAL_UART_Receive_DMA(huart, dma_uart_rev_buf, sizeof(dma_uart_rev_buf));
|
127 | 133 | }
|
128 | 134 |
|
@@ -276,8 +282,8 @@ void UART4_IRQHandler(void) {
|
276 | 282 | if (__HAL_UART_GET_FLAG(huart, UART_FLAG_WUF)) {
|
277 | 283 | __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_WUF);
|
278 | 284 | }
|
279 |
| - if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) { |
280 |
| - __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_IDLE); |
| 285 | + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF)) { |
| 286 | + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); |
281 | 287 | HAL_UART_Abort(huart);
|
282 | 288 | usart_fifo_len =
|
283 | 289 | sizeof(dma_uart_rev_buf) - __HAL_DMA_GET_COUNTER(huart->hdmarx);
|
|
0 commit comments