STM32F103RC使用HAL庫配置USART進行數據收發

目錄

STM32F103RC使用HAL庫配置USART進行數據收發(代碼模塊)

一、USART初始化

二、USART使用的GPIO初始化

三、USART的接收中斷配置

四、USART的數據發送

五、補充


STM32F103RC使用HAL庫配置USART進行數據收發(代碼模塊)

一、USART初始化

UART_HandleTypeDef  huart1;
uint8_t Rdata;
?
void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BandRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;if(HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}#if 1HAL_UART_Receive_IT(&huart1,&Rdata,1);      //使能接收中斷,會進入回調函數#else__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); //直接使能串口接收中斷,不會進入回調函數#endif
}                   

二、USART使用的GPIO初始化

UART使用的GPIO初始化函數是在void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)函數中:
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) ? ?
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(uartHandle->Instance == USART1){__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_AFIO_CLK_ENABLE();//PA9(USART1_TX)    GPIO_InitStruct.Pin = USART1_TX_Pin;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; ?GPIO_InitStruct.Pull = GPIO_NOPULL; ? ? ?HAL_GPIO_Init(USART1_TX_GPIO_Port,&GPIO_InitStruct); //PA10(USART1_RX)GPIO_InitStruct.Pin = USART1_RX_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL; ? ?HAL_GPIO_Init(USART1_RX_GPIO_Port,&GPIO_InitStruct); ? ?HAL_NVIC_SetPriority(USART1_IRQn,0,0);HAL_NVIC_EnableIRQ(USART1_IRQn);}
}

三、USART的接收中斷配置

USART的接收中斷的配置有兩種方式,以下簡要介紹下兩種配置方式的不同。1、使用串口接收中斷回調函數  2、不使用串口接收中斷的回調函數
######使用串口接收中斷回調函數時的配置如下:
1、函數MX_USART1_UART_Init的配置
void MX_USART1_UART_Init(void)
{/*//這里是串口的初始化配置*/HAL_UART_Receive_IT(&huart1,&Rdata,1);      //使能接收中斷,會進入回調函數
}   
在函數void MX_USART1_UART_Init(void)中的最后使用HAL_UART_Receive_IT(&huart1,&Rdata,1)進行配置。該函數會使能接收中斷,每當串口接收到1個字節后就會進入回調函數void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)中。
2、串口接收中斷回調函數HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)配置
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){QueueWrite((void *)buf_pc_to_uart,Rdata);   //將串口接收到的數據寫入到隊列中HAL_UART_Receive_IT(&huart1,&Rdata,1);      //接收完1字節后要重新使能接收中斷}
}
在串口接收回調函數中,需要先對接收的數據進行處理,需要注意的是在處理完接收數據后要重新調用HAL_UART_Receive_IT函數使能接收中斷,使得下次接收完數據后能繼續進入回調函數。 
######不使用串口接收中斷回調函數時的配置如下:
1、函數MX_USART1_UART_Init的配置
void MX_USART1_UART_Init(void)
{/*//這里是串口的初始化配置*/__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); //直接使能串口接收中斷,不會進入回調函數
}   
在函數void MX_USART1_UART_Init(void)中的最后使用__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE)進行配置。該函數會使能接收中斷,但是不會進入回調函數void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)中,而是進入
void USART1_IRQHandler(void)中。
2、串口接收中斷函數void USART1_IRQHandler(void)配置
void USART1_IRQHandler(void)
{if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) != RESET){HAL_UART_Receive(&huart1,&Rdata,1,100);QueueWrite((void *)buf_pc_to_uart,Rdata);   //將串口接收到的數據寫入到隊列中__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);}HAL_UART_IRQHandler(&huart1);
}
在串口中斷函數中,和標準庫的處理流程相同,先通過接收中斷標志位是否置1判斷接收中斷是否觸發,觸發后接收數據,對接收到的數據進行處理后,清除接收中斷標志位即可。 

四、USART的數據發送

直接調用HAL庫接口函數
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size,uint32_t Timeout)
或者
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size)即可。 ? ?

五、補充

1、這里介紹的串口配置及串口的收發數據是沒有使用DMA進行傳輸數據的,如果需要進行大數據包傳輸,就需要使用DMA進行數據傳輸了。這時就需要進一步配置DMA的發送或者接收功能了。這里不再介紹,可以自己去網上查找相關資料。
2、以上的配置我們使用的串口接收中斷每次接收1個字節的數據,當需要進行不定長數據或者大數據包的接收時,就不適合采用這種接收方式了,這時可以采用串口空閑中斷+DMA的方式來進行不定長數據或者大數據包的接收。一般配置流程如下:
首先、配置串口,串口GPIO及DMA完成初始化
然后、在串口初始化函數最后調用:
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size)函數,該函數會使能串口的DMA接收并且使能串口的空閑中斷。當接收到一包數據后就會進入回調函數:
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart,uint16_t Size)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44498.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44498.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44498.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaDS —— 棧 Stack 和 隊列 Queue

棧的概念 棧是一種先進后出的線性表,只允許在固定的一端進行插入和刪除操作。 進行插入和刪除操作的一端被稱為棧頂,另一端被稱為棧底 棧的插入操作叫做進棧/壓棧/入棧 棧的刪除操作叫做出棧 現實生活中棧的例子: 棧的模擬實現 下面是Jav…

windows USB 設備驅動程序開發-總線接口查詢

總線接口的查詢 USB 客戶端驅動程序可以獲取對USB總線驅動程序接口的引用,并使用它來訪問總線驅動程序例程,而不是使用 I/O 請求數據包 (IRP) 機制。 使用總線驅動程序接口為客戶端驅動程序提供了幾個優勢: 它可以使用接口的服務&#xff…

對接企業微信API自建應用配置企業可信IP

前言 為了實現系統調用團隊會議功能,組織發起企業微信會議,于是需要和企業微信做API對接。對接過程很難受,文檔不清晰、沒有SDK、沒有技術支持甚至文檔報文和實際接口報文都不匹配,只能說企業微信的API是從業以來見過的最難用的AP…

[Spring] Spring Web MVC基礎理論

🌸個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵?熱門專欄: 🧊 Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection與…

n3.平滑升級和回滾

平滑升級和回滾 1. 平滑升級流程2. 平滑升級和回滾案例 有時候我們需要對Nginx版本進行升級以滿足對其功能的需求,例如添加新模塊,需要新功能,而此時 Nginx又在跑著業務無法停掉,這時我們就可能選擇平滑升級 1. 平滑升級流程 平…

使用ChatGPT來撰寫和潤色學術論文的教程(含最新升級開桶ChatGpt4教程)

現在有了ChatGPT4o更加方便了, 但次數太少了 想要增加次數可以考慮升級開桶ChatGpt4 一、引言 在學術研究中,撰寫高質量的論文是一項重要的技能。本教程將介紹如何利用ChatGPT來輔助完成從論文構思到潤色的全過程。 二、使用ChatGPT寫論文 1. 寫標題 Title/Topic…

【TB作品】51單片機,MSP430單片機,STM32單片機,簡易波形發生器

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tabBB08J2二、 簡易波形發生器 (限MSP430、STM32單片機) 任務要求: 制作一個簡易波形發生器,具有如下功能: 1、能夠產生方波、正弦波,并可通過示波器觀察到&…

QT 多線程 QThread

繼承QThread的線程 繼承 QThread 是創建線程的一個普通方法。其中創建的線程只有 run() 方法在線程里的。其他類內定義的方法都在主線程內。 通過上面的圖我們可以看到,主線程內有很多方法在主線程內,但是子線程,只有 run() 方法是在子線…

基于STM32設計的藥品柜溫濕度監測系統(華為云IOT)(184)

基于STM32設計的藥品柜溫濕度監測系統(華為云IOT)(184) 文章目錄 一、前言1.1 項目介紹【1】項目功能介紹【2】整體需求總結【3】項目硬件模塊組成1.2 設計思路【1】整體設計思路【2】ESP8266工作模式配置【3】華為云IOT手機APP界面開發思路1.3 項目開發背景【1】選題的意義【2…

R語言學習筆記6-數據框

R語言學習筆記6-數據框 數據框(DataFrame)介紹數據框用途創建數據框從矩陣創建數據框索引和切片添加和修改列數據框的預處理數據框的排序數據框的合并與拆分數據框的計算與匯總數據框的篩選處理缺失值應用函數處理數據重塑數據框使用 dplyr 進行數據框的管道操作數據框的時間序…

使用 WebSocket 進行實時數據傳輸

以下是使用 WebSocket 進行實時數據傳輸的一般步驟: 一、前端部分 (一)創建 WebSocket 連接 const socket new WebSocket(ws://your-server-url); 在上述代碼中,將 ws://your-server-url 替換為您實際的服務器 WebSocket 地…

SvANet:微小醫學目標分割網絡,增強早期疾病檢測

SvANet:微小醫學目標分割網絡,增強早期疾病檢測 提出背景前人工作醫學對象分割微小醫學對象分割注意力機制 SvANet 結構圖SvANet 解法拆解解法邏輯鏈 論文:SvANet: A Scale-variant Attention-based Network for Small Medical Object Segmen…

【JAVA poi-tl-ext 富文本轉word】

富文本轉word 環境使用poi-tl-ext的原因富文本轉word代碼 環境 jdk 1.8 <dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.16</version> </dependency>poi-tl-ext已經包…

可靈重大升級!新增Web端上線、首尾幀控制、單次生成視頻時長增加至10s!

快手視頻生成大模型“可靈”&#xff08;Kling&#xff09;&#xff0c;作為全球首個真正用戶可用的視頻生成大模型&#xff0c;自面世以來&#xff0c;憑借其無與倫比的視頻生成效果&#xff0c;在全球范圍內贏得了用戶的熱烈追捧與高度評價。截至目前&#xff0c;申請體驗其內…

修正版頭像上傳組件

修正版頭像上傳組件 文章說明核心源碼展示運行效果展示源碼下載 文章說明 在頭像剪切上傳一文中&#xff0c;我采用div做裁剪效果&#xff0c;感覺會有一些小問題&#xff0c;在昨天基于canvas繪制的功能中改進了一版&#xff0c;讓代碼變得更簡潔&#xff0c;而且通用性相對高…

永恒之藍:一場網絡風暴的啟示

引言 在網絡安全的漫長歷史中&#xff0c;“永恒之藍”&#xff08;EternalBlue&#xff09;是一個不可忽視的里程碑事件。它不僅揭示了網絡世界的脆弱性&#xff0c;還促使全球范圍內對網絡安全的重視達到了前所未有的高度。本文將深入探討“永恒之藍”漏洞的起源、影響及其對…

【WebGIS】從設計層面設計系統

本項目在通過現代信息技術手段&#xff0c;對古村古鎮進行多方位、多角度的數字化記錄、展示與傳播&#xff0c;實現文化遺產的數字化保護、活化利用與共享。項目內容主要包括&#xff1a;1&#xff09;古村古鎮數據庫的建立&#xff1a;通過多種渠道收集古村古鎮的各類信息&am…

期貨量化交易客戶端開源教學第八節——TCP通信服務類

private FReciveStr: AnsiString; {接收到的數據} IsConErr: Boolean; {網絡連接是否失敗} FSocket_LB: Integer; {TCP連接類別,0為交易,1為行情,2為查詢} FRetryCount: Integer; {網絡連接重試次數} FLoginErrEvent: TLoginErrEvent; {…

如何從 PDF 中刪除背景

您是否曾經收到過充滿分散注意力背景的掃描 PDF 文檔&#xff1f;也許是帶有繁忙水印的舊收據或背景光線不均勻的掃描文檔。雖然這些背景可能看起來沒什么大不了的&#xff0c;但它們會使您的工作空間變得混亂&#xff0c;并使您難以專注于重要信息。輕松刪除這些不需要的元素并…

短視頻SEO矩陣系統:源碼開發與部署全攻略

在數字化時代&#xff0c;短視頻已成為人們獲取信息、娛樂休閑的重要方式。隨著短視頻平臺的興起&#xff0c;如何讓自己的內容在眾多視頻中脫穎而出&#xff0c;成為每個創作者和內容運營者關注的焦點。本文將為您深入解析短視頻SEO矩陣系統的源碼開發與部署&#xff0c;助您在…