串口接收中斷配置過程---STM32F4--HAL

串口接收中斷程序配置過程(HAL)

  1. 初始化相關參數,使能串口:
HAL_UART_Init();

該函數的參數是串口的基址,在stm32f429xx.h文件中,定義了8個UART_HandleTypeDef的值,分別是USART1、USART2、USART3、UART4、UART5、USART6、UART7、UART8,可以用HAL_UART_Init對這8個串口進行初始化,我們要用USART1,就填USART1

  1. 串口相關IO口配置,復用配置。在HAL_UART_MspInit中調用HAL_GPIO_Init函數

  2. 串口接收中斷優先級配置和使能

HAL_NVIC_EnableIRQ();
HAL_NVIC_SetPriority();
  1. 使能串口接收中斷
    所有的串口都使用HAL_UART_Receive_IT使能接收中斷
HAL_UART_Receive_IT();
  1. 編寫中斷服務函數:USARTx_IRQHandler
    這個函數在startup_stm32f429xx.s中可以找到。
    不同的串口有不同的中斷服務函數
void USARTx_IRQHandler(void) ;//(x=1~3,6)
void USARTx_IRQHandler(void) ;//(x=4,5,7,8)

具體配置過程

我們通過電腦把數據發送給STM32,STM32收到數據之后再把數據發送給電腦

  1. 初始化相關參數,使能串口
UART_HandleTypeDef usart_handler;	//定義為全局變量
void usart1_init(void)
{usart_handler.Instance = USART1;						//指定用哪個串口usart_handler.Init.BaudRate = 115200;					//波特率設置usart_handler.Init.HwFlowCtl = UART_HWCONTROL_NONE;		//硬件流控制usart_handler.Init.Mode = UART_MODE_TX_RX;				//接收or發送or接收發送//usart_handler.Init.OverSampling = usart_handler.Init.Parity = UART_PARITY_NONE;			//奇偶校驗usart_handler.Init.StopBits = UART_STOPBITS_1;			//停止位usart_handler.Init.WordLength = UART_WORDLENGTH_8B;		//字長HAL_UART_Init(&usart_handler);}
  1. 串口相關IO口配置,復用配置。在HAL_UART_MspInit中調用HAL_GPIO_Init函數
//HAL_UART_Init會自動調用HAL_UART_MspInitvoid HAL_UART_MspInit(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_USART1_CLK_ENABLE();//GPIO口初始化就配置好了復用功能GPIO_Initure.Pin=GPIO_PIN_9;			//PA9GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//復用推挽輸出GPIO_Initure.Pull=GPIO_PULLUP;			//上拉GPIO_Initure.Speed=GPIO_SPEED_FAST;		//高速GPIO_Initure.Alternate=GPIO_AF7_USART1;	//復用為USART1HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA9GPIO_Initure.Pin=GPIO_PIN_10;			//PA10HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA10HAL_NVIC_EnableIRQ(USART1_IRQn);HAL_NVIC_SetPriority(USART1_IRQn,3,3);}
}

HAL_UART_Init初始化串口后,會自動調用HAL_UART_MspInit,我們在HAL_UART_MspInit里面初始化相關GPIO、設置中斷優先級以及使能中斷。

  1. 串口接收中斷優先級配置和使能,在步驟2實現了

  2. 使能接收中斷,我們在main函數里面加入一行代碼來使能接收中斷,該中斷對所有的UART中斷都產生影響。

HAL_UART_Receive_IT(&usart_handler,rdata,sizeof(rdata));

第一個參數usart_handler是UART_HandleTypeDef類型的句柄,第二個參數是接收數據存放的位置,第三個是位置大小。經過這四個步驟,我們就配置好了接收中斷。

  1. 編寫中斷服務函數:USARTx_IRQHandler
void USART1_IRQHandler(void)	
{HAL_UART_IRQHandler(&usart_handler);HAL_UART_Receive_IT(&usart_handler,rdata,sizeof(rdata));
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){HAL_UART_Transmit(huart,rdata,sizeof(rdata),1000);}}

HAL提供了中斷處理函數HAL_UART_IRQHandler,具體流程如下:
在這里插入圖片描述

前面四個步驟是配置接收中斷的,那么什么時候產生中斷呢?
我們使能接收中斷函數是:

HAL_UART_Receive_IT(&usart_handler,rdata,sizeof(rdata));

當接收的數據為sizeof(rdate)字節時,就會產生中斷,進入USART1_IRQHandler函數,USART1_IRQHandler調用HAL庫提供的中斷處理函數HAL_UART_IRQHandler來判斷中斷類型,進而調用不同的處理函數。我們這里是接收中斷,所以會進入UART_Receive_IT函數,把數據放到rdata,處理完畢后,UART_Receive_IT會自動調用HAL_UART_RxCpltCallback回調函數,這個函數我們是可以重寫的,我們可以寫出我們想要的邏輯處理功能函數,在這里調用HAL_UART_Transmit發送數據。

當接收完數據之后,系統會關閉中斷,所以我們還需要打開中斷,接收下一位數據,USART1_IRQHandler中調用HAL_UART_Receive_IT開啟中斷

具體main函數代碼:

int main(void)
{//u8 buff[] = "send to rec";HAL_Init();Stm32_Clock_Init(360,25,2,8);delay_init(180);usart1_init();HAL_UART_Receive_IT(&usart_handler,rdata,sizeof(rdata));while(1){}}

結果

在這里插入圖片描述

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

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

相關文章

electron 切換至esm

前言 好消息,經過不知道多少年的討論。 electron28.0.0開始(23.08.31),默認支持esm了。 see https://github.com/electron/electron/issues/21457 使用方法 升級至electron^28.0.0簡單地在package.json中添加"type":…

javascript運算符_JavaScript中!=或!==運算符之間的區別

javascript運算符We can perceive the differences between these two operators as the same difference that occurs between double equalsTo () and triple equalsTo () operators. We already know that the (!) not-operator used along with () operator is used to che…

實訓09.09:簡單的彩票系統(機選多注)

package wsq; import java.util.Random; import java.util.Scanner;//機選多注 public class MoreCaiPiao {public static void main(String[] args) {// 定義二維數組 存儲多注彩票int[][] numArray new int[5][7];/** 二維數組中 未賦值之前的元素值都為0 { {0,0,0,0,0,0,0}…

項目組的激勵策略

我們經常會采取一獎勵措施,來激發大家工作的積極性,從而達到提高工作效率的目的。那么我們應該對項目組中的那些類型的人實施激勵呢?項目的實踐過程中,筆者認為有兩類人需要給予正面的獎勵。一,能夠主動思考&#xff0…

zk中的Datebox中得到Timestamp

String formatDate sdf.format(datebox.getValue()); para.setCreate_time(Timestamp.valueOf(formatDate)); 轉載于:https://www.cnblogs.com/avenxia/archive/2012/04/15/2450052.html

定時器--STM32f4--HAL

基本概念 STM32中有三種定時器,高級定時器,通用定時器,基本定時器,具體如下圖: 發生如下事件將產生中斷/DMA 更新:計數器向上溢出/向下溢出,計數器初始化觸發事件:計數器啟動、停…

實訓09.09:簡單的彩票系統(自選多注)

package wsq; import java.util.Scanner; public class CustomCaipiao {public static void main(String[] args) {/** 用戶自選彩票數字: 1.使用scanner來輸入彩票號碼! 2.直接寫成自選多注,注數由用戶輸入決定;* 3.紅球值1-33,不重復;藍球值1-16;*/// 定義二維數組 存儲所有的…

c ++查找字符串_C ++類和對象| 查找輸出程序| 套裝4

c 查找字符串Program 1: 程序1&#xff1a; #include <iostream>using namespace std;class Sample {int X;int* const PTR &X;public:void set(int x);void print();};void Sample::set(int x){*PTR x;}void Sample::print(){cout << *PTR - EOF << …

ASP.NET 泛型類型 Dictionary操作

protected void Page_Load(object sender, EventArgs e){//泛型Dictionary Dictionary<string, string> dit new Dictionary<string, string>();dit.Add("13", "張三");dit.Add("22", "李四");Response.Write("總數…

獨立看門狗---STM32----HAL

基本概念 看門狗解決的問題是什么&#xff1f; 在系統跑飛&#xff08;程序異常執行&#xff09;的情況&#xff0c;是系統復位&#xff0c;程序重新執行。 獨立看門狗適應用于需要看門狗作為一個在主程序之外能夠完全獨立工作&#xff0c;并且對時間精度要求低的場合。 工…

實訓09.09:簡單的彩票系統(注冊信息)

package wsq; import java.util.Scanner;//本文件負責注冊用戶信息 /*用戶注冊信息:1.要求設置賬號和密碼,使用字符串數組2.賬號名不能重復3.密碼需要輸入兩次,兩次密碼輸入一致4.滿足賬號名不重復.且兩次密碼一致,即為注冊成功!!將信息添加到字符串數組中String[][] users ne…

【轉】JAVA生成縮略圖

方法1&#xff1a;[第一種方法比后一種生成的縮略圖要清晰] import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.awt.image.ColorModel;import java.awt.image.WritableRaster;import java.awt.*;import java.awt.geom.AffineTransform;import jav…

javascript寫入_如何在JavaScript中寫入HTML元素?

javascript寫入寫入HTML元素 (Writing into an HTML element) To write string/text into an HTML element, we use the following things: 要將字符串/文本寫入HTML元素&#xff0c;我們使用以下內容&#xff1a; There must be an HTML element like paragraph, span, div e…

大話設計模式之設計模式遵循的七大原則

最近幾年來&#xff0c;人們踴躍的提倡和使用設計模式&#xff0c;其根本原因就是為了實現代碼的復用性&#xff0c;增加代碼的可維護性。設計模式的實現遵循了一些原則&#xff0c;從而達到代碼的復用性及增加可維護性的目的&#xff0c;設計模式對理解面向對象的三大特征有很…

IIC通信---EEPROM24C02---STMF4

IIC通信協議 IIC是同步半雙工通信&#xff0c;一個數據線SDA和一個時鐘SCL線&#xff0c;可以接受和發送數據。在CPU與被控IC之間、IC與IC之間進行雙向傳送。 空閑狀態 IIC總線的SDA和SCL兩條信號線同時處于高電平時&#xff0c;規定為總線的空閑狀態。 起始信號 當SCL為高…

實訓09.08:簡單的算法練習

/*final 關鍵字 修飾的變量值 后期不可更改 相當于定義常量常量 &#xff1a;不可更改*/final int a 10;//a 20; 報錯的值不可更改&#xff01;/*輸入函數* */System.out.println("請輸入數字&#xff1a;");Scanner scanner new Scanner(System.in);int b…

讓自己閃亮

轉載于:https://www.cnblogs.com/Gigabyte/archive/2009/01/03/you_can_shine.html

Java中的wait()和sleep()方法之間的區別

Java中的wait()和sleep()方法 (wait() and sleep() methods in Java) First, we will see how wait() method differs from sleep() method in Java? 首先&#xff0c;我們將看到wait()方法與Java中的sleep()方法有何不同&#xff1f; wait()方法 (wait() Method) This metho…

離線使用iPhone SDK文檔的方法

在使用Xcode進行iPhone編程時&#xff0c;有時需要參考iPhone SDK的文檔&#xff0c;不過每次ControlClick后&#xff0c;Xcode都會試圖連接Internet&#xff0c;進行在線讀取。有什么方法能夠把資料下載到硬盤上進行離線閱讀嗎&#xff1f; 答案是肯定的。首先去Xcode的Prefer…

遠程連接sql server 2000服務器的解決方案

遠程連接sql server 2000服務器的解決方案2007-04-07 11:29遠程連接sql server 2000服務器的解決方案   一 看ping 服務器IP能否ping通。   這個實際上是看和遠程sql server 2000服務器的物理連接是否存在。如果不行&#xff0c;請檢查網絡&#xff0c;查看配置&#xff0c…