Skip to content

Commit 381e482

Browse files
author
Kei
committed
Changed UART rx mode (IRQ->DMA)
1 parent e9c874e commit 381e482

File tree

6 files changed

+43
-1
lines changed

6 files changed

+43
-1
lines changed

bootloaders/commXel_boot.bin

29.1 KB
Binary file not shown.

bootloaders/powerXel_boot.bin

11.8 KB
Binary file not shown.

bootloaders/sensorXel_boot.bin

-4.93 KB
Binary file not shown.

bootloaders/sensorXel_boot_revE.bin

12 KB
Binary file not shown.

cores/arduino/HardwareSerial.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,12 @@ void HardwareSerial::begin(unsigned long baud, byte config)
389389

390390
uart_init(&_serial, (uint32_t)baud, databits, parity, stopbits);
391391
enableHalfDuplexRx();
392+
#if defined(ARDUINO_SensorXEL) || defined(ARDUINO_SensorXEL_revE)\
393+
|| defined(ARDUINO_PowerXEL)
394+
395+
#else
392396
uart_attach_rx_callback(&_serial, _rx_complete_irq);
397+
#endif
393398
}
394399

395400
void HardwareSerial::end()
@@ -405,6 +410,15 @@ void HardwareSerial::end()
405410

406411
int HardwareSerial::available(void)
407412
{
413+
#if defined(ARDUINO_SensorXEL) || defined(ARDUINO_SensorXEL_revE)\
414+
|| defined(ARDUINO_PowerXEL)
415+
uint16_t cndtr = _serial.handle.hdmarx->Instance->CNDTR;
416+
if(cndtr > SERIAL_RX_BUFFER_SIZE){
417+
cndtr = SERIAL_RX_BUFFER_SIZE;
418+
}
419+
_serial.rx_head = SERIAL_RX_BUFFER_SIZE - cndtr;
420+
#endif
421+
408422
return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _serial.rx_head - _serial.rx_tail)) % SERIAL_RX_BUFFER_SIZE;
409423
}
410424

cores/arduino/stm32/uart.c

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,12 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
306306
huart->Init.Parity = parity;
307307
huart->Init.Mode = UART_MODE_TX_RX;
308308
huart->Init.HwFlowCtl = UART_HWCONTROL_NONE;
309+
#if defined(ARDUINO_SensorXEL) || defined(ARDUINO_SensorXEL_revE)\
310+
|| defined(ARDUINO_PowerXEL)
311+
huart->Init.OverSampling = UART_OVERSAMPLING_8;
312+
#else
309313
huart->Init.OverSampling = UART_OVERSAMPLING_16;
314+
#endif
310315
#if !defined(STM32F1xx) && !defined(STM32F2xx) && !defined(STM32F4xx)\
311316
&& !defined(STM32L1xx)
312317
huart->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
@@ -373,6 +378,11 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
373378
} else if (HAL_UART_Init(huart) != HAL_OK) {
374379
return;
375380
}
381+
382+
#if defined(ARDUINO_SensorXEL) || defined(ARDUINO_SensorXEL_revE)\
383+
|| defined(ARDUINO_PowerXEL)
384+
HAL_UART_Receive_DMA(huart, obj->rx_buff, SERIAL_RX_BUFFER_SIZE);
385+
#endif
376386
}
377387

378388
/**
@@ -800,7 +810,7 @@ uint8_t uart_index(UART_HandleTypeDef *huart)
800810
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
801811
{
802812
serial_t *obj = get_serial_obj(huart);
803-
if (obj) {
813+
if (obj && obj->rx_callback != NULL) {
804814
obj->rx_callback(obj);
805815
}
806816
}
@@ -852,7 +862,19 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
852862
/* Restart receive interrupt after any error */
853863
serial_t *obj = get_serial_obj(huart);
854864
if (obj && !serial_rx_active(obj)) {
865+
#if defined(ARDUINO_SensorXEL) || defined(ARDUINO_SensorXEL_revE)\
866+
|| defined(ARDUINO_PowerXEL)
867+
if(huart->Instance == USART1 || huart->Instance == USART2){
868+
obj->rx_head = SERIAL_RX_BUFFER_SIZE - obj->handle.hdmarx->Instance->CNDTR;
869+
obj->rx_tail = obj->rx_head;
870+
memset(obj->rx_buff, 0, SERIAL_RX_BUFFER_SIZE);
871+
HAL_UART_Receive_DMA(huart, obj->rx_buff, SERIAL_RX_BUFFER_SIZE);
872+
}else{
873+
HAL_UART_Receive_IT(huart, &(obj->recv), 1);
874+
}
875+
#else
855876
HAL_UART_Receive_IT(huart, &(obj->recv), 1);
877+
#endif
856878
}
857879
}
858880

@@ -1063,9 +1085,15 @@ void UART10_IRQHandler(void)
10631085
*/
10641086
void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)
10651087
{
1088+
#if defined(ARDUINO_SensorXEL) || defined(ARDUINO_SensorXEL_revE)\
1089+
|| defined(ARDUINO_PowerXEL)
1090+
(void)huart;
1091+
#else
10661092
serial_t *obj = get_serial_obj(huart);
10671093
HAL_UART_Receive_IT(huart, &(obj->recv), 1);
1094+
#endif
10681095
}
1096+
10691097
#endif /* HAL_UART_MODULE_ENABLED */
10701098

10711099
#ifdef __cplusplus

0 commit comments

Comments
 (0)