国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32_HAL庫(kù)串口接收相關(guān)函數(shù)分析

這篇具有很好參考價(jià)值的文章主要介紹了STM32_HAL庫(kù)串口接收相關(guān)函數(shù)分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

STM32_HAL庫(kù)串口接收相關(guān)函數(shù)分析:


串口接收的程序整體分為三個(gè)部分:初始化部分,開(kāi)啟中斷部分,中斷函數(shù)部分:


  • 初始化部分:
    該部分主要完成相關(guān)引腳的初始化,串口的初始化(設(shè)置波特率,校驗(yàn)位,字長(zhǎng)等),為了邏輯清晰,把初始化相關(guān)代碼放在本文的最后。

  • 開(kāi)啟中斷部分:
    調(diào)用HAL_UART_Receive_IT函數(shù),開(kāi)啟中斷,這個(gè)函數(shù)原型如下:
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

第一個(gè)參數(shù)是串口句柄,第二個(gè)參數(shù)指向自定義的接收緩沖數(shù)組,第三個(gè)參數(shù)很重要,它的值被賦給串口句柄的RxXferCount成員,規(guī)定了接收到幾個(gè)數(shù)據(jù)幀之后,會(huì)調(diào)用接收回調(diào)函數(shù)HAL_UART_RxCpltCallback,詳見(jiàn)下文。


  • 中斷函數(shù)部分:中斷函數(shù)部分主要位兩個(gè)函數(shù):中斷函數(shù)和回調(diào)函數(shù)
    以USART1的中斷函數(shù)為例:

當(dāng)調(diào)用HAL_UART_Receive_IT之后每次接收到一個(gè)字節(jié)的數(shù)據(jù)就會(huì)觸發(fā)USART1_IRQHandler中斷,USART1_IRQHandler中需要調(diào)用串口外設(shè)公用的中斷函數(shù)HAL_UART_IRQHandler,給其傳入初始化時(shí)使用的串口句柄g_uart1_handle。

在HAL_UART_IRQHandler內(nèi)部會(huì)判斷此次的中斷源,如果判斷出來(lái)是接收中斷(此中斷在HAL_UART_Receive_IT中已被開(kāi)啟),則調(diào)用另外一個(gè)HAL庫(kù)函數(shù)UART_Receive_IT,在該函數(shù)中會(huì)使串口句柄的RxXferCount成員遞減一,如果遞減一之后,RxXferCount變?yōu)榱懔耍瑒t關(guān)閉接收中斷,清除相關(guān)標(biāo)志位,調(diào)用回調(diào)函數(shù)HAL_UART_RxCpltCallback,否則函數(shù)直接返回。

可見(jiàn),RxXferCount的初始值決定了在接收幾個(gè)字節(jié)之后會(huì)調(diào)用回調(diào)函數(shù),上文提到過(guò),它的初始值由HAL_UART_Receive_IT的第三個(gè)參數(shù)決定。在實(shí)際應(yīng)用中,一般讓RxXferCount等于一即每接收到一個(gè)字節(jié),就調(diào)用一次回調(diào)函數(shù)。由于每次調(diào)用回調(diào)函數(shù)之后,都會(huì)關(guān)閉接收中斷(上一段提到過(guò)),所以再USART1_IRQHandler要再次開(kāi)啟中斷,為接收下一個(gè)字節(jié)做準(zhǔn)備

串口中斷函數(shù):

void USART1_IRQHandler(void)
{
	HAL_UART_IRQHandler(&g_uart1_handle);/*串口公共中斷函數(shù)*/
	HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, 1);/*再次開(kāi)啟中斷*/
}

串口接收回調(diào)函數(shù):(RxXferCount==0時(shí)才會(huì)調(diào)用)

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	/*通過(guò)讀取自定義的g_rx_buffer[0]獲取此次接收的字符,然后在此回調(diào)函數(shù)中確定回調(diào)行為*/
}

初始化相關(guān)的代碼:

#define USART_TX_GPIO_PORT                  GPIOA
#define USART_TX_GPIO_PIN                   GPIO_PIN_9
#define USART_TX_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)   /* PA口時(shí)鐘使能 */

#define USART_RX_GPIO_PORT                  GPIOA
#define USART_RX_GPIO_PIN                   GPIO_PIN_10
#define USART_RX_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)   /* PA口時(shí)鐘使能 */

#define USART_UX                            USART1
#define USART_UX_IRQn                       USART1_IRQn
#define USART_UX_IRQHandler                 USART1_IRQHandler
#define USART_UX_CLK_ENABLE()               do{ __HAL_RCC_USART1_CLK_ENABLE(); }while(0)  /* USART1 時(shí)鐘使能 */

/******************************************************************************************/

#define USART_REC_LEN               200         /* 定義最大接收字節(jié)數(shù) 200 */
#define USART_EN_RX                 1           /* 使能(1)/禁止(0)串口1接收 */
#define RXBUFFERSIZE   1                        /* 緩存大小 */

extern UART_HandleTypeDef g_uart1_handle;       /* HAL UART句柄 */

extern uint8_t  g_usart_rx_buf[USART_REC_LEN];  /* 接收緩沖,最大USART_REC_LEN個(gè)字節(jié).末字節(jié)為換行符 */
extern uint16_t g_usart_rx_sta;                 /* 接收狀態(tài)標(biāo)記 */
extern uint8_t g_rx_buffer[RXBUFFERSIZE];       /* HAL庫(kù)USART接收Buffer */
/******************************************************************************************/
/* 加入以下代碼, 支持printf函數(shù), 而不需要選擇use MicroLIB */

#if 1

#if (__ARMCC_VERSION >= 6010050)            /* 使用AC6編譯器時(shí) */
__asm(".global __use_no_semihosting\n\t");  /* 聲明不使用半主機(jī)模式 */
__asm(".global __ARM_use_no_argv \n\t");    /* AC6下需要聲明main函數(shù)為無(wú)參數(shù)格式,否則部分例程可能出現(xiàn)半主機(jī)模式 */

#else
/* 使用AC5編譯器時(shí), 要在這里定義__FILE 和 不使用半主機(jī)模式 */
#pragma import(__use_no_semihosting)

struct __FILE
{
    int handle;
    /* Whatever you require here. If the only file you are using is */
    /* standard output using printf() for debugging, no file handling */
    /* is required. */
};

#endif

/* 不使用半主機(jī)模式,至少需要重定義_ttywrch\_sys_exit\_sys_command_string函數(shù),以同時(shí)兼容AC6和AC5模式 */
int _ttywrch(int ch)
{
    ch = ch;
    return ch;
}

/* 定義_sys_exit()以避免使用半主機(jī)模式 */
void _sys_exit(int x)
{
    x = x;
}

char *_sys_command_string(char *cmd, int len)
{
    return NULL;
}


/* FILE 在 stdio.h里面定義. */
FILE __stdout;

/* MDK下需要重定義fputc函數(shù), printf函數(shù)最終會(huì)通過(guò)調(diào)用fputc輸出字符串到串口 */
int fputc(int ch, FILE *f)
{
    while ((USART_UX->SR & 0X40) == 0);     /* 等待上一個(gè)字符發(fā)送完成 */

    USART_UX->DR = (uint8_t)ch;             /* 將要發(fā)送的字符 ch 寫(xiě)入到DR寄存器 */
    return ch;
}
#endif
/******************************************************************************************/

#if USART_EN_RX /*如果使能了接收*/

/* 接收緩沖, 最大USART_REC_LEN個(gè)字節(jié). */
uint8_t g_usart_rx_buf[USART_REC_LEN];

/*  接收狀態(tài)
 *  bit15,      接收完成標(biāo)志
 *  bit14,      接收到0x0d
 *  bit13~0,    接收到的有效字節(jié)數(shù)目
*/
uint16_t g_usart_rx_sta = 0;

uint8_t g_rx_buffer[RXBUFFERSIZE];  /* HAL庫(kù)使用的串口接收緩沖 */

UART_HandleTypeDef g_uart1_handle;  /* UART句柄 */

/**
 * @brief       串口X初始化函數(shù)
 * @param       baudrate: 波特率, 根據(jù)自己需要設(shè)置波特率值
 * @note        注意: 必須設(shè)置正確的時(shí)鐘源, 否則串口波特率就會(huì)設(shè)置異常.
 *              這里的USART的時(shí)鐘源在sys_stm32_clock_init()函數(shù)中已經(jīng)設(shè)置過(guò)了.
 * @retval      無(wú)
 */
void usart_init(uint32_t baudrate)
{
    /*UART 初始化設(shè)置*/
    g_uart1_handle.Instance = USART_UX;                                       /* USART_UX */
    g_uart1_handle.Init.BaudRate = baudrate;                                  /* 波特率 */
    g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B;                      /* 字長(zhǎng)為8位數(shù)據(jù)格式 */
    g_uart1_handle.Init.StopBits = UART_STOPBITS_1;                           /* 一個(gè)停止位 */
    g_uart1_handle.Init.Parity = UART_PARITY_NONE;                            /* 無(wú)奇偶校驗(yàn)位 */
    g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;                      /* 無(wú)硬件流控 */
    g_uart1_handle.Init.Mode = UART_MODE_TX_RX;                               /* 收發(fā)模式 */
    HAL_UART_Init(&g_uart1_handle);                                           /* HAL_UART_Init()會(huì)使能UART1 */

    /* 該函數(shù)會(huì)開(kāi)啟接收中斷:清除標(biāo)志位UART_IT_RXNE,并且設(shè)置接收緩沖以及接收緩沖接收最大數(shù)據(jù)量 */
    HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); 
}

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

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

        gpio_init_struct.Pin = USART_TX_GPIO_PIN;               /* 串口發(fā)送引腳號(hào) */
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 復(fù)用推挽輸出 */
        gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* IO速度設(shè)置為高速 */
        HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct);
                
        gpio_init_struct.Pin = USART_RX_GPIO_PIN;               /* 串口RX腳 模式設(shè)置 */
        gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;    
        HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct);   /* 串口RX腳 必須設(shè)置成輸入模式 */
        
#if USART_EN_RX
        HAL_NVIC_EnableIRQ(USART_UX_IRQn);                      /* 使能USART1中斷通道 */
        HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3);              /* 組2,最低優(yōu)先級(jí):搶占優(yōu)先級(jí)3,子優(yōu)先級(jí)3 */
#endif
    }
}

參考文獻(xiàn):《正點(diǎn)原子_HAL庫(kù)開(kāi)發(fā)指南》文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-595554.html

到了這里,關(guān)于STM32_HAL庫(kù)串口接收相關(guān)函數(shù)分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【STM32】HAL庫(kù) 串口中斷發(fā)送與接收

    【STM32】HAL庫(kù) 串口中斷發(fā)送與接收

    【STM32】HAL庫(kù) 新建MDK工程 【STM32】HAL庫(kù) 串口輪詢發(fā)送 使用stm32串口中斷發(fā)送和中斷接收 在主函數(shù)前開(kāi)啟中斷,接受字節(jié)數(shù)為5 接受5個(gè)字節(jié)后,進(jìn)入中斷接收完成回調(diào)函數(shù),重新再開(kāi)啟中斷,并把接收到的數(shù)據(jù)返回 修改接收數(shù)組長(zhǎng)度,改為開(kāi)啟串口空閑中斷 接收事件回調(diào)函數(shù)

    2024年02月08日
    瀏覽(31)
  • [015] [STM32] IIC協(xié)議詳解與HAL庫(kù)相關(guān)函數(shù)分析

    [015] [STM32] IIC協(xié)議詳解與HAL庫(kù)相關(guān)函數(shù)分析

    IIC(Inter Integrated Circuit)總線在物理層由SDA(Serial data, 串行數(shù)據(jù)線)、SCL(Serial clock line,串行時(shí)鐘線)和上拉電阻組成。 每個(gè)連接到總線的設(shè)備都 有一個(gè)獨(dú)立的地址 ,主機(jī)可以利用此地址進(jìn)行不同設(shè)備之間的訪問(wèn) 連接到相同總線的 IC 數(shù)量受到總線的最大電容 400pF 限制 為了避

    2023年04月08日
    瀏覽(19)
  • 【STM32】HAL庫(kù) STM32CubeMX——DMA (串口DMA發(fā)送接收)

    【STM32】HAL庫(kù) STM32CubeMX——DMA (串口DMA發(fā)送接收)

    軟件: STM32CubeMX KEIL5 mcuisp 串口通信助手 硬件: STM32F103C8Tx 杜邦線,面包板,USB轉(zhuǎn)TTL DMA,全稱Direct Memory Access,即直接存儲(chǔ)器訪問(wèn)。 DMA傳輸將數(shù)據(jù)從一個(gè)地址空間復(fù)制到另一個(gè)地址空間,提供在外設(shè)和存儲(chǔ)器之間或者存儲(chǔ)器和存儲(chǔ)器之間的高速數(shù)據(jù)傳輸。 我們知道系統(tǒng)的運(yùn)

    2024年02月12日
    瀏覽(24)
  • 【STM32】HAL庫(kù)——串口中斷只接收到兩個(gè)字符

    環(huán)境:STM32CubeMX(6.7.0)+MDK-ARM(V5.36.0.0)+STM32F103C8T6 使用XCOM發(fā)送字符串(總共8個(gè)字符),單片機(jī)進(jìn)行解析為ModBus協(xié)議失敗,只接收到前兩個(gè)字節(jié)的數(shù)據(jù)。 原串口中斷回調(diào)函數(shù): 去掉串口中斷回調(diào)函數(shù)的printf函數(shù)即可 在嵌入式系統(tǒng)中,將printf函數(shù)直接放在串口中斷服務(wù)程序(ISR)中

    2024年01月22日
    瀏覽(23)
  • STM32 HAL庫(kù)串口突然不再接收數(shù)據(jù)的異常情況

    STM32串口接收分為阻塞式接收和中斷式接收。 1、中斷+DMA接收 出現(xiàn)突然不再接收數(shù)據(jù)的異常情況,最有可能的情況為ORE錯(cuò)誤和BUSY標(biāo)志位持續(xù)置高。 解決方法:在重新打開(kāi)中斷接收前,使用__HAL_UART_CLEAR_OREFLAG(huart);函數(shù)清除ORE錯(cuò)誤;如果串口中斷重新接收打開(kāi)頻繁且間隔短的話

    2024年02月13日
    瀏覽(25)
  • 【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收

    【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收

    目錄 ? 總覽 使用CUBEMX創(chuàng)建工程的基本配置 CUBEMX中的配置 Keil中的配置 實(shí)物連接 串口輪詢模式 輪詢模式HAL庫(kù)函數(shù) 特點(diǎn) 實(shí)驗(yàn)一:發(fā)送數(shù)據(jù)給單片機(jī)并讓其返回相同值 串口重定向 串口中斷模式 在CUBEMX中打開(kāi)串口中斷 中斷模式HAL庫(kù)函數(shù) 特點(diǎn) 實(shí)驗(yàn)二:使用中斷回調(diào)完成實(shí)驗(yàn)一

    2024年04月10日
    瀏覽(44)
  • 【STM32 HAL庫(kù)實(shí)戰(zhàn)】串口DMA + 空閑中斷 實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收

    【STM32 HAL庫(kù)實(shí)戰(zhàn)】串口DMA + 空閑中斷 實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收

    STM32CubeMX最新版: 打開(kāi)STM32CubeMX軟件,點(diǎn)擊ACCESS TO MCU SELECTOR,在Commercial Part Number 中輸入MCU型號(hào),例如我在這里輸入了STM32L431RCT6。選中正確型號(hào)然后雙擊進(jìn)入下一步的配置界面。 1.1 SYS配置如圖 1.2 RCC配置如圖 開(kāi)啟了外部晶振,若無(wú)則都選擇Disable 1.3 USART1配置 NVIC Settings 注意

    2024年02月03日
    瀏覽(38)
  • 基于STM32CubeIDE HAL庫(kù)利用基本定時(shí)器實(shí)現(xiàn)串口接收不定長(zhǎng)數(shù)據(jù)

    基于STM32CubeIDE HAL庫(kù)利用基本定時(shí)器實(shí)現(xiàn)串口接收不定長(zhǎng)數(shù)據(jù)

    ?申明:本文章僅發(fā)表在 CSDN 網(wǎng)站,任何其他網(wǎng)見(jiàn)此內(nèi)容均為盜鏈和爬取,請(qǐng)多多尊重和支持原創(chuàng)! ??對(duì)于文中所提供的相關(guān)資源鏈接將作不定期更換。 ??相關(guān)參考《HAL庫(kù)教程9:串口接收不定長(zhǎng)數(shù)據(jù)》 ??對(duì)于串口接收不定長(zhǎng)數(shù)據(jù)的處理方案網(wǎng)上有很多,個(gè)人覺(jué)得采用定時(shí)

    2024年02月09日
    瀏覽(29)
  • STM32 串口接收不定長(zhǎng)數(shù)據(jù) HAL_UART_Receive_IT (幀頭幀尾)

    最近使用sw4stm32調(diào)試串口時(shí)發(fā)現(xiàn)串口接收不定長(zhǎng)數(shù)據(jù)很不方便,這里是幀頭幀尾的接收方式,歡迎大佬指導(dǎo)。 這里要用串口中斷接收的數(shù)據(jù)幀幀頭為0xEB,幀尾為0XBE 這里是其中定義的變量? 主函數(shù)里打開(kāi)串口接收中斷 然后串口接收處理部分全都寫(xiě)在的回調(diào)函數(shù)中。

    2024年01月19日
    瀏覽(31)
  • STM32 HAL庫(kù)的串口中斷服務(wù)函數(shù)詳解

    STM32 HAL庫(kù)的串口中斷服務(wù)函數(shù)詳解

    最近在實(shí)現(xiàn)利用上位機(jī)通過(guò)串口發(fā)送指令給下位機(jī)執(zhí)行操作的實(shí)驗(yàn),在之前學(xué)習(xí)串口的過(guò)程中我就一直有一個(gè)疑惑,那就是為什么在串口中斷回調(diào)函數(shù)內(nèi)除了要加上自己的操作以外還要在末尾再執(zhí)行一次 接收中斷 ,在查閱了一些資料后我才發(fā)現(xiàn)原來(lái)和 中斷服務(wù)函數(shù) 有關(guān) 我

    2024年02月10日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包