找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 286|回復: 1
打印 上一主題 下一主題
收起左側

串口1源碼例程改為空閑中斷求助

[復制鏈接]
跳轉到指定樓層
樓主
ID:792801 發(fā)表于 2025-3-23 12:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
是這樣的,我想將正點原子的例程中里面的串口實驗改為空閑中斷,在例程代碼基礎上修改,串口中斷可以進入但是不能進入空閑中斷的判斷里面,哪位大神能幫忙看一下這個代碼是什么地方有問題導致進入不了空閑中斷還是說這種辦法確實實現不了,感謝,代碼如下,其他的地方都沒有動,加入了__HAL_UART_ENABLE_IT(&g_uart1_handle, UART_IT_IDLE);以及在中斷接收回調函數里面加入一個if判斷語句
void usart_init(uint32_t baudrate)
{
    /*UART 初始化設置*/
    g_uart1_handle.Instance = USART_UX;                                       /* USART_UX */
    g_uart1_handle.Init.BaudRate = baudrate;                                  /* 波特率 */
    g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B;                      /* 字長為8位數據格式 */
    g_uart1_handle.Init.StopBits = UART_STOPBITS_1;                           /* 一個停止位 */
    g_uart1_handle.Init.Parity = UART_PARITY_NONE;                            /* 無奇偶校驗位 */
    g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;                      /* 無硬件流控 */
    g_uart1_handle.Init.Mode = UART_MODE_TX_RX;                               /* 收發(fā)模式 */
    HAL_UART_Init(&g_uart1_handle);                                           /* HAL_UART_Init()會使能UART1 */

    /* 該函數會開啟接收中斷:標志位UART_IT_RXNE,并且設置接收緩沖以及接收緩沖接收最大數據量 */
    HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
        __HAL_UART_ENABLE_IT(&g_uart1_handle, UART_IT_IDLE);
}

/**
* @brief       UART底層初始化函數
* @param       huart: UART句柄類型指針
* @note        此函數會被HAL_UART_Init()調用
*              完成時鐘使能,引腳配置,中斷配置
* @retval      無
*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    GPIO_InitTypeDef gpio_init_struct;

    if (huart->Instance == USART_UX)                            /* 如果是串口1,進行串口1 MSP初始化 */
    {
        USART_TX_GPIO_CLK_ENABLE();                             /* 使能串口TX腳時鐘 */
        USART_RX_GPIO_CLK_ENABLE();                             /* 使能串口RX腳時鐘 */
        USART_UX_CLK_ENABLE();                                  /* 使能串口時鐘 */

        gpio_init_struct.Pin = USART_TX_GPIO_PIN;               /* 串口發(fā)送引腳號 */
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 復用推挽輸出 */
        gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* IO速度設置為高速 */
        HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct);

        gpio_init_struct.Pin = USART_RX_GPIO_PIN;               /* 串口RX腳 模式設置 */
        gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;   
        HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct);   /* 串口RX腳 必須設置成輸入模式 */

#if USART_EN_RX
        HAL_NVIC_EnableIRQ(USART_UX_IRQn);                      /* 使能USART1中斷通道 */
        HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3);              /* 組2,最低優(yōu)先級:搶占優(yōu)先級3,子優(yōu)先級3 */
#endif
    }
}

/**
* @brief       串口數據接收回調函數
                數據處理在這里進行
* @param       huart:串口句柄
* @retval      無
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        static uint16_t len = 0;
    if (huart->Instance == USART_UX)                    /* 如果是串口1 */
    {
                if (len < USART_REC_LEN)
                {
                        g_usart_rx_buf[len] = g_rx_buffer[0];
                        len++;
                }
                else
                        len = 0;
                if (__HAL_UART_GET_FLAG(&g_uart1_handle, UART_FLAG_IDLE) != RESET)
                {
                        __HAL_UART_CLEAR_FLAG(&g_uart1_handle, UART_FLAG_IDLE);
                        g_usart_rx_sta = len;
                        len = 0;
                        printf("OK");
                }
        HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
    }
        if (__HAL_UART_GET_FLAG(&g_uart1_handle, UART_FLAG_IDLE) != RESET)
                {
                        __HAL_UART_CLEAR_FLAG(&g_uart1_handle, UART_FLAG_IDLE);
                        g_usart_rx_sta = len;
                        len = 0;
                        printf("OK");
                }
}

/**
* @brief       串口1中斷服務函數
* @param       無
* @retval      無
*/
void USART_UX_IRQHandler(void)
{
#if SYS_SUPPORT_OS                          /* 使用OS */
    OSIntEnter();   
#endif

    HAL_UART_IRQHandler(&g_uart1_handle);   /* 調用HAL庫中斷處理公用函數 */

#if SYS_SUPPORT_OS                          /* 使用OS */
    OSIntExit();
#endif

}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:554658 發(fā)表于 2025-3-31 17:51 | 只看該作者
不應該在串口數據接收中斷處理函數HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)中判斷空閑中斷,應該在USART_UX_IRQHandler(void)函數中判斷
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表