没有数据接收形式UART带有中断,STM32F4,HAL驱动程序

时间:2017-11-21 18:19:54

标签: interrupt uart stm32f4discovery hal

当我通过UART端口从PC(串行监视器)向STM32F4发现板发送请求时,将不会收到信号。电路板通常应该回答之前收到的相同请求(UART镜像)。我使用了一个中断(没有DMA)来发送或接收消息。在中断服务程序中,设置了中断标志。该标志将在主循环中读取。我没有使用回调函数。

没有中断服务(主循环中只有HAL_UART_Transmit(...)和HAL_UART_Receive(...))一切正常。但是我希望与中断通信。

在RUN模式下,我在ISR和两个if语句中启用了断点。 我想知道,ISR例程是否存在问题。但是ISR Routine应该可行。根据PC的请求,调用ISR和receive if语句。

问题是,接收寄存器保持空白。如果这仍然是空的,控制器将不会发送请求消息。 怎么了?问题出在哪里,能帮助我吗? UART端口的配置是否正确? 谢谢你的帮助和帮助支持!

volatile enum RxStates {
UART_RX, DUMMY_RX, WAIT_RX
} stateRx;

volatile enum TxStates {
    UART_TX_READY, DUMMY_TX, WAIT_TX
} stateTx;


static UART_HandleTypeDef s_UARTHandle;
GPIO_InitTypeDef GPIOC2_InitStruct;     //GPIO

uint8_t empfang[8];                     //buffer


void UART_ini(void) 
{
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __USART2_CLK_ENABLE();

//PIN TX
    GPIOC2_InitStruct.Pin = GPIO_PIN_2;
    GPIOC2_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIOC2_InitStruct.Alternate = GPIO_AF7_USART2;
    GPIOC2_InitStruct.Speed = GPIO_SPEED_FAST;
    GPIOC2_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOA, &GPIOC2_InitStruct);

//PIN RX
    GPIOC2_InitStruct.Pin = GPIO_PIN_3;
    GPIOC2_InitStruct.Mode = GPIO_MODE_AF_OD;
    HAL_GPIO_Init(GPIOA, &GPIOC2_InitStruct);

//USART2
    s_UARTHandle.Instance = USART2;
    s_UARTHandle.Init.BaudRate = 9600;
    s_UARTHandle.Init.WordLength = UART_WORDLENGTH_8B;
    s_UARTHandle.Init.StopBits = UART_STOPBITS_1;
    s_UARTHandle.Init.Parity = UART_PARITY_NONE;
    s_UARTHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    s_UARTHandle.Init.Mode = UART_MODE_TX_RX;
    HAL_UART_Init(&s_UARTHandle);

    __HAL_UART_ENABLE_IT(&s_UARTHandle, UART_IT_RXNE | UART_IT_TC);

    HAL_NVIC_SetPriority(USART2_IRQn, 15, 15);
    HAL_NVIC_EnableIRQ(USART2_IRQn);               // Enable Interrupt

}//UART


int main(int argc, char* argv[]) 
{

//initialization of the interrupt flags
    stateRx = WAIT_RX;
    stateTx = WAIT_TX;

    UART_ini(); //initialization UART

    while (1) 
    {
//receive interrupt flag
        if (stateRx == UART_RX) 
        {
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);    //set LED
            HAL_UART_Receive(&s_UARTHandle, empfang, 2, 10000000);  //receive message

            stateRx = WAIT_RX;                                      //RESET flag
        }

//transmit interrupt flag
        if (stateTx == UART_TX_READY) 
        {
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);    //set LED
            HAL_UART_Transmit(&s_UARTHandle, empfang, 2, 10000);    //send message

            stateTx = WAIT_TX;                                      //RESET flag
        }

//RESET LED
        if (stateTx != UART_TX_READY && stateRx != UART_RX)         
        {
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, RESET);           //RESET LED
        }

    }//while
}//main


void USART2_IRQHandler() 
{

    if (__HAL_UART_GET_FLAG(&s_UARTHandle, UART_FLAG_RXNE) == SET) 
    {
        __HAL_UART_CLEAR_FLAG(&s_UARTHandle, UART_FLAG_RXNE);       //clear ISR flag
        stateRx = UART_RX;                                          //set RX flag
    }

    if (__HAL_UART_GET_FLAG(&s_UARTHandle, UART_FLAG_TC) == SET) 
    {
        __HAL_UART_CLEAR_FLAG(&s_UARTHandle, UART_FLAG_TC);         //clear ISR flag
        stateTx = UART_TX_READY;                                    //set TX flag
    }
}//ISR

//EOF

1 个答案:

答案 0 :(得分:0)

查看HAL_UART_Receive函数,此函数等待UART_FLAG_RXNE标志,但您在USART2_IRQHandler中清除此标记 通常,当您使用RX中断时,您必须将接收的数据保存到用户缓冲区中,然后解析它。