Rev 4 | Rev 6 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4 | Rev 5 | ||
---|---|---|---|
Line 24... | Line 24... | ||
24 | /* returns the number of characters received by the Rx USART */ |
24 | /* returns the number of characters received by the Rx USART */ |
25 | uint16_t |
25 | uint16_t |
26 | SerialCharsReceived (usart_ctl *instance) |
26 | SerialCharsReceived (usart_ctl *instance) |
27 | { |
27 | { |
28 | uint16_t result = 0; // assume no characters received yet |
28 | uint16_t result = 0; // assume no characters received yet |
29 | __HAL_UART_DISABLE_IT (instance, UART_IT_RXNE); |
29 | __HAL_UART_DISABLE_IT (instance->Handle, UART_IT_RXNE); |
30 | 30 | ||
31 | if (instance->rx_usart_buffer_full) |
31 | if (instance->rx_usart_buffer_full) |
32 | { // buffer is full... |
32 | { // buffer is full... |
33 | result = RX_USART_BUFF_SIZ; |
33 | result = RX_USART_BUFF_SIZ; |
34 | } |
34 | } |
Line 39... | Line 39... | ||
39 | else |
39 | else |
40 | { // buffer has possibly wrapped... |
40 | { // buffer has possibly wrapped... |
41 | result = RX_USART_BUFF_SIZ - instance->rx_usart_out_Ptr |
41 | result = RX_USART_BUFF_SIZ - instance->rx_usart_out_Ptr |
42 | + instance->rx_usart_in_Ptr; |
42 | + instance->rx_usart_in_Ptr; |
43 | } |
43 | } |
44 | __HAL_UART_ENABLE_IT (instance, UART_IT_RXNE); |
44 | __HAL_UART_ENABLE_IT (instance->Handle, UART_IT_RXNE); |
45 | 45 | ||
46 | return result; |
46 | return result; |
47 | } |
47 | } |
48 | 48 | ||
49 | inline uint8_t |
49 | inline uint8_t |
50 | PollSerial (usart_ctl *instance) |
50 | PollSerial (usart_ctl *instance) |
51 | { |
51 | { |
52 | uint8_t rc; |
52 | uint8_t rc; |
53 | 53 | ||
54 | __HAL_UART_DISABLE_IT (instance, UART_IT_RXNE); |
54 | __HAL_UART_DISABLE_IT (instance->Handle, UART_IT_RXNE); |
55 | rc = (instance->rx_usart_buffer_full |
55 | rc = (instance->rx_usart_buffer_full |
56 | || (instance->rx_usart_in_Ptr != instance->rx_usart_out_Ptr)); |
56 | || (instance->rx_usart_in_Ptr != instance->rx_usart_out_Ptr)); |
57 | __HAL_UART_ENABLE_IT (instance, UART_IT_RXNE); |
57 | __HAL_UART_ENABLE_IT (instance->Handle, UART_IT_RXNE); |
58 | 58 | ||
59 | return rc; |
59 | return rc; |
60 | } |
60 | } |
61 | 61 | ||
62 | /***! |
62 | /***! |
Line 65... | Line 65... | ||
65 | */ |
65 | */ |
66 | inline uint8_t |
66 | inline uint8_t |
67 | GetCharSerial (usart_ctl *instance) |
67 | GetCharSerial (usart_ctl *instance) |
68 | { |
68 | { |
69 | uint8_t c; |
69 | uint8_t c; |
70 | __HAL_UART_DISABLE_IT (instance, UART_IT_RXNE); |
70 | __HAL_UART_DISABLE_IT (instance->Handle, UART_IT_RXNE); |
71 | while (!instance->rx_usart_buffer_full |
71 | while (!instance->rx_usart_buffer_full |
72 | && (instance->rx_usart_in_Ptr == instance->rx_usart_out_Ptr)) |
72 | && (instance->rx_usart_in_Ptr == instance->rx_usart_out_Ptr)) |
73 | { |
73 | { |
74 | __HAL_UART_ENABLE_IT (instance, UART_IT_RXNE); |
74 | __HAL_UART_ENABLE_IT (instance->Handle, UART_IT_RXNE); |
75 | __WFI (); /* wait for something */ |
75 | __WFI (); /* wait for something */ |
76 | __HAL_UART_DISABLE_IT (instance, UART_IT_RXNE); |
76 | __HAL_UART_DISABLE_IT (instance->Handle, UART_IT_RXNE); |
77 | } |
77 | } |
78 | 78 | ||
79 | c = instance->rx_usart_buff[instance->rx_usart_out_Ptr]; |
79 | c = instance->rx_usart_buff[instance->rx_usart_out_Ptr]; |
80 | instance->rx_usart_buffer_full = 0; /* removed character */ |
80 | instance->rx_usart_buffer_full = 0; /* removed character */ |
81 | instance->rx_usart_out_Ptr++; |
81 | instance->rx_usart_out_Ptr++; |
82 | if (instance->rx_usart_out_Ptr >= RX_USART_BUFF_SIZ) |
82 | if (instance->rx_usart_out_Ptr >= RX_USART_BUFF_SIZ) |
83 | { |
83 | { |
84 | instance->rx_usart_out_Ptr = 0; |
84 | instance->rx_usart_out_Ptr = 0; |
85 | } |
85 | } |
86 | __HAL_UART_ENABLE_IT (instance, UART_IT_RXNE); |
86 | __HAL_UART_ENABLE_IT (instance->Handle, UART_IT_RXNE); |
87 | return c; |
87 | return c; |
88 | } |
88 | } |
89 | 89 | ||
90 | /* |
90 | /* |
91 | * \brief |
91 | * \brief |
Line 94... | Line 94... | ||
94 | */ |
94 | */ |
95 | inline void |
95 | inline void |
96 | EnableSerialRxInterrupt (usart_ctl *instance) |
96 | EnableSerialRxInterrupt (usart_ctl *instance) |
97 | { |
97 | { |
98 | /* cheat here - this is a macro and I have the same Instance member as the HAL handle, with the same meaning */ |
98 | /* cheat here - this is a macro and I have the same Instance member as the HAL handle, with the same meaning */ |
99 | __HAL_UART_ENABLE_IT (instance, UART_IT_RXNE); |
99 | __HAL_UART_ENABLE_IT (instance->Handle, UART_IT_RXNE); |
100 | 100 | ||
101 | } |
101 | } |
102 | 102 | ||
103 | /****! |
103 | /****! |
104 | * @brief send a character to the serial USART via placing it in the serial buffer |
104 | * @brief send a character to the serial USART via placing it in the serial buffer |
Line 106... | Line 106... | ||
106 | */ |
106 | */ |
107 | 107 | ||
108 | static void |
108 | static void |
109 | PutCharSerialFIFO (usart_ctl *instance, uint8_t c) |
109 | PutCharSerialFIFO (usart_ctl *instance, uint8_t c) |
110 | { |
110 | { |
111 | __HAL_UART_DISABLE_IT (instance, UART_IT_TXE); |
111 | __HAL_UART_DISABLE_IT (instance->Handle, UART_IT_TXE); |
112 | 112 | ||
113 | instance->tx_usart_buff[instance->tx_usart_in_Ptr++] = c; |
113 | instance->tx_usart_buff[instance->tx_usart_in_Ptr++] = c; |
114 | instance->tx_usart_count += 1; |
114 | instance->tx_usart_count += 1; |
115 | if (instance->tx_usart_in_Ptr >= TX_USART_BUFF_SIZ) |
115 | if (instance->tx_usart_in_Ptr >= TX_USART_BUFF_SIZ) |
116 | { |
116 | { |
Line 125... | Line 125... | ||
125 | instance->tx_usart_out_Ptr = 0; |
125 | instance->tx_usart_out_Ptr = 0; |
126 | } |
126 | } |
127 | } |
127 | } |
128 | 128 | ||
129 | instance->tx_usart_running = 1; |
129 | instance->tx_usart_running = 1; |
130 | __HAL_UART_ENABLE_IT (instance, UART_IT_TXE); |
130 | __HAL_UART_ENABLE_IT (instance->Handle, UART_IT_TXE); |
131 | } |
131 | } |
132 | 132 | ||
133 | void |
133 | void |
134 | UART_IRQHandler (usart_ctl *instance) |
134 | UART_IRQHandler (usart_ctl *instance) |
135 | { |
135 | { |
136 | 136 | ||
137 | __disable_irq (); |
137 | __disable_irq (); |
138 | uint32_t rxStatus; // status from USART receiver |
138 | uint32_t rxStatus; // status from USART receiver |
139 | 139 | ||
140 | rxStatus = instance->Instance->SR;// read the status bits - this resets all the hardware signalling flags |
140 | rxStatus = instance->Handle->Instance->SR;// read the status bits - this resets all the hardware signalling flags |
141 | 141 | ||
142 | if ((rxStatus & USART_SR_RXNE)!= RESET) |
142 | if ((rxStatus & USART_SR_RXNE)!= RESET) |
143 | { |
143 | { |
144 | // no error has occurred... |
144 | // no error has occurred... |
145 | uint8_t rxChar = (uint8_t) (instance->Instance->DR & 0xff);// read the bottom 8-bits only |
145 | uint8_t rxChar = (uint8_t) (instance->Handle->Instance->DR & 0xff);// read the bottom 8-bits only |
146 | 146 | ||
147 | if (!instance->rx_usart_buffer_full) |
147 | if (!instance->rx_usart_buffer_full) |
148 | { |
148 | { |
149 | instance->rx_usart_buff[instance->rx_usart_in_Ptr++] = rxChar; |
149 | instance->rx_usart_buff[instance->rx_usart_in_Ptr++] = rxChar; |
150 | 150 | ||
Line 165... | Line 165... | ||
165 | /* Only enable the transmitter when baud detect has completed or check expired. |
165 | /* Only enable the transmitter when baud detect has completed or check expired. |
166 | * and the software is ready for it to be enabled as programming mode is wanting |
166 | * and the software is ready for it to be enabled as programming mode is wanting |
167 | * to receive a response and that can get blocked if we're streaming a lot of debug messages*/ |
167 | * to receive a response and that can get blocked if we're streaming a lot of debug messages*/ |
168 | if (instance->tx_usart_in_Ptr != instance->tx_usart_out_Ptr) |
168 | if (instance->tx_usart_in_Ptr != instance->tx_usart_out_Ptr) |
169 | { |
169 | { |
170 | instance->Instance->DR = |
170 | instance->Handle->Instance->DR = |
171 | instance->tx_usart_buff[instance->tx_usart_out_Ptr++]; |
171 | instance->tx_usart_buff[instance->tx_usart_out_Ptr++]; |
172 | if (instance->tx_usart_count != 0) |
172 | if (instance->tx_usart_count != 0) |
173 | instance->tx_usart_count -= 1; |
173 | instance->tx_usart_count -= 1; |
174 | 174 | ||
175 | if (instance->tx_usart_out_Ptr >= TX_USART_BUFF_SIZ) |
175 | if (instance->tx_usart_out_Ptr >= TX_USART_BUFF_SIZ) |
Line 177... | Line 177... | ||
177 | instance->tx_usart_out_Ptr = 0; |
177 | instance->tx_usart_out_Ptr = 0; |
178 | } |
178 | } |
179 | } |
179 | } |
180 | else |
180 | else |
181 | { |
181 | { |
182 | __HAL_UART_DISABLE_IT (instance, UART_IT_TXE); |
182 | __HAL_UART_DISABLE_IT (instance->Handle, UART_IT_TXE); |
183 | instance->tx_usart_running = 0; |
183 | instance->tx_usart_running = 0; |
184 | } |
184 | } |
185 | } |
185 | } |
186 | 186 | ||
187 | __enable_irq (); |
187 | __enable_irq (); |
Line 247... | Line 247... | ||
247 | */ |
247 | */ |
248 | 248 | ||
249 | void TxWaitEmpty(usart_ctl *instance) |
249 | void TxWaitEmpty(usart_ctl *instance) |
250 | { |
250 | { |
251 | while (instance->tx_usart_count || |
251 | while (instance->tx_usart_count || |
252 | (instance->Instance->SR & USART_SR_TC) != RESET) {}; |
252 | (instance->Handle->Instance->SR & USART_SR_TC) != RESET) {}; |
253 | } |
253 | } |
254 | 254 | ||
255 | /**** |
255 | /**** |
256 | * @brief Initialise control structure |
256 | * @brief Initialise control structure |
257 | */ |
257 | */ |
258 | void |
258 | void |
259 | init_usart_ctl (usart_ctl *instance, USART_TypeDef * usart ) |
259 | init_usart_ctl (usart_ctl *instance, UART_HandleTypeDef * handle ) |
260 | { |
260 | { |
261 | 261 | ||
262 | instance->Instance = usart; |
262 | instance->Handle = handle; |
263 | 263 | ||
264 | /* cheat here - this is a macro and I have the same Instance member as the HAL handle, with the same meaning */ |
264 | /* cheat here - this is a macro and I have the same Instance member as the HAL handle, with the same meaning */ |
265 | __HAL_UART_DISABLE_IT (instance, UART_IT_TXE); |
265 | __HAL_UART_DISABLE_IT (instance->Handle, UART_IT_TXE); |
266 | __HAL_UART_DISABLE_IT (instance, UART_IT_RXNE); |
266 | __HAL_UART_DISABLE_IT (instance->Handle, UART_IT_RXNE); |
267 | 267 | ||
268 | instance->tx_usart_in_Ptr = 0; |
268 | instance->tx_usart_in_Ptr = 0; |
269 | instance->tx_usart_out_Ptr = 0; |
269 | instance->tx_usart_out_Ptr = 0; |
270 | instance->tx_usart_running = 0; |
270 | instance->tx_usart_running = 0; |
271 | instance->tx_usart_count = 0; |
271 | instance->tx_usart_count = 0; |
Line 274... | Line 274... | ||
274 | instance->rx_usart_out_Ptr = 0; |
274 | instance->rx_usart_out_Ptr = 0; |
275 | instance->rx_usart_buffer_full = 0; |
275 | instance->rx_usart_buffer_full = 0; |
276 | 276 | ||
277 | } |
277 | } |
278 | 278 | ||
- | 279 | void |
|
- | 280 | setBaud (usart_ctl *ctl, uint32_t baud) |
|
- | 281 | { |
|
- | 282 | ctl->Handle->Init.BaudRate = baud; |
|
- | 283 | __disable_irq (); |
|
- | 284 | HAL_UART_Init (ctl->Handle); |
|
- | 285 | __enable_irq (); |
|
- | 286 | } |
|
- | 287 | ||
- | 288 | ||
- | 289 | ||
279 | ///////////////////////////////////////////////////////// |
290 | ///////////////////////////////////////////////////////// |
280 | /// Moved from generated code to avoid crappy HAL handler |
291 | /// Moved from generated code to avoid crappy HAL handler |
281 | #if defined SERIAL_UART1 |
292 | #if defined SERIAL_UART1 |
282 | void USART1_IRQHandler(void) |
293 | void USART1_IRQHandler(void) |
283 | { |
294 | { |