STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
board_uart9.c
Go to the documentation of this file.
1#include "board_uart9.h"
2
3#include "main.h"
4
6
7/* Single producer (the UART ISR) / single consumer (the GNSS task) ring.
8 * 1 KB = ~89 ms at 115200 baud; the task drains it every NAV-PVT. */
9#define RING_SIZE 1024U
10static uint8_t ring[RING_SIZE];
11static volatile uint32_t head, tail; /* free-running; head: ISR, tail: task */
12static uint8_t chunk[64]; /* HAL receive buffer */
13static volatile uint32_t overflows, errors;
14static osThreadId_t volatile owner;
15static uint32_t owner_flag;
16
17static void arm(void) {
19 errors = errors + 1U;
20 }
21}
22
23bool board_uart9_apply_baud(uint32_t baud) {
24 huart9.Init.BaudRate = baud;
25 /* HAL_UART_Init rewrites CR1 and clears FIFOEN, but leaves the handle's
26 * FifoMode at "enabled". Receive then waits for the RX FIFO threshold
27 * interrupt, which can't fire with the FIFO off: bytes overrun the
28 * single data register and only the one waiting at line idle arrives.
29 * So re-apply MX_UART9_Init's FIFO setup (keep in step with the .ioc). */
30 return HAL_UART_Init(&huart9) == HAL_OK &&
32 HAL_OK &&
34 HAL_OK &&
36}
37
39 owner_flag = flag;
40 owner = thread;
41 arm();
42 return true;
43}
44
45size_t board_uart9_read(uint8_t* out, size_t cap) {
46 size_t n = 0;
47 uint32_t h = head;
48 while (tail != h && n < cap) {
49 out[n++] = ring[tail % RING_SIZE];
50 tail = tail + 1U;
51 }
52 return n;
53}
54
55void board_uart9_send(const uint8_t* bytes, uint16_t len) {
56 (void)HAL_UART_Transmit(&huart9, (uint8_t*)bytes, len, 100);
57}
58
59void board_uart9_set_baud(uint32_t baud) {
61 if (!board_uart9_apply_baud(baud)) {
62 errors = errors + 1U;
63 }
64 arm();
65}
66
67uint32_t board_uart9_rx_bytes(void) {
68 return head;
69}
70uint32_t board_uart9_overflows(void) {
71 return overflows;
72}
73uint32_t board_uart9_errors(void) {
74 return errors;
75}
76
77/* HAL weak override: a burst ended (line idle) or the chunk filled. */
79 if (huart != &huart9) {
80 return;
81 }
82 for (uint16_t i = 0; i < size; ++i) {
83 if (head - tail >= RING_SIZE) {
84 overflows = overflows + 1U;
85 continue;
86 }
87 ring[head % RING_SIZE] = chunk[i];
88 head = head + 1U;
89 }
90 arm(); /* the UART FIFO holds bytes arriving meanwhile */
92 if (t) {
94 }
95}
96
97/* HAL weak override: overrun/framing/noise (e.g. during a baud change). */
99 if (huart == &huart9) {
100 errors = errors + 1U;
101 /* An overrun ends the reception (HAL aborts it): start again. A
102 * framing/noise/parity error keeps it running, so re-arming then
103 * would only fail as busy. */
104 if (huart->RxState == HAL_UART_STATE_READY) {
105 arm();
106 }
107 }
108}
size_t board_uart9_read(uint8_t *out, size_t cap)
Definition board_uart9.c:45
#define RING_SIZE
Definition board_uart9.c:9
static uint8_t chunk[64]
Definition board_uart9.c:12
uint32_t board_uart9_overflows(void)
Definition board_uart9.c:70
bool board_uart9_start(osThreadId_t thread, uint32_t flag)
Definition board_uart9.c:38
static volatile uint32_t head
Definition board_uart9.c:11
uint32_t board_uart9_rx_bytes(void)
Definition board_uart9.c:67
bool board_uart9_apply_baud(uint32_t baud)
Definition board_uart9.c:23
static osThreadId_t volatile owner
Definition board_uart9.c:14
static volatile uint32_t overflows
Definition board_uart9.c:13
uint32_t board_uart9_errors(void)
Definition board_uart9.c:73
static uint32_t owner_flag
Definition board_uart9.c:15
static void arm(void)
Definition board_uart9.c:17
static volatile uint32_t tail
Definition board_uart9.c:11
static volatile uint32_t errors
Definition board_uart9.c:13
void board_uart9_set_baud(uint32_t baud)
Definition board_uart9.c:59
static uint8_t ring[RING_SIZE]
Definition board_uart9.c:10
void board_uart9_send(const uint8_t *bytes, uint16_t len)
Definition board_uart9.c:55
void * osThreadId_t
Definition cmsis_os2.h:211
uint32_t osThreadFlagsSet(osThreadId_t thread_id, uint32_t flags)
Set the specified Thread Flags of a thread.
static osThreadId_t thread
Definition gnss_task.c:13
HAL_StatusTypeDef HAL_UARTEx_EnableFifoMode(UART_HandleTypeDef *huart)
HAL_StatusTypeDef HAL_UARTEx_SetRxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold)
HAL_StatusTypeDef HAL_UARTEx_SetTxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold)
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
#define UART_RXFIFO_THRESHOLD_1_2
RX FIFO reaches 1/2 of its depth.
#define UART_TXFIFO_THRESHOLD_1_8
TX FIFO reaches 1/8 of its depth.
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
Definition board_uart9.c:98
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t size)
Definition board_uart9.c:78
HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart)
struct __UART_HandleTypeDef UART_HandleTypeDef
UART handle Structure definition.
#define HAL_UART_STATE_READY
Peripheral Initialized and ready for use Value is allowed for gState and RxState.
UART_HandleTypeDef huart9
Definition main.c:65
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:24474
@ HAL_OK
__IO HAL_UART_StateTypeDef RxState
UART state information related to Rx operations.