1

I don't understand what is wrong with the following code. All is correct for transmit but for the receive the interrupt isn't called.

The oscilloscope shows me correct send and receive data.

enter image description here

#define CONSOLE_RXD_PIN   12
#define CONSOLE_TXD_PIN   11

static USART_InitTypeDef ConsoleUartConfig = {CONSOLE_BAUD_RATE, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, USART_Mode_Rx | USART_Mode_Tx, USART_HardwareFlowControl_None};
static GPIO_InitTypeDef HAL_TXDGpioConfiguration  =  {(1 << CONSOLE_TXD_PIN), GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL};
static GPIO_InitTypeDef HAL_RXDGpioConfiguration  =  {(1 << CONSOLE_RXD_PIN), GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_UP};


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);   
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

GPIO_Init(GPIOA, (GPIO_InitTypeDef *)&HAL_TXDGpioConfiguration);
GPIO_PinAFConfig(GPIOA, CONSOLE_TXD_PIN, CONSOLE_UART_GPIO_AF);
GPIO_Init(GPIOA, (GPIO_InitTypeDef *)&HAL_RXDGpioConfiguration);
GPIO_PinAFConfig(GPIOA, CONSOLE_RXD_PIN, CONSOLE_UART_GPIO_AF);

USART_Init(USART6, &ConsoleUartConfig);

USART_ITConfig(USART6, USART_IT_TXE, ENABLE);
USART_ITConfig(USART6, USART_IT_RXNE, ENABLE); 


NVIC_InitStruct.NVIC_IRQChannel = USART6_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);

USART_Cmd(HAL_UartContext.Base, ENABLE);

It is a stm32f413Z nucleo board.

UPDATE: I tried the same with the HAL but here the function USART6_IRQHandler is also not called for the rx.

    HAL_Init();

__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART6_CLK_ENABLE();

#define CONSOLE_TXD_PIN   LL_GPIO_PIN_11

/* Configure Tx Pin as : Alternate function, High Speed, Push pull, Pull up */
LL_GPIO_SetPinSpeed(GPIOA, CONSOLE_TXD_PIN, LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinOutputType(GPIOA, CONSOLE_TXD_PIN, LL_GPIO_PULL_NO);
LL_GPIO_SetPinPull(GPIOA, CONSOLE_TXD_PIN, LL_GPIO_PULL_UP);
LL_GPIO_SetPinMode(GPIOA, CONSOLE_TXD_PIN, LL_GPIO_MODE_ALTERNATE);     
LL_GPIO_SetAFPin_8_15(GPIOA, CONSOLE_TXD_PIN, LL_GPIO_AF_8);

#define CONSOLE_RXD_PIN   LL_GPIO_PIN_12

/* Configure Rx Pin as : Alternate function, High Speed, Push pull, Pull up */
LL_GPIO_SetPinSpeed(GPIOA, CONSOLE_RXD_PIN, LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinOutputType(GPIOA, CONSOLE_RXD_PIN, LL_GPIO_OUTPUT_PUSHPULL);
LL_GPIO_SetPinPull(GPIOA, CONSOLE_RXD_PIN, LL_GPIO_PULL_NO);
LL_GPIO_SetPinMode(GPIOA, CONSOLE_RXD_PIN, LL_GPIO_MODE_ALTERNATE);     
LL_GPIO_SetAFPin_8_15(GPIOA, CONSOLE_RXD_PIN, LL_GPIO_AF_8);

NVIC_SetPriority(USART6_IRQn, 0);  
NVIC_EnableIRQ(USART6_IRQn);
LL_USART_EnableIT_TXE(USART6);
LL_USART_EnableIT_RXNE(USART6);
LL_USART_SetTransferDirection(USART6, LL_USART_DIRECTION_TX_RX);

/* 8 data bit, 1 start bit, 1 stop bit, no parity */
LL_USART_ConfigCharacter(USART6, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1);
LL_USART_SetHWFlowCtrl(USART6, LL_USART_HWCONTROL_NONE);

/* Reset value is LL_USART_OVERSAMPLING_16 */
LL_USART_SetOverSampling(USART6, LL_USART_OVERSAMPLING_16);

const uint32_t pclk = __LL_RCC_CALC_PCLK2_FREQ(SystemCoreClock,
    LL_RCC_GetAPB2Prescaler());

LL_USART_SetBaudRate(USART6, pclk, LL_USART_OVERSAMPLING_16, 9600); 

LL_USART_Enable(USART6);

Here is the interrupt routine:

void USART6_IRQHandler(void)
{
    uint32_t stateflg;

    if (LL_USART_IsActiveFlag_RXNE(USART6) || LL_USART_IsActiveFlag_ORE(USART6))
    {
        LL_USART_ReceiveData8(USART6);
    }
    if (LL_USART_IsActiveFlag_TXE(USART6))
    {
        uint8_t data = 0;
    }

}
makurisan
  • 467
  • 3
  • 13

1 Answers1

0

The normal init structure for the GPIO pins looks like:

typedef struct
{
    uint32_t GPIO_Pin;
    GPIOMode_TypeDef GPIO_Mode;
    GPIOSpeed_TypeDef GPIO_Speed;
    GPIOOType_TypeDef GPIO_OType;
    GPIOPuPd_TypeDef GPIO_PuPd;
} GPIO_InitTypeDef;

So this did not match with your initialization. The first parameter should be the pin you are using.

Generally it would be better not to use this kind of initialization, since you could easily change parameter position. If your compiler is not to old, you could use the "named" way like:

static GPIO_InitTypeDef HAL_TXDGpioConfiguration  =  {
    .GPIO_Pin = GPIO_Pin_9,

Additional:

USART_ITConfig(GPIOA, USART_IT_TXE, ENABLE);
USART_ITConfig(GPIOA, USART_IT_RXNE, ENABLE);

should be

USART_ITConfig(USART6, USART_IT_TXE, ENABLE);
USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
theSealion
  • 1,082
  • 7
  • 13