STM32串口基础通讯函数配置

2023-05-16

外设篇—————串口


标准库


在串口屏,WiFi模块时候经常会用到串口,所以串口还是需要了解一下原理,才能更好的借鉴别人代码(doge)。


初窥门径

寄存器

当数据发送时候,单片机向发送数据寄存器(TDR)写数据,TDR里面的数据会自动的转移到发送移位寄存器,然后通过单片机的TX口发送出去。

当数据接收时候,数据通过单片机RX口先到移位寄存器,通过移位寄存器转移到接收寄存器(RDR)中,然后被单片机读取到内存中。

我们可以看到图中有TDR和RDR两个数据寄存器,这两个寄存器会组合成一个寄存器DR。移位寄存器是不用我们操作的,还有一个重要的状态寄存器(SR),下面对状态寄存器详细介绍。

状态寄存器其中的状态标志位有:

#define USART_FLAG_CTS         ((uint16_t)0x0200)
#define USART_FLAG_LBD         ((uint16_t)0x0100)
#define USART_FLAG_TXE         ((uint16_t)0x0080)
//TDR寄存器为空标志

#define USART_FLAG_TC          ((uint16_t)0x0040)
//发送完成标志

#define USART_FLAG_RXNE        ((uint16_t)0x0020)
//RDR不为空标志

#define USART_FLAG_IDLE        ((uint16_t)0x0010)
//数据线空闲标志

#define USART_FLAG_ORE         ((uint16_t)0x0008)
#define USART_FLAG_NE          ((uint16_t)0x0004)
#define USART_FLAG_FE          ((uint16_t)0x0002)
#define USART_FLAG_PE          ((uint16_t)0x0001)

这个寄存器作用就是告诉我们串口通讯的情况,发没发完,发送的数据对不对,有没有数据正准备要发送等等···,我们通过对这些状态的判断来监测传输情况和进行一些逻辑算法来增加传输可靠性。

略知一二

常用的通讯函数

串口发送函数

上代码

void UART1_Send_Byte(u8 Data) 					//发送一个字节
{
	USART_GetFlagStatus(UART1, USART_FLAG_TC);
	
	USART_SendData(UART5,Data);
	while( USART_GetFlagStatus(UART1, USART_FLAG_TC) == RESET );
}

void UART5_Send_String(u8 *Data) 				//发送字符串
{
	while(*Data)
		UART5_Send_Byte(*Data++);
}

串口接收函数

常用方案,利用中断来接收数据,上代码


void USART1_IRQHandler()  
{
    if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) //中断产生
  {  
    USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
    Uart1_Buffer[Uart1_Rx_Num] = USART_ReceiveData(USART2);
    Uart1_Rx_Num++;
  }

注:在使用串口接收中断要进行串口中断配置,代码如下

	NVIC_InitTypeDef NVIC_InitStructure;
	//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

现在已经可以使用串口进行简单的数据通讯了,下一步要按照我们使用协议的需求进行通讯。

粗通皮毛

自定义协议传输

例如与串口屏通讯通讯时,接收到串口屏发来的数据为

串口屏发送来的数据

这时我们就不能随便接收数据了,要判断发过来的数据是不是我们想收到的有效数据,如上只有数据帧头部为EE,尾部为 FF,FC,FF,FF的数据才是我们想要的。

实现代码如下

#define uart_buffer_size   100
unsigned char uart_rec_buffer[uart_buffer_size];
unsigned char index_uart=0;       //接收数据位移指针
unsigned char uart_buffer_head_ok;//数据头标志
unsigned char cmd_in=0;           //接收完成标志位

void USART1_IRQHandler(void)
{
   unsigned char  c;
   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{ 	
		USART_ClearITPendingBit( USART1 , USART_IT_RXNE );
		                     //清楚状态标志位,等待下次数据触发中断
	    c=USART1->DR;
		if(c==0xEE) //如果收到的数据头是0xee,进入下面循环
		{
				uart_buffer_head_ok=1;   //数据头正确
				index_uart=0;            //指针指向数组的第一个元素
			}
	 	 if(uart_buffer_head_ok==1)      //当再有数据来时进入此循环
		    {
		      uart_rec_buffer[index_uart++]=c; //以此保存数据到缓存区
              if(index_uart>=4)          //判断数据尾帧
               { 
				if((uart_rec_buffer[index_uart-1]==0xFF)
				&&(uart_rec_buffer[index_uart-2]==0xFF)
				&&(uart_rec_buffer[index_uart-3]==0xFC)
				&&(uart_rec_buffer[index_uart-4]==0xFF)) //帧尾正确
				 {
				 uart_buffer_head_ok=0;    //标志位清零,等待下次接收
				 index_uart=0;
				 cmd_in=1;
				}		
           }          
		 }
        else if(uart_buffer_head_ok==0)
		{
		  index_uart=0;
		}
		if(index_uart>=uart_buffer_size) //如果发生溢出,接收指针清零从新接收
		 index_uart=0;
	}
}

这样可以实现按照我们的需求接收数据,并且提高了可靠性,但是如果传来的数据比较多时,会频繁的触发中断,造成CPU负担,此时我们可以采用DMA来搬运数据,中断采用空闲中断(IDLE),
空闲中断是指没有数据穿过来时候数据线处于空闲状态,此时当一帧数据来的时候才会触发中断。

DMA空闲接收代码如下


#define DMA_USART1_RECEIVE_LEN 18
void USART1_IRQHandler(void)                                 
{     
    u32  r= 0 ,i = 0;  
    if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  
    {  
        USART1->SR;  
        USART1->DR;                /通过读寄存器来清USART_IT_IDLE标志 			
        DMA_Cmd(DMA1_Channel5,DISABLE);      //关闭DMA,防止再次来数据
        r= DMA_USART1_RECEIVE_LEN - DMA_GetCurrDataCounter(DMA1_Channel5); 
        //接收的字符串长度=设置的接收长度-剩余DMA缓存大小 
        for (i = 0;i < r;i++)  
        {  
            Uart2_Buffer[i] = USART1_RECEIVE_DMABuffer[i];  
                
        }  
        //设置传输数据长度  
        DMA_SetCurrDataCounter(DMA1_Channel5,DMA_USART1_RECEIVE_LEN);  
        DMA_Cmd(DMA1_Channel5,ENABLE);    //打开DMA  
    }        
} 

总结:简单说明了串口通讯过程,列举了常用的串口配置函数,在不同的场景下再进行适当修改就好了。多多参考别人的代码学习和改进,下一个境界登堂入室就不远了。

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

STM32串口基础通讯函数配置 的相关文章

  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

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

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

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

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015

随机推荐

  • PWM控制直流电机(单片机实验)

    PWM控制直流电机 xff08 单片机实验 xff09 有问题欢迎私信哦 一 题目 设计电路 xff0c 使用定时器实现PWM对直流电机的转速控制 xff0c 并且实现按键切换转动方向 并进行软件仿真 xff0c 做出实物 二 基本要求 1
  • 模拟ATM机存取款管理系统设计(C++)

    模拟ATM机存取款管理系统设计 有问题欢迎私信哦 1 1问题描述 xff1a 模拟银行自动存取款机使用过程中的界面和用户交互过程 xff0c 实现查询银行卡余额 取款 修改密码 退出系统等功能 1 2基本要求 xff08 功能要求 xff0
  • 蒙牛伊利静悄悄,为什么牛奶的标准这么低,还能喝吗

    蒙牛伊利静悄悄 xff0c 为什么牛奶的标准这么低 xff0c 还能喝吗 中国的食品问题 xff0c 可能是最容易牵动国人关注焦点的大事 从苏丹红到三聚氰胺 xff0c 历年都有各种大大小小的食品安全事件见诸报端 要不是前段时间湖南郴州大头
  • 基于嵌入式技术的智能灌溉系统设计与实现

    基于嵌入式技术的智能灌溉系统设计与实现 基于嵌入式技术的智能灌溉系统设计与实现 基于cortex A9处理器实验平台 xff0c 实现对种植农作物 蔬菜 果树等的土壤温湿度及光照进行远程或本地监测 xff0c 同时对泵的开关进行控制 1 目
  • 程序员(尤其是零项目经验的程序员)找工作

    程序员 xff08 尤其是零项目经验的程序员 xff09 找工作 谈到程序员 xff08 尤其是零项目经验的程序员 xff09 找工作 xff0c 培训班是个不可回避的讨论热点 虽然本人也做过兼职Java培训老师 xff0c 多少了解些培训
  • 非全日制计算机考研有哪些性价比高的院校呢?

    非全日制计算机考研有哪些性价比高的院校呢 xff1f 附 xff1a 各大高校专业课资料整理可以看一下我的博客主页上传的资源哦 xff01 感谢关注 xff0c 点赞 xff0c 评论 计算机行业的非全日制研究生院校 xff0c 大都包含大
  • C++ vector数组实现多级排序—使用sort()函数

    之前有记录过 python 使用 numpy 的多级排序方法 xff1a numpy 多级排序 xff1a lexsort 函数详解 地球被支点撬走啦的博客 CSDN博客 lexsort C 43 43 多级排序可以借用 sort 函数 x
  • 数学符号及读法大全(超经典)

    数学符号及读法大全 附 xff1a 各大高校专业课资料整理可以看一下我的博客主页上传的资源哦 xff01 感谢关注 xff0c 点赞 xff0c 评论 数学符号及读法大全 常用数学输入符号 xff1a xff1d xff1c xff1e x
  • 【计算机】数据结构-严蔚敏/清华大学(完)

    计算机 数据结构 严蔚敏 清华大学 xff08 完 xff09 需要其他资源的可以在我博客主页找找 xff0c 太多了 xff0c 我懒得整理 数据结构 43 43 C语言版 43 43 第2版严蔚敏 清华大学 pdf 链接 https p
  • 2021 王道考研 数据结构+习题讲解

    2021 王道考研 数据结构 2021王道数据结构高清PDF 链接 https pan baidu com s 1czh6EiRxnTj9uJgc5i12 w 提取码 frnh 复制这段内容后打开百度网盘手机App xff0c 操作更方便哦
  • 2015考研数学复习全书【数一】

    2015考研数学复习全书 数一 链接 https pan baidu com s 1nuXM0fINXRKCYbyy o kSg 提取码 vr45 复制这段内容后打开百度网盘手机App xff0c 操作更方便哦
  • 教你如何零基础备考公务员

    教你如何零基础备考公务员 零基础复习一个月国考上岸 xff0c 笔试120 43 岗位第一 近年题目简单 xff0c 这个分数可能看着不高 xff0c 我考试那年是除了极少数部委进不了面试 xff0c 绝大部分岗位都能进面试的 xff0c
  • 零基础考公务员,备考多长时间最合适?

    零基础考公务员 xff0c 备考多长时间最合适 xff1f 说到考公务员 xff0c 小伙伴们最关心的问题就是 xff0c 到底多长时间才能考上 xff1f 小伙伴们都知道 xff0c 上岸要趁早 xff01 毒姐经常在网上看到一些提问 x
  • stm32上基于FreeRTOS多任务程序运行

    一 FreeRTOS简介二 在stm32开发板上实现多任务程序运行1 任务要求2 编写程序3 编译生成hex文件4 将程序下载到stm32开发板上 一 FreeRTOS简介 FreeRTOS是一个迷你操作系统内核的小型嵌入式系统 作为一个轻
  • C#---winform基础

    一 winform 1 winform应用程序是一种智能客户端技术 xff0c 我们可以使用winform应用程序帮助我们获得信息或者传输信息等 2 属性 Name 在后台要获得前台的控件对象 xff0c 需要使用Name属性 visibl
  • ubuntu20.04安装编译kalibr与出现的问题

    1 安装依赖 ubuntu20与18依赖的内容差别很大 xff0c 在逐个更改和参考 25条消息 Ubuntu20 04安装kalibr 可即的博客 CSDN博客 ubuntu安装kalibr和官网 后终于安装依赖成功了hhh sudo a
  • 100道最新Java面试题,常见面试题及答案汇总

    除了掌握扎实的专业技能之外 xff0c 你还需要一份 Java程序员面试宝典 才能在万千面试者中杀出重围 xff0c 成功拿下offer 小编特意整理了100道Java面试题 xff0c 送给大家 xff0c 希望大家都能顺利通过面试 xf
  • SSH远程连接实例

    目录 0 实例场景 1 Windows10中的SSH环境配置 2 Ubuntu端的SSH配置 3 SSH使用 3 1 在终端命令行中连接 3 2 使用VSCode连接 0 实例场景 本实例是在校园网的环境中 xff0c 使用SSH在个人电脑
  • Windows环境下安装tensorflow(操作简单)

    写在最前 xff1a 本人之前也安装过tensorflow xff0c 但因为好长时间没用 xff0c 最近需要用到 xff0c 结果一打开发现版本太低 xff0c 运行代码时出现了很多语法错误 想要直接更新tensorflow xff0c
  • STM32串口基础通讯函数配置

    外设篇 串口 标准库 在串口屏 xff0c WiFi模块时候经常会用到串口 xff0c 所以串口还是需要了解一下原理 xff0c 才能更好的借鉴别人代码 xff08 doge xff09 初窥门径 当数据发送时候 xff0c 单片机向发送数