串口接收中断配置过程---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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…