久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:792801 發表于 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;                               /* 收發模式 */
    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;               /* 串口發送引腳號 */
        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,最低優先級:搶占優先級3,子優先級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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩精品久久 | 国产精品久久久亚洲 | 狠狠狠干| 精品一区二区电影 | 国产精品成人久久久久 | 精品久久国产老人久久综合 | 精品国产乱码久久久久久88av | 久久精品免费观看 | 国产精品揄拍一区二区久久国内亚洲精 | 亚洲性人人天天夜夜摸 | 免费骚视频| 99国内精品久久久久久久 | 玖草资源 | 99色视频| 亚洲精品永久免费 | 久久99这里只有精品 | 久久草视频 | 久久这里只有 | 色综合一区二区三区 | 美女一区二区在线观看 | 日韩一区二区视频 | 国产精品波多野结衣 | 天天插天天干 | 日韩av看片 | 亚洲人成人网 | 精品国产高清一区二区三区 | 亚洲免费影院 | 亚洲精品久久久一区二区三区 | 久久综合狠狠综合久久综合88 | 亚洲成人免费视频在线 | 综合另类| 欧美成人精品一区二区男人看 | 日韩av成人在线 | 欧美日韩综合 | 在线三级网址 | 欧美 日韩 中文 | 久久一区二区三区四区 | 黄一区二区三区 | 国产乱肥老妇国产一区二 | 龙珠z国语版在线观看 | 国产一区高清 |