使用最新Hal庫實現USART中斷收發功能(STM32F4xx)

目錄

概述

1 認識STM32F4XX的USART

1.1 USART 功能說明

1.2 USART的中斷

1.3 USART 模式配置

1.4 USART的寄存器

2 使用STM32CubeMX 生成工程

2.1 配置參數

2.2 生成工程代碼

3 實現軟件功能

3.1 軟件功能介紹

3.2 認識USART Hal庫

3.2.1 初始化函數組

3.2.2 發送/接收函數組

3.2.3 中斷和callback函數組

4 實現串口發送和接收功能接口

4.1 發送函數

4.2 接收函數

4.3 實現printf打印功能

4.4 完整程序

5 測試

5.1 測試代碼功能介紹

5.2 測試代碼實現

5.3 測試發送和接收功能

5.3.1 測試發送功能

5.3.2 測試接收數據功能


源代碼下載地址:stm32f4xxx-USART串口中斷收發例程資源-CSDN文庫

HAL 庫版本:??STM32Cube_FW_F4_V1.27.1?

概述

本文主要介紹STM32F4XX 通用同步異步收發器 (USART) 的相關知識,詳細介紹了USART的特征,寄存器組。還介紹如何使用STM32CubeMX配置USART的相關的參數,并生成項目文件。還使用Hal庫函數實現USART1的發送和接收功能,其中接收功能使用中斷來實現的。

1 認識STM32F4XX的USART

通用同步異步收發器 (USART) 能夠靈活地與外部設備進行全雙工數據交換,滿足外部設備對工業標準 NRZ 異步串行數據格式的要求。 USART 通過小數波特率發生器提供了多種波特率。它支持同步單向通信和半雙工單線通信;還支持 LIN( 局域互連網絡)、智能卡協議與 IrDA(紅外線數據協會) SIR ENDEC 規范,以及調制解調器操作 (CTS/RTS)。而且,它還支持多處理器通信。通過配置多個緩沖區使用 DMA 可實現高速數據通信。

1.1 USART 功能說明

接口通過三個引腳從外部連接到其它設備。任何 USART 雙向通信均需要至少兩個引腳:接收數據輸入引腳 (RX) 和發送數據引腳輸出 (TX):

RX:接收數據輸入引腳就是串行數據輸入引腳。過采樣技術可區分有效輸入數據和噪聲,從而用于恢復數據。

TX: 發送數據輸出引腳。如果關閉發送器,該輸出引腳模式由其 I/O 端口配置決定。如果使能了發送器但沒有待發送的數據,則 TX 引腳處于高電平。在單線和智能卡模式下,該 I/O用于發送和接收數據( USART 電平下,隨后在 SW_RX 上接收數據)。

正常 USART 模式下,通過這些引腳以幀的形式發送和接收串行數據:

● 發送或接收前保持空閑線路

● 起始位

● 數據(字長 8 位或 9 位),最低有效位在前

● 用于指示幀傳輸已完成的 0.5 個、 1 個、 1.5 個、 2 個停止位

● 該接口使用小數波特率發生器 - 帶 12 位尾數和 4 位小數

● 狀態寄存器 (USART_SR)

● 數據寄存器 (USART_DR)

● 波特率寄存器 (USART_BRR) - 12 位尾數和 4 位小數。

● 智能卡模式下的保護時間寄存器 (USART_GTPR)

1.2 USART的中斷

發送期間:發送完成、清除以發送或發送數據寄存器為空中斷。 接收期間:空閑線路檢測、上溢錯誤、接收數據寄存器不為空、奇偶校驗錯誤、 LIN 斷路檢測、噪聲標志(僅限多緩沖區通信)和幀錯誤(僅限多緩沖區通信)。

1.3 USART 模式配置

1.4 USART的寄存器

這是一張非常完美的圖,介紹整個USART的工作原理,以及各個寄存器的功能。了解這張圖,就會對STM32的USART模塊有一個很深刻的認識。

和USART相關的寄存器的列表,具體每個寄存器表示什么意思,參考文檔: STM32F40xxx、STM32F41xxx、STM32F42xxx、STM32F43xxx參考手冊(中文).pdf

2 使用STM32CubeMX 生成工程

2.1 配置參數

1)選擇串口工作模式

2)Parameter Settings

3)NVIC Settings

2.2 生成工程代碼

選擇合適的IDE和Hal庫,然后點擊GENERATE CODE,生成項目文件。打開工程可以看見,和硬件相關的代碼STM32CubeMX 已經生成,且這些函數已經在main()函數中初始化,所以user只需編寫和應用相關的代碼。

3 實現軟件功能

3.1 軟件功能介紹

1)實現串口發送字符串功能

2)實現中斷接收字符串功能

3.2 認識USART Hal庫

3.2.1 初始化函數組

這部分函數會在STM32CubeMX自動生成代碼時,自動調用。

3.2.2 發送/接收函數組

3.2.3 中斷和callback函數組

4 實現串口發送和接收功能接口

本程序使用UART0來實現串口的發送和接收功能。

4.1 發送函數

參數介紹:

1)huart: 串口配置參數指針

2)databuff: 發送數據的存儲buff

3) datalen : 發送數據的字節長度

串口配置參數指針位置:

4.2 接收函數

這部分函數在stm32f4_drv_uart.c文件中實現

接收參數采用中斷方式實現,Hal庫的中斷程序實現和很早以前ST提供的drviver的實現方式有很大的不同,先看代碼:

使用Hal庫實現接收數據功能,有如下3個步驟:

step-1: 代碼18~19行, 定義接收數據buff,具體數據長度,可根據實現項目特性確定

step-2: 代碼21~24行,調用HAL_UART_Receive_IT,實現數據接收,這個函數必須被連續執行,才能使中斷程序不間斷接收數據。

step-3: 代碼26~32行,重新HAL_UART_RxCpltCallback函數,該函數在收到step-1傳入的接收數據長度個數據之后,會進入該函數。其作用是,實現數據處理邏輯。

4.3 實現printf打印功能

在函數中添加如下代碼:

代碼介紹

222-行: 使用USART1接口,傳遞一個數據,超時時間為1000ms

注意:

使用printf功能時,必須在頭文件中包含:stdio.h

#include <stdio.h>

4.4 完整程序

/* USER CODE BEGIN Header */
/********************************************************************************* File Name ? ? ? ?  : stm32f4_drv_uart.c* Description ? ? ?  : Code for board uart driver******************************************************************************* @attention** Copyright (c) mingfei.tang* All rights reserved.********************************************************************************/
/* USER CODE END Header */
#include "can.h"
#include "stm32f4_drv_uart.h"
?
static uint8 recevBuff[10];
static const ?uint8 RECEV_LEN = sizeof(recevBuff);
?
void UART_Drv_Receive( UART_HandleTypeDef *huart)
{HAL_UART_Receive_IT( huart, ?recevBuff, RECEV_LEN);
}
?
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if( huart->Instance == USART1){printf(" %s ", recevBuff);}
}
?
void UART_Drv_SendString(UART_HandleTypeDef *huart, uint8 *databuff, uint8 datalen)
{HAL_UART_Transmit( huart, databuff , datalen, 1000 );
}

5 測試

5.1 測試代碼功能介紹

1)使用UART_Drv_SendString發送字符串

2)使用printf發送字符串

3)使用中斷函數接收程序

5.2 測試代碼實現

源代碼

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */// UART RECEIVE UART_Drv_SendString(&huart1, "this is a test!\r\n", sizeof("this is a test!\r\n"));printf("CAN bus test example: \r\n " );   //使用printf打印log /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){UART_Drv_Receive( &huart1 );    //觸發接收中斷函數/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

5.3 測試發送和接收功能

5.3.1 測試發送功能

下載程序到板卡,將USART1對應的串口端和PC之間,使用串口線連接起來,打開串口工具,重新上電或者復位板卡可以看見:

5.3.2 測試接收數據功能

在接收函數中,定義的接收數據緩沖buff的長度為10,所以,當中斷程序接收到10個數據之后,就會調用HAL_UART_RxCpltCallback函數.

在HAL_UART_RxCpltCallback函數中,會將接收到的數據通過printf打印到終端:

運行程序后,使用串口調試助手發送數據:

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

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

相關文章

一周學會Django5 Python Web開發-Django5詳細視圖DetailView

鋒哥原創的Python Web開發 Django5視頻教程&#xff1a; 2024版 Django5 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili2024版 Django5 Python web開發 視頻教程(無廢話版) 玩命更新中~共計28條視頻&#xff0c;包括&#xff1a;2024版 Django5 Python we…

vue+element模仿實現云碼自動驗證碼識別平臺官網

一、項目介紹 項目使用傳統vue項目結構實現&#xff0c;前端采用element實現。 element官網&#xff1a;Element - The worlds most popular Vue UI framework 云碼官網地址&#xff1a;云碼-自動驗證碼識別平臺_驗證碼識別API接口_免費驗證碼軟件 項目截圖&#xff0c;支持…

ios csr 證書創建

蘋果Certificate證書創建 1.開始創建。 登錄蘋果開發者網站 選擇Certificates旁邊的 ?按鈕 選擇你想要的證書類型&#xff0c;手機開發的話一般是iOS APP Development 跟 iOS Distribution&#xff08;App Store and Ad Hoc&#xff09;&#xff0c;如果要Mac和iOS都可以發…

NCT 全國青少年編程圖形化編程(Scratch)等級考試(一級)模擬測試H

202312 青少年軟件編程等級考試Scratch一級真題 第 1 題 【 單選題 】 以下說法合理的是( ) A :隨意點開不明來源的郵件 B :把密碼設置成 abc123 C :在虛擬社區上可以辱罵他人 D :在改編他人的作品前&#xff0c; 先征得他人同意 正確答案&#xff1a; D 試題解析&…

C# aes加密解密byte數組

using System.Security.Cryptography; using System.Text;namespace AESStu01;public class AesHelper {// AES加密密鑰和向量&#xff08;需要保密&#xff09; private static readonly string Key "";//16長度字符串數字混合private static readonly string IV …

LeetCode--42

42. 接雨水 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 輸入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 輸出&#xff1a;6 解釋&#xff1a;上面是由數組 [0,1,0,2,1,0,1,…

PackagingTool_x64_v2.0.1.0圖片轉檔打包二進制文件合并字庫生成圖片軟件介紹

繼去年12月份發布的打包軟件PackagingTool v1.4.0.2之后&#xff0c;今年再度投入精力&#xff0c;完善了軟件功能&#xff0c;同時開發了幾個更加實用的工具&#xff0c;可助力UI界面的設計開發。當前最新版本為PackagingTool_x64_v2.0.1.0&#xff0c;該版本主界面如下&#…

Windows操作系統中各種功能、快捷鍵

目錄 引言一、系統1.任務管理器&#xff08;當前進程屬性&#xff09;2.畫圖板3.計算器4.CMD命令行窗口5.控制面板6.記事本7.寫字板 二、瀏覽器1.打開開發者工具2.頁面搜索 三、AcWing1.替換2.對多處進行相同操作3.光標變為下劃線 引言 由于本專業是計算機專業&#xff0c;所以…

Spring Cloud中,Eureka常見問題總結

Spring Cloud中&#xff0c;Eureka常見問題總結。 指定Eureka的Environment 1eureka.environment: 指定環境參考文檔&#xff1a;Configuring Eureka Netflix/eureka Wiki GitHub 指定Eureka的DataCenter 1eureka.datacenter: 指定數據中心參考文檔&#xff1a;Configuring …

SpringBoot:Invalid bound statement (not found)的原因和解決方案

&#x1f413; 報錯信息&#xff1a; &#xff08;無效綁定聲明&#xff09;找不到 解析&#xff1a; 你的mapper實例對象和對應的mapper.xml對象未找到 &#x1f413; 排查&#xff1a; 情況一&#xff1a; 1.排除相對應的mapper實例對象路徑是否正確 查看相對應的mapper中…

unity3d中單例模式兩種簡單寫法與對比

一、 public class UlManager {private static UlManager instance;private void Awake(){if(instance ! null)Destroy(this);else instance this;} }二、 public class UlManager {private static UlManager instance;public static UlManager Instance{get{if (instance …

ChatGPT聊YOLO

最近ChatGPT大伙&#xff0c;其概括摘要能力非常強。YOLO系列算法也是目標檢測領域非常重要的一個研究路線&#xff0c;那么ChatGPT是如何看待各個YOLO算法的呢&#xff1f;那我們去問問它如何看待各個版本的YOLO。 截止到2021年9月&#xff0c;YOLOv6尚未發布。因此&#xff0…

類復習【C#】

【訪問級別】【修飾】【返回類型】 類名 : 【被繼承類】【被繼承接口】 { 字段&#xff1b; 屬性&#xff1b; 默認構造器&#xff1b;// 無參構造器 有參構造器&#xff1b; 私有方法&#xff1b; public 公共方法&#xff1b; } 修飾&#xff1a; 修飾符【C#】-CSDN…

pycharm實現上傳excel生成word

下載需要的依賴包 pip install openpyxl python-docx flaskmain.py文件 from flask import Flask, request, render_template from openpyxl import load_workbook from docx import Documentapp Flask(__name__, template_foldertemplates)app.route(/) def index():return…

小程序面試題:js、vue、uni、小程序的頁面傳參方式區別

js、vue、uni、小程序的頁面傳參方式區別&#xff1f; 1、 js傳參 通過location.href跳轉傳參和接收參數&#xff0c;url后面拼接參數來進行跳轉傳參。 2、 vue傳參 可以通過標簽router-link的to屬性跳轉傳參&#xff0c;也可以通過事件里的this.$router.push跳轉傳參。傳參有…

寒假作業Day 03

寒假作業Day 03 一、選擇題 在C語言中&#xff0c;字符型指針char *p;通常用于指向字符數組&#xff08;即字符串&#xff09;的首字符。對于給定的選項&#xff0c;我們來分析每一個選項是否可以將字符串正確地賦值給p&#xff1a; A: pgetchar(); getchar()函數從標準輸入讀…

K8S—Pod控制器

目錄 1.什么是POD控制器 2.POD控制器有幾種類型 3.POD與控制器之間的關系 4.示例 4.1 Deployment 4.2 SatefulSet ①為什么要有headless&#xff1f; ②為什么要有volumeClainTemplate&#xff1f; ③服務發現&#xff1a;就是應用服務之間相互定位的過程。 ④K8S里服…

圖的簡單介紹

定義及術語 G(V,E)&#xff1a;圖G的頂點集為V&#xff0c;邊集為E。分為有向圖和無向圖兩類。 頂點的度&#xff1a;與該結點相連的邊的條數。 出度&#xff1a;頂點的出邊條數 入度&#xff1a;頂點的入邊條數 頂點的權值稱為點權&#xff0c;邊的權值稱為邊權。 存儲 1.鄰…

SpringCache【緩存接口返回值信息】【前端訪問后端,后端訪問數據庫(可以緩存這個過程,前端訪問后端,保存記錄,下次訪問直接返回之前的數據)】

SpringCache 針對不同的緩存技術需要實現不同的CacheManager&#xff1a;注解入門程序CachePut注解CacheEvict注解Cacheable注解 Spring Cache是一個框架&#xff0c;實現了基于注解的緩存功能&#xff0c;只需要簡單地加一個注解&#xff0c;就能實現緩存功能&#xff0c;大大…

Mongodb基礎(node.js版)

一、Mongodb 介紹 Mongodb 是一個文檔數據庫&#xff0c;以文檔形式存儲數據&#xff0c;格式類似于 JSON 與 Mysql 的特點及選型對照 MongodbMysql關系類型非關系型關系型存儲類型文檔存儲&#xff08;類似于寫 Word &#xff09;表格存儲 &#xff08;類似于寫 Excle&…