From dc4791f0242e4fd770ae73e964f34d8e1feecae1 Mon Sep 17 00:00:00 2001 From: nathan Date: Wed, 29 Jun 2016 02:02:57 -0700 Subject: [PATCH 1/4] betaflight font mapping accounts for logo at the end of the font file, starting at 0xA0 --- src/main/drivers/max7456_symbols.h | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/main/drivers/max7456_symbols.h b/src/main/drivers/max7456_symbols.h index 68de42893..2030cb956 100644 --- a/src/main/drivers/max7456_symbols.h +++ b/src/main/drivers/max7456_symbols.h @@ -125,16 +125,9 @@ #define SYM_MAG11 0xB6 // AH Center screen Graphics -//#define SYM_AH_CENTER 0x01 -#ifdef ALT_CENTER - #define SYM_AH_CENTER_LINE 0xB0 - #define SYM_AH_CENTER 0xB1 - #define SYM_AH_CENTER_LINE_RIGHT 0xB2 -#else - #define SYM_AH_CENTER_LINE 0x26 - #define SYM_AH_CENTER 0x7E - #define SYM_AH_CENTER_LINE_RIGHT 0xBC -#endif +#define SYM_AH_CENTER_LINE 0x26 +#define SYM_AH_CENTER_LINE_RIGHT 0x27 +#define SYM_AH_CENTER 0x7E #define SYM_AH_RIGHT 0x02 #define SYM_AH_LEFT 0x03 #define SYM_AH_DECORATION_UP 0xC9 @@ -183,7 +176,7 @@ #define SYM_FT 0x0F // Voltage and amperage -#define SYM_VOLT 0xA9 +#define SYM_VOLT 0x00 #define SYM_AMP 0x9A #define SYM_MAH 0xA4 #define SYM_WATT 0x57 @@ -214,11 +207,11 @@ #define SYM_FLY_H 0x71 // Throttle Position (%) -#define SYM_THR 0xC8 -#define SYM_THR1 0xC9 +#define SYM_THR 0x04 +#define SYM_THR1 0x05 // RSSI -#define SYM_RSSI 0xBA +#define SYM_RSSI 0x01 // Menu cursor #define SYM_CURSOR SYM_AH_LEFT From 562a193033d86e32bbd3fd3afed72acfe42037b0 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 1 Jul 2016 01:30:04 -0700 Subject: [PATCH 2/4] 0x00 is reserved for string null byte termination, move the voltage symbol to 0x06 --- src/main/drivers/max7456_symbols.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/drivers/max7456_symbols.h b/src/main/drivers/max7456_symbols.h index 2030cb956..b2e8da72b 100644 --- a/src/main/drivers/max7456_symbols.h +++ b/src/main/drivers/max7456_symbols.h @@ -176,7 +176,7 @@ #define SYM_FT 0x0F // Voltage and amperage -#define SYM_VOLT 0x00 +#define SYM_VOLT 0x06 #define SYM_AMP 0x9A #define SYM_MAH 0xA4 #define SYM_WATT 0x57 From e0c28c30d5fa1c8292cc1c170435d170053fd3ae Mon Sep 17 00:00:00 2001 From: Read Error Date: Fri, 1 Jul 2016 06:34:41 -0400 Subject: [PATCH 3/4] USART5 doesn't exist on F3 or F4, should be UART5. --- src/main/io/serial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/io/serial.c b/src/main/io/serial.c index b2effbb4b..6fbdad7c0 100644 --- a/src/main/io/serial.c +++ b/src/main/io/serial.c @@ -316,7 +316,7 @@ serialPort_t *openSerialPort( #endif #ifdef USE_USART5 case SERIAL_PORT_USART5: - serialPort = uartOpen(USART5, callback, baudRate, mode, options); + serialPort = uartOpen(UART5, callback, baudRate, mode, options); break; #endif #ifdef USE_USART6 From 7529213e9c9cdbdf00b4d0da98f5515f261fbf02 Mon Sep 17 00:00:00 2001 From: Read Error Date: Sat, 2 Jul 2016 07:01:13 -0400 Subject: [PATCH 4/4] Addition of UART4/5 to F3 --- src/main/drivers/serial_uart_stm32f30x.c | 160 +++++++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/src/main/drivers/serial_uart_stm32f30x.c b/src/main/drivers/serial_uart_stm32f30x.c index c124f05e2..f457288ac 100644 --- a/src/main/drivers/serial_uart_stm32f30x.c +++ b/src/main/drivers/serial_uart_stm32f30x.c @@ -71,6 +71,24 @@ #define UART3_RX_PINSOURCE GPIO_PinSource11 #endif +#ifndef UART4_GPIO +#define UART4_TX_PIN GPIO_Pin_10 // PC10 (AF5) +#define UART4_RX_PIN GPIO_Pin_11 // PC11 (AF5) +#define UART4_GPIO_AF GPIO_AF_5 +#define UART4_GPIO GPIOC +#define UART4_TX_PINSOURCE GPIO_PinSource10 +#define UART4_RX_PINSOURCE GPIO_PinSource11 +#endif + +#ifndef UART5_GPIO // The real UART5_RX is on PD2, no board is using. +#define UART5_TX_PIN GPIO_Pin_12 // PC12 (AF5) +#define UART5_RX_PIN GPIO_Pin_12 // PC12 (AF5) +#define UART5_GPIO_AF GPIO_AF_5 +#define UART5_GPIO GPIOC +#define UART5_TX_PINSOURCE GPIO_PinSource12 +#define UART5_RX_PINSOURCE GPIO_PinSource12 +#endif + #ifdef USE_USART1 static uartPort_t uartPort1; #endif @@ -80,6 +98,12 @@ static uartPort_t uartPort2; #ifdef USE_USART3 static uartPort_t uartPort3; #endif +#ifdef USE_USART4 +static uartPort_t uartPort4; +#endif +#ifdef USE_USART5 +static uartPort_t uartPort5; +#endif #ifdef USE_USART1 uartPort_t *serialUSART1(uint32_t baudRate, portMode_t mode, portOptions_t options) @@ -324,6 +348,124 @@ uartPort_t *serialUSART3(uint32_t baudRate, portMode_t mode, portOptions_t optio } #endif +#ifdef USE_USART4 +uartPort_t *serialUSART4(uint32_t baudRate, portMode_t mode, portOptions_t options) +{ + uartPort_t *s; + static volatile uint8_t rx4Buffer[UART4_RX_BUFFER_SIZE]; + static volatile uint8_t tx4Buffer[UART4_TX_BUFFER_SIZE]; + NVIC_InitTypeDef NVIC_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + + s = &uartPort4; + s->port.vTable = uartVTable; + + s->port.baudRate = baudRate; + + s->port.rxBufferSize = UART4_RX_BUFFER_SIZE; + s->port.txBufferSize = UART4_TX_BUFFER_SIZE; + s->port.rxBuffer = rx4Buffer; + s->port.txBuffer = tx4Buffer; + + s->USARTx = UART4; + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = (options & SERIAL_INVERTED) ? GPIO_PuPd_DOWN : GPIO_PuPd_UP; + + if (options & SERIAL_BIDIR) { + GPIO_InitStructure.GPIO_Pin = UART4_TX_PIN; + GPIO_InitStructure.GPIO_OType = (options & SERIAL_INVERTED) ? GPIO_OType_PP : GPIO_OType_OD; + GPIO_PinAFConfig(UART4_GPIO, UART4_TX_PINSOURCE, UART4_GPIO_AF); + GPIO_Init(UART4_GPIO, &GPIO_InitStructure); + if(!(options & SERIAL_INVERTED)) + GPIO_SetBits(UART4_GPIO, UART4_TX_PIN); // OpenDrain output should be inactive + } else { + if (mode & MODE_TX) { + GPIO_InitStructure.GPIO_Pin = UART4_TX_PIN; + GPIO_PinAFConfig(UART4_GPIO, UART4_TX_PINSOURCE, UART4_GPIO_AF); + GPIO_Init(UART4_GPIO, &GPIO_InitStructure); + } + + if (mode & MODE_RX) { + GPIO_InitStructure.GPIO_Pin = UART4_RX_PIN; + GPIO_PinAFConfig(UART4_GPIO, UART4_RX_PINSOURCE, UART4_GPIO_AF); + GPIO_Init(UART4_GPIO, &GPIO_InitStructure); + } + } + + NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_PRIORITY_BASE(NVIC_PRIO_SERIALUART4); + NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_PRIORITY_SUB(NVIC_PRIO_SERIALUART4); + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + return s; +} +#endif + +#ifdef USE_USART5 +uartPort_t *serialUSART5(uint32_t baudRate, portMode_t mode, portOptions_t options) +{ + uartPort_t *s; + static volatile uint8_t rx5Buffer[UART5_RX_BUFFER_SIZE]; + static volatile uint8_t tx5Buffer[UART5_TX_BUFFER_SIZE]; + NVIC_InitTypeDef NVIC_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + + s = &uartPort5; + s->port.vTable = uartVTable; + + s->port.baudRate = baudRate; + + s->port.rxBufferSize = UART5_RX_BUFFER_SIZE; + s->port.txBufferSize = UART5_TX_BUFFER_SIZE; + s->port.rxBuffer = rx5Buffer; + s->port.txBuffer = tx5Buffer; + + s->USARTx = UART5; + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = (options & SERIAL_INVERTED) ? GPIO_PuPd_DOWN : GPIO_PuPd_UP; + + if (options & SERIAL_BIDIR) { + GPIO_InitStructure.GPIO_Pin = UART5_TX_PIN; + GPIO_InitStructure.GPIO_OType = (options & SERIAL_INVERTED) ? GPIO_OType_PP : GPIO_OType_OD; + GPIO_PinAFConfig(UART5_GPIO, UART5_TX_PINSOURCE, UART5_GPIO_AF); + GPIO_Init(UART5_GPIO, &GPIO_InitStructure); + if(!(options & SERIAL_INVERTED)) + GPIO_SetBits(UART5_GPIO, UART5_TX_PIN); // OpenDrain output should be inactive + } else { + if (mode & MODE_TX) { + GPIO_InitStructure.GPIO_Pin = UART5_TX_PIN; + GPIO_PinAFConfig(UART5_GPIO, UART5_TX_PINSOURCE, UART5_GPIO_AF); + GPIO_Init(UART5_GPIO, &GPIO_InitStructure); + } + + if (mode & MODE_RX) { + GPIO_InitStructure.GPIO_Pin = UART5_RX_PIN; + GPIO_PinAFConfig(UART5_GPIO, UART5_RX_PINSOURCE, UART5_GPIO_AF); + GPIO_Init(UART5_GPIO, &GPIO_InitStructure); + } + } + + NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_PRIORITY_BASE(NVIC_PRIO_SERIALUART5); + NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_PRIORITY_SUB(NVIC_PRIO_SERIALUART5); + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + return s; +} +#endif + static void handleUsartTxDma(uartPort_t *s) { DMA_Cmd(s->txDMAChannel, DISABLE); @@ -424,3 +566,21 @@ void USART3_IRQHandler(void) usartIrqHandler(s); } #endif + +#ifdef USE_USART4 +void UART4_IRQHandler(void) +{ + uartPort_t *s = &uartPort4; + + usartIrqHandler(s); +} +#endif + +#ifdef USE_USART5 +void UART5_IRQHandler(void) +{ + uartPort_t *s = &uartPort5; + + usartIrqHandler(s); +} +#endif