diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 61081d9f0..e57bd10cf 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -99,7 +99,9 @@ void intmoduleSerialStart(const etx_serial_init* params) // init callbacks intmodule_driver.on_receive = params->on_receive; intmodule_driver.on_error = params->on_error; - + + uint32_t baudrate = params->baudrate; + #if !defined(INTMODULE_DMA_STREAM) // IRQ based TX NVIC_InitTypeDef NVIC_InitStructure; @@ -108,6 +110,13 @@ void intmoduleSerialStart(const etx_serial_init* params) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); + + // rco: workaround for high baudrate not supported with + // IRQ based TX. + if (baudrate > 1870000) { + TRACE("limiting baudrate to 1.87 MBit/s"); + baudrate = 1870000; + } #endif GPIO_PinAFConfig(INTMODULE_GPIO, INTMODULE_GPIO_PinSource_TX, INTMODULE_GPIO_AF); @@ -118,12 +127,12 @@ void intmoduleSerialStart(const etx_serial_init* params) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(INTMODULE_GPIO, &GPIO_InitStructure); USART_DeInit(INTMODULE_USART); USART_InitTypeDef USART_InitStructure; - USART_InitStructure.USART_BaudRate = params->baudrate; + USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_Parity = params->parity; USART_InitStructure.USART_StopBits = params->stop_bits; USART_InitStructure.USART_WordLength = params->word_length; diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index ea2bec79b..4a4b357a9 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1448,7 +1448,7 @@ #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5 #define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) -#elif (defined(RADIO_FAMILY_JUMPER_T12) && defined(HARDWARE_INTERNAL_MODULE)) || defined(RADIO_TX12) || defined(RADIO_ZORRO) || defined(RADIO_T8) || defined(RADIO_TPRO) +#elif (defined(RADIO_FAMILY_JUMPER_T12) && defined(HARDWARE_INTERNAL_MODULE)) || defined(RADIO_TX12) || defined(RADIO_T8) || defined(RADIO_TPRO) #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define INTMODULE_RCC_APB1Periph (RCC_APB1Periph_USART3 | RCC_APB1Periph_TIM2) #define INTMODULE_RCC_APB2Periph 0