Update McuLib: fixed UART problem on robot (shell over tinyK20 only worked once), because of FIFO issues.

main
Jonas Arnold 4 years ago
parent 02f3a8e0ac
commit 81db14c00c
  1. 25
      McuLib/config/McuShellUartconfig.h
  2. 56
      McuLib/src/McuShellUart.c

@ -15,9 +15,9 @@
#define McuShellUart_CONFIG_UART_K22FX512_UART0_A1_A2 (2) /* Rx on PTA1 (pin 27), Tx on PTA2 (pin 28) */
#define McuShellUart_CONFIG_UART_K22FX512_UART1_E1_E0 (3) /* Rx on PTE1 (pin 2), Tx on PTE2 (pin 1) */
/* Kinetis K22FN */
#define McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4 (4) /* PTC3: Rx, (pin 46), PTC4: Tx (pin 49) */
#define McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4 (4) /* PTC3: Rx, (pin 46), PTC4: Tx (pin 49) (OpenSDA UART on tinyK22) */
#define McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17 (5) /* PTB16 (Rx), PTB17 (Tx) */
#define McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0 (6) /* PTE1 (Rx), PTE0 (Tx) */
#define McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0 (6) /* PTE1 (Rx), PTE0 (Tx) (OpenSDA UART on FRDM-K22F) */
/* LPC55S16 */
#define McuShellUart_CONFIG_UART_LPC55S16_USART0 (7) /* FlexComm0, pin 92 (Rx) and pin 94 (Tx) */
#define McuShellUart_CONFIG_UART_LPC55S16_USART2 (8) /* FlexComm2, pin 3 (Rx) and pin 27 (Tx) */
@ -55,6 +55,8 @@
#endif
#define McuShellUart_CONFIG_UART_IRQ_HANDLER USART0_IRQHandler
#define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags
#define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */
#define McuShellUart_CONFIG_HAS_FIFO (0)
#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S16_USART0
#include "fsl_usart.h"
#include "fsl_iocon.h"
@ -75,6 +77,8 @@
#endif
#define McuShellUart_CONFIG_UART_IRQ_HANDLER FLEXCOMM0_IRQHandler
#define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags
#define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */
#define McuShellUart_CONFIG_HAS_FIFO (0) /* not sure? */
#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S16_USART2
#include "fsl_usart.h"
#include "fsl_iocon.h"
@ -96,6 +100,8 @@
#endif
#define McuShellUart_CONFIG_UART_IRQ_HANDLER FLEXCOMM2_IRQHandler
#define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags
#define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */
#define McuShellUart_CONFIG_HAS_FIFO (0) /* not sure? */
#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FX512_UART0_A1_A2
/* UART0 on K22FX512 */
#include "fsl_uart.h"
@ -117,6 +123,8 @@
#endif
#define McuShellUart_CONFIG_UART_IRQ_HANDLER UART0_RX_TX_IRQHandler
#define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags
#define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag)
#define McuShellUart_CONFIG_HAS_FIFO (1)
#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17
#include "fsl_uart.h"
#include "fsl_port.h"
@ -137,6 +145,8 @@
#endif
#define McuShellUart_CONFIG_UART_IRQ_HANDLER UART0_RX_TX_IRQHandler
#define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags
#define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag)
#define McuShellUart_CONFIG_HAS_FIFO (1)
#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0
/* UART1 on K22FN512. Mux the pins using the pins muxing tool */
#include "fsl_uart.h"
@ -158,6 +168,8 @@
#endif
#define McuShellUart_CONFIG_UART_IRQ_HANDLER UART1_RX_TX_IRQHandler
#define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags
#define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag)
#define McuShellUart_CONFIG_HAS_FIFO (1)
#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4
/* LPUART on K22FN512 */
#include "fsl_lpuart.h"
@ -185,8 +197,10 @@
#endif
#define McuShellUart_CONFIG_UART_IRQ_HANDLER LPUART0_IRQHandler
#define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS LPUART_ClearStatusFlags
#define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */
#define McuShellUart_CONFIG_HAS_FIFO (0)
#else
/* you have to put your config here */
/* you have to put your configuration here */
#endif
#ifndef McuShellUart_CONFIG_UART_RX_QUEUE_LENGTH
@ -197,4 +211,9 @@
#define McuShellUart_CONFIG_UART_BAUDRATE 115200
#endif
#ifndef McuShellUart_CONFIG_USE_FREERTOS
#define McuShellUart_CONFIG_USE_FREERTOS (McuLib_CONFIG_SDK_USE_FREERTOS)
/*!< If FreeRTOS (Queues) shall be used or not */
#endif
#endif /* MCUSHELLUARTCONFIG_H_ */

@ -1,5 +1,5 @@
/*
* Copyright (c) 2020, Erich Styger
* Copyright (c) 2020-2022, Erich Styger
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -8,13 +8,13 @@
#if McuShellUart_CONFIG_UART!=McuShellUart_CONFIG_UART_NONE
#include "McuShellUart.h"
#include "McuShell.h"
#if McuLib_CONFIG_SDK_USE_FREERTOS
#if McuShellUart_CONFIG_USE_FREERTOS
#include "McuRTOS.h"
#else
#include "McuRB.h"
#endif
#if McuLib_CONFIG_SDK_USE_FREERTOS
#if McuShellUart_CONFIG_USE_FREERTOS
static QueueHandle_t uartRxQueue;
#else
static McuRB_Handle_t rxRingBuffer;
@ -30,7 +30,7 @@ static void McuShellUart_SendChar(unsigned char ch) {
static void McuShellUart_ReadChar(uint8_t *c) {
uint8_t ch;
#if McuLib_CONFIG_SDK_USE_FREERTOS
#if McuShellUart_CONFIG_USE_FREERTOS
if (xQueueReceive(uartRxQueue, &ch, 0)==pdPASS ) {
*c = ch; /* return received character */
} else {
@ -46,7 +46,7 @@ static void McuShellUart_ReadChar(uint8_t *c) {
}
static bool McuShellUart_CharPresent(void) {
#if McuLib_CONFIG_SDK_USE_FREERTOS
#if McuShellUart_CONFIG_USE_FREERTOS
return uxQueueMessagesWaiting(uartRxQueue)!=0;
#else
return McuRB_NofElements(rxRingBuffer)!=0;
@ -61,31 +61,47 @@ McuShell_ConstStdIOType McuShellUart_stdio = {
#if McuShell_CONFIG_ECHO_ENABLED
.echoEnabled = false,
#endif
};
};
uint8_t McuShellUart_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */
/*********************************************************************************************************/
void McuShellUart_CONFIG_UART_IRQ_HANDLER(void) {
uint8_t data;
uint32_t flags;
#if McuLib_CONFIG_SDK_USE_FREERTOS
BaseType_t xHigherPriorityTaskWoken;
#if McuShellUart_CONFIG_USE_FREERTOS
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
#endif
uint8_t count;
flags = McuShellUart_CONFIG_UART_GET_FLAGS(McuShellUart_CONFIG_UART_DEVICE);
#if McuShellUart_CONFIG_HAS_FIFO
if (flags&kUART_RxFifoOverflowFlag) {
count = 0; /* statement to allow debugger to set a breakpoint here */
}
#endif
/* If new data arrived. */
if (flags&McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS) {
data = McuShellUart_CONFIG_UART_READ_BYTE(McuShellUart_CONFIG_UART_DEVICE);
#if McuLib_CONFIG_SDK_USE_FREERTOS
(void)xQueueSendFromISR(uartRxQueue, &data, &xHigherPriorityTaskWoken);
if (xHigherPriorityTaskWoken != pdFALSE) {
vPortYieldFromISR();
#if McuShellUart_CONFIG_HAS_FIFO
count = McuShellUart_CONFIG_UART_DEVICE->RCFIFO;
#else
count = 1;
#endif
while(count!=0) {
data = McuShellUart_CONFIG_UART_READ_BYTE(McuShellUart_CONFIG_UART_DEVICE);
#if McuShellUart_CONFIG_USE_FREERTOS
(void)xQueueSendFromISR(uartRxQueue, &data, &xHigherPriorityTaskWoken);
#else
McuRB_Put(rxRingBuffer, &data);
#endif
count--;
}
#else
McuRB_Put(rxRingBuffer, &data);
#endif
}
McuShellUART_CONFIG_CLEAR_STATUS_FLAGS(McuShellUart_CONFIG_UART_DEVICE, flags);
McuShellUART_CONFIG_CLEAR_STATUS_FLAGS(McuShellUart_CONFIG_UART_DEVICE, flags|McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS);
#if McuShellUart_CONFIG_USE_FREERTOS
if (xHigherPriorityTaskWoken != pdFALSE) {
vPortYieldFromISR();
}
#endif
#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && ((McuLib_CONFIG_CORTEX_M==4) || (McuLib_CONFIG_CORTEX_M==7))
/* ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping exception return operation might vector to incorrect interrupt.
* For Cortex-M7, if core speed much faster than peripheral register write speed, the peripheral interrupt flags may be still set after exiting ISR, this results to
@ -393,14 +409,14 @@ static void InitUart(void) {
for(;;) {/* error */}
}
McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS(McuShellUart_CONFIG_UART_DEVICE, McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS);
#if McuLib_CONFIG_SDK_USE_FREERTOS
#if McuShellUart_CONFIG_USE_FREERTOS
NVIC_SetPriority(McuShellUart_CONFIG_UART_IRQ_NUMBER, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
#endif
EnableIRQ(McuShellUart_CONFIG_UART_IRQ_NUMBER);
}
void McuShellUart_Deinit(void) {
#if McuLib_CONFIG_SDK_USE_FREERTOS
#if McuShellUart_CONFIG_USE_FREERTOS
vQueueDelete(uartRxQueue);
uartRxQueue = NULL;
#else
@ -410,7 +426,7 @@ void McuShellUart_Deinit(void) {
}
void McuShellUart_Init(void) {
#if McuLib_CONFIG_SDK_USE_FREERTOS
#if McuShellUart_CONFIG_USE_FREERTOS
uartRxQueue = xQueueCreate(McuShellUart_CONFIG_UART_RX_QUEUE_LENGTH, sizeof(uint8_t));
if (uartRxQueue==NULL) {
for(;;){} /* out of memory? */

Loading…
Cancel
Save