簡體   English   中英

帶有中斷,STM32F4,HAL驅動程序的UART無數據接收

[英]No Data Receiving form UART with Interrupt, STM32F4, HAL drivers

當我通過UART端口從PC(串行監視器)向STM32F4發現板發送請求時,將不會收到信號。 板卡通常應使用之前收到的相同請求進行應答(UART鏡像)。 我使用了一個中斷(沒有DMA)來發送或接收消息。 在中斷服務程序中,已設置了中斷標志。 該標志將在主循環中讀取。 我沒有使用回調函數。

沒有中斷服務(在主循環中只有HAL_UART_Transmit(...)和HAL_UART_Receive(...)),一切正常。 但是我想與中斷通信。

在運行模式下,我在ISR和兩個if語句中啟用了斷點。 我想知道,ISR例程是否存在問題。 但是,ISR例程可以正常工作。 根據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

查看HAL_UART_Receive函數,該函數等待UART_FLAG_RXNE標志,但是您在USART2_IRQHandler清除此標志。通常,當您使用RX中斷時,必須將接收到的數據保存到用戶緩沖區中然后進行解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM