38
38
#include "tick.h"
39
39
#include "stm32f4xx_hal.h"
40
40
41
- bool iflag ;
42
- int errflag ;
43
- bool rxflag ;
44
- bool bsyflag ;
45
-
46
41
STATIC bool reserved_uart [MAX_UART ];
42
+ int errflag ; //Used to restart read halts
47
43
48
44
void uart_reset (void ) {
49
45
#ifdef USART1
@@ -88,7 +84,6 @@ void uart_reset(void) {
88
84
__HAL_RCC_USART6_RELEASE_RESET ();
89
85
__HAL_RCC_USART6_CLK_DISABLE ();
90
86
#endif
91
- //TODO: this technically needs to go to 10 to support F413. Any way to condense?
92
87
}
93
88
94
89
STATIC USART_TypeDef * assign_uart_or_throw (busio_uart_obj_t * self , bool pin_eval ,
@@ -302,34 +297,21 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self,
302
297
if ((HAL_UART_GetState (& self -> handle ) & HAL_UART_STATE_BUSY_RX ) == HAL_UART_STATE_BUSY_RX ) {
303
298
mp_raise_ValueError (translate ("Could not start interrupt, RX busy" ));
304
299
}
305
- HAL_NVIC_DisableIRQ (self -> irq ); //prevent handle lock contention
306
300
301
+ //start the recieve interrupt chain
302
+ HAL_NVIC_DisableIRQ (self -> irq ); //prevent handle lock contention
307
303
HAL_UART_Receive_IT (& self -> handle , & self -> rx_char , 1 );
308
-
309
304
HAL_NVIC_SetPriority (self -> irq , UART_IRQPRI , UART_IRQSUB_PRI );
310
305
HAL_NVIC_EnableIRQ (self -> irq );
311
306
312
- //mp_printf(&mp_plat_print, "Started and inited\n");
313
- iflag = 0 ;
314
- errflag = 0 ;
315
- rxflag = 0 ;
316
- bsyflag = 0 ;
317
-
318
- //interrupt debuggery
319
- GPIO_InitStruct .Pin = pin_mask (7 );
320
- GPIO_InitStruct .Mode = GPIO_MODE_OUTPUT_PP ;
321
- GPIO_InitStruct .Pull = GPIO_NOPULL ;
322
- GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_LOW ;
323
- HAL_GPIO_Init (pin_port (2 ), & GPIO_InitStruct );
324
- HAL_GPIO_WritePin (pin_port (2 ),pin_mask (7 ),0 );
307
+ errflag = HAL_OK ;
325
308
}
326
309
327
310
bool common_hal_busio_uart_deinited (busio_uart_obj_t * self ) {
328
311
return self -> tx -> pin == mp_const_none ;
329
312
}
330
313
331
314
void common_hal_busio_uart_deinit (busio_uart_obj_t * self ) {
332
- //mp_printf(&mp_plat_print, "De-init UART\n");
333
315
reset_pin_number (self -> tx -> pin -> port ,self -> tx -> pin -> number );
334
316
reset_pin_number (self -> rx -> pin -> port ,self -> rx -> pin -> number );
335
317
self -> tx = mp_const_none ;
@@ -339,7 +321,6 @@ void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
339
321
self -> rbuf .iput = self -> rbuf .iget = 0 ;
340
322
}
341
323
342
- // Read characters.
343
324
size_t common_hal_busio_uart_read (busio_uart_obj_t * self , uint8_t * data , size_t len , int * errcode ) {
344
325
if (self -> rx == NULL ) {
345
326
mp_raise_ValueError (translate ("No RX pin" ));
@@ -363,20 +344,14 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
363
344
364
345
// Halt reception
365
346
HAL_NVIC_DisableIRQ (self -> irq );
366
-
367
347
// copy received data
368
348
rx_bytes = ringbuf_count (& self -> rbuf );
369
- //Used for debuggings
370
- //mp_printf(&mp_plat_print, "Read: count:%d, buffer location%p, if:%der:%drx:%dbsy:%d\n", rx_bytes, &self->rbuf,iflag,errflag,rxflag,bsyflag);
371
- iflag = 0 ;
372
- errflag = 0 ;
373
- rxflag = 0 ;
374
- bsyflag = 0 ;
349
+ //Used for debugging
350
+ //mp_printf(&mp_plat_print, "Read: count:%d, buffer location%p, er:%d\n", rx_bytes, &self->rbuf,errflag);
375
351
rx_bytes = MIN (rx_bytes , len );
376
352
for ( uint16_t i = 0 ; i < rx_bytes ; i ++ ) {
377
353
data [i ] = ringbuf_get (& self -> rbuf );
378
354
}
379
-
380
355
HAL_NVIC_EnableIRQ (self -> irq );
381
356
382
357
if (rx_bytes == 0 ) {
@@ -392,25 +367,27 @@ size_t common_hal_busio_uart_write(busio_uart_obj_t *self, const uint8_t *data,
392
367
mp_raise_ValueError (translate ("No TX pin" ));
393
368
}
394
369
395
- if ( HAL_UART_Transmit ( & self -> handle , ( uint8_t * ) data , len , 500 ) == HAL_OK ) {
396
- return len ;
397
- } else {
370
+ HAL_NVIC_DisableIRQ ( self -> irq );
371
+
372
+ if ( HAL_UART_Transmit ( & self -> handle , ( uint8_t * ) data , len , self -> timeout_ms ) != HAL_OK ) {
398
373
mp_raise_ValueError (translate ("UART write error" ));
399
374
}
400
- //mp_printf(&mp_plat_print, "Send\n");
401
- return 0 ;
375
+
376
+ HAL_UART_Receive_IT (& self -> handle , & self -> rx_char , 1 );
377
+ HAL_NVIC_SetPriority (self -> irq , UART_IRQPRI , UART_IRQSUB_PRI );
378
+ HAL_NVIC_EnableIRQ (self -> irq );
379
+
380
+ return len ;
402
381
}
403
382
404
383
void HAL_UART_RxCpltCallback (UART_HandleTypeDef * handle )
405
384
{
406
- rxflag = 1 ;
407
385
for (int i = 0 ; i < 7 ; i ++ ) {
408
386
//get context pointer and cast it as struct pointer
409
387
busio_uart_obj_t * context = (busio_uart_obj_t * )MP_STATE_PORT (cpy_uart_obj_all )[i ];
410
388
if (handle == & context -> handle ) {
411
389
//check if transaction is ongoing
412
390
if ((HAL_UART_GetState (handle ) & HAL_UART_STATE_BUSY_RX ) == HAL_UART_STATE_BUSY_RX ) {
413
- bsyflag = 1 ;
414
391
return ;
415
392
}
416
393
ringbuf_put_n (& context -> rbuf , & context -> rx_char , 1 );
@@ -468,25 +445,22 @@ uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) {
468
445
}
469
446
470
447
void common_hal_busio_uart_clear_rx_buffer (busio_uart_obj_t * self ) {
471
- //mp_printf(&mp_plat_print, "Clear RX Buffer\n");
472
448
// Halt reception
473
449
HAL_NVIC_DisableIRQ (self -> irq );
474
450
ringbuf_clear (& self -> rbuf );
475
451
HAL_NVIC_EnableIRQ (self -> irq );
476
452
}
477
453
478
454
bool common_hal_busio_uart_ready_to_tx (busio_uart_obj_t * self ) {
479
- return true ;
455
+ return __HAL_UART_GET_FLAG ( & self -> handle , UART_FLAG_TXE ) ;
480
456
}
481
457
482
458
STATIC void call_hal_irq (int uart_num ) {
483
- iflag = 1 ;
484
459
//Create casted context pointer
485
460
busio_uart_obj_t * context = (busio_uart_obj_t * )MP_STATE_PORT (cpy_uart_obj_all )[uart_num - 1 ];
486
461
if (context != NULL ) {
487
462
HAL_NVIC_ClearPendingIRQ (context -> irq );
488
463
HAL_UART_IRQHandler (& context -> handle );
489
- HAL_GPIO_TogglePin (pin_port (2 ),pin_mask (7 ));
490
464
}
491
465
}
492
466
0 commit comments