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串口通信 中断配置 的相关文章

  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • 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 编写中断处理