STM32串口通信 中断配置

2023-05-16

一.关于如何配置通过中断的方式配置串口的收发 ,一共就是这8个步骤

1.使能串口时钟、使能GPIO时钟

2.引脚复用映射

3.GPIO端口模式设置

4.串口参数初始化设置

5.开启中断初始化NVIC

6.使能串口

7.编写中断处理函数

8.编写收发数据处理函数

二.初始化串口函数

1.使能串口时钟、使能GPIO时钟

    //使能GPIOA
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 
	//使能串口1
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

2.引脚复用映射

    //GPIOA_Pin_9  映射串口1
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
	//GPIOA_Pin_10 映射串口2
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

3.GPIO端口模式设置

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;     //复用
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   //推挽
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;     //上拉
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	
	//GPIOA初始化¯
	GPIO_Init(GPIOA, &GPIO_InitStructure);  

GPIO初始化里的结构体变量需要在最上面申明定义、包括串口1的结构体变量、串口1中断的结构体变量

4.串口参数初始化设置

    USART1_InitStructure.USART_BaudRate = 115200;                  //波特率
    //没有硬件流设置
	USART1_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
	USART1_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //输入\输出
	USART1_InitStructure.USART_Parity = USART_Parity_No;             //没有奇偶校验位
	USART1_InitStructure.USART_StopBits = USART_StopBits_1;          //设置停止位为1
	USART1_InitStructure.USART_WordLength = USART_WordLength_8b;     //字长8个位
	//USART1初始化
	USART_Init(USART1, &USART1_InitStructure);

    //使能串口1
	USART_Cmd(USART1, ENABLE);

5.开启中断初始化NVIC

	
	IT_USART1_InitStructrue.NVIC_IRQChannel = USART1_IRQn;      //中断串口1通道
	IT_USART1_InitStructrue.NVIC_IRQChannelCmd = ENABLE;        //使能中断串口1通道
	IT_USART1_InitStructrue.NVIC_IRQChannelPreemptionPriority = 1;  //抢占优先级为1
	IT_USART1_InitStructrue.NVIC_IRQChannelSubPriority = 1;         //响应优先级为1
	
	//串口中断初始化
	NVIC_Init(&IT_USART1_InitStructrue);	

6.使能串口

    //使能串口1中断服务函数
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

那么配置中断串口1的初始化函数就到这里。

三.编写中断处理函数

1.编写先对应的中断处理函数,这里用的是串口一,所以对应的也就是中断服务函数一

void USART1_IRQHandler(void)
{
	
	//如果有数据触发中断1
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
	{
		//清除中断标志位
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);  
		//将串口中断接收的数据读出来,赋值为Res
		Res =USART_ReceiveData(USART1);	
		USART_SendData(USART1, Res);
		switch(USARTReceIn)
		{
			case 0:
				if(Res)   //如果Res 接收到数据,则把数据传入到数组  USARTReceBuff
					USARTReceBuff[USARTReceIn++] = Res;
				else      //否则 USARTReceIn 清零重新判断
					USARTReceIn = 0;
				break;		
			default:
				//如果Res 接收到数据则把数据传入到数组    USARTReceBuff
				USARTReceBuff[USARTReceIn++] = Res;
				break;
		}
		//如果接收到的数据传入次数大于等于8次,则表示接收一帧数据,则把中断标志位置一
		if(USARTReceIn >= 8)            
		{
			USARTReceFullFlag = 1;	 
		}
     }
}

2.编写收发数据处理函数

        这里的检测函数是面向一帧数据来判断的,当串口接收到一帧8位的数据之后会存入数组,而这个检测函数就是判断数据再做出需要的动作的

       eg:当串口接收数据标志位置一,则表示串口已经接收到了一帧8位的数据,那么就打开串口数据标志位,之后就是判断数组中数据的第一位数据是否是0x88,这些都是可以自定义的,可以加一些包头、包尾、校验和之内的判断条件,从而判断接收到的数据是否是你所需要的数据,如果不是则清空标志位、不做出任何动作,继续等待下一帧的数据来进行判断

/***************************************************************
 * 功  能: 串口1数据检测函数     USARE1_detection
 * 参  数: 无
 * 返回值: 无
 * 
****************************************************************/

void USARE1_detection(void)
{
	
	if(USARTReceFullFlag)
	{
		if((USARTReceBuff[0] == 0x88))
		{
			GPIO_ResetBits(GPIOF, GPIO_Pin_10);
			GPIO_ResetBits(GPIOF, GPIO_Pin_9);		
			GPIO_SetBits(GPIOF, GPIO_Pin_10 | GPIO_Pin_8);
		}else if((USARTReceBuff[0] == 0x99))
		{
			GPIO_ResetBits(GPIOF, GPIO_Pin_10 | GPIO_Pin_8);
			GPIO_SetBits(GPIOF, GPIO_Pin_9);
		}
		USARTReceFullFlag = 0;      //关闭串口数据标志位
		USARTReceIn = 0;            //串口接收数据变量清零
	}
}

好了!!!

一个简单的串口接收函数就这样配置好了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32串口通信 中断配置 的相关文章

随机推荐

  • frp错误,frp报错,[ssh] start error: proxy name [ssh] is already in use

    在linux开发板上 xff0c arm开发板上 xff0c 运行frp xff0c 报错 ssh start error proxy name ssh is already in use 原因是有其他的设备运行过 ssh 命名的子项 xf
  • ubuntu中共享文件夹看不到

    参考原文链接 xff1a https blog csdn net asia66 article details 80597531 utm medium 61 distribute pc relevant t0 none task blog
  • KEIL设置程序起始地址无效解决方法,STM32 IAP程序起始地址

    关键词 xff1a KEIL设置程序起始地址无效解决方法 STM32 IAP设置程序起始地址 KEIL设置程序起始地址 MDK设置程序起始地址 KEIL设置ROM地址无效 碰到的问题 xff1a 为了实现STM32升级固件 xff0c 需要
  • 电源滤波保护电路

    电源滤波保护电路 参考https wenku baidu com view 76c07ff0ba0d4a7302763a33 html X电容 xff0c 滤差模干扰 Y电容 xff0c 滤共模干扰 安规电容
  • Ubuntu安装yaml

    在Ubuntu下 xff0c 使用pip安装yaml pip install pyyaml 测试 xff1a gt gt gt import yaml gt gt gt 没报错 xff0c 说明安装成本 注 xff1a 我是在root下安装
  • 教你windows下配置java环境变量&idea配置maven库(标贝科技)

    配置java环境变量 43 idea配置maven库 xff08 标贝科技 xff09 前言 配置环境变量是小伙伴们入坑的第一步 xff0c 本文将一步一步详细介绍 xff0c 保证大家都能够看懂 xff01 xff01 xff01 顺便介
  • 廉价16bit音频DAC芯片TM8211(PT8211、TDA1311)

    推荐低成本高性能两路16位DAC 数模转换 芯片TM8211 xff08 PT8211 TDA1311 xff09 一 概述 xff1a TM8211是两路16位数模转换集成 电路 xff0c 可广泛应用于数字音频 多媒体系统 芯片采用CM
  • 基于累加的PDM算法的原理

    基于累加的 PDM 算法 的 原理 基于累加的 PDM 算法 2 PDM编码原理如下 xff1a 单片机能输出Sin t 吗 xff1f 能 xff0c DA 没有DA怎么办 xff1f PWM 没有PWM怎么办 xff1f 事情就是这么来
  • PCM音频压缩A-Law算法,uLaw

    参考相关 xff1a 关于pcm音频头与a law音频头的互换代码 http blog csdn net fjhyy article details 6593049 https baike baidu com item A E5 BE 8B
  • Spyder cell分块运行 run cell

    Spyder是一个使用方便的Python开发环境 xff0c 安装Anaconda时自带 python代码分块 xff1a 使用Spyder xff0c 可以在python文件 xff08 py xff09 里使用 In 进行分块 如下图
  • C语言中实现bool(布尔型变量)

    C语言中 xff0c 本身没有bool xff08 布尔型变量 xff09 但是我们可以用其他方式来模拟 一 如果简单的使用char int long变量来表示0 1 xff0c 则太浪费空间了 二 这里介绍一种巧妙的方式实现bool xf
  • 随机解调-多频点信号与伪随机序列混频

    随机解调的多频点信号x与伪随机序列经过混频后 xff0c 被均匀的涂抹到了整个频率轴上 xff0c 然后经低通滤波 xff0c 低速均匀采样 xff0c 最后通过OMP等算法恢复原始信号 xff0c 整体上是压缩感知求解欠定方程y 61 A
  • 寻路算法 Astar A星算法

    lt span style 61 34 white space pre 34 gt lt span gt lt span style 61 34 white space pre 34 gt lt span gt 首先是创建一些变量 lt p
  • eclipse调试C代码时printf()不能输出到控制台的解决方法

    1 问题 在ecplise下使用CDT开发C C 43 43 程序中 xff0c 使用debug调试时 xff0c 到了printf 打印函数 xff0c 在console窗口中并没有打印出信息来 xff0c 停止后才会有输出 2 原因 在
  • C语言中带参宏定义

    include lt stdio h gt 1 带参宏定义中 xff0c 宏名和形参表之间不能有空格出现 2 宏定义中不存在值传递 xff0c 它只是一个符号的替换过程 3 带参宏定义中 xff0c 形参不分配内存空间 xff0c 因此不必
  • kaldi新手入门及语音识别的流程(标贝科技)

    kaldi新手入门及语音识别的流程 标贝科技 欢迎体验标贝语音开放平台 地址 xff1a https ai data baker com source 61 qaz123 xff08 注 xff1a 填写邀请码hi25d7 xff0c 每日
  • 结构体字节对齐详解【含实例】

    一 前言 结构体字节对齐属于老生常谈的问题 xff0c 看似简单 xff0c 却很容易忘记 而且因为结构体使用的普遍性 xff0c 使得字节对齐也成为了一个不得不谈的话题 二 什么是结构体字节对齐 假设现在有一个结构体如下 xff0c 问你
  • Mina基础(五):编写自定义协议及编解码器

    为什么要制定协议呢 xff1f 我们知道 xff0c 底层传输的都是二进制数据 xff0c 服务端和客户端建立连接后进行数据的交互 xff0c 接受这对方发送来的消息 xff0c 如何判定发送的请求或者响应的数据结束了呢 xff1f 总不能
  • c++之存储类

    C 43 43 存储类 存储类定义 C 43 43 程序中变量 函数的范围 xff08 可见性 xff09 和生命周期 这些说明符放置在它们所修饰的类型之前 下面列出 C 43 43 程序中可用的存储类 xff1a autoregister
  • STM32串口通信 中断配置

    一 关于如何配置通过中断的方式配置串口的收发 xff0c 一共就是这8个步骤 1 使能串口时钟 使能GPIO时钟 2 引脚复用映射 3 GPIO端口模式设置 4 串口参数初始化设置 5 开启中断初始化NVIC 6 使能串口 7 编写中断处理