STM32 USART串口通信 综合练习

news2024/12/12 23:56:47

USART(通用同步/异步串行接收/发送器)串口通信具有以下特点:

  • 全双工操作:设备之间可以同时进行数据的发送和接收。
  • 异步通信:不需要共同的时钟信号,双方设备有各自的时钟。
  • 单端信号:使用一根线传输信号,通常需要地线作为参考。
  • 点对点通信:仅支持两个设备之间的直接通信。

USART串口通信的参数

  • 波特率:单位时间内传输的码元数量,决定了数据传输速率。
  • 起始位:标志数据帧的开始,通常为低电平。
  • 数据位:数据帧的有效载荷,常见为8位。
  • 校验位:用于数据验证,可以位于数据帧的最后一位。
  • 停止位:标志数据帧的结束,通常为高电平。

USART串口通信的优缺点

优点

  • 简单易用:不需要统一的时钟线,接线方便。
  • 广泛的应用:由于其简单性和灵活性,被广泛应用于各种嵌入式系统和物联网设备中。

缺点

  • 电气接口不统一:不同处理器使用的电平存在差异,直接相连可能会损伤器件。
  • 抗干扰能力差:TTL信号的抗干扰能力较差,数据在传输过程中容易出错。
  • 通信距离短:由于抗干扰能力差,通信距离通常限制在一个电路板上的两个芯片之间。

tim.c配置

#include "stm32f10x.h"
#include "led.h"

void Tim_init(u16 arr,u16 psc){
    
    TIM_TimeBaseInitTypeDef Tim2;
    NVIC_InitTypeDef NVIC_Initx;
    //1、开启定时器2时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);    //开启TIM2时钟
    
    //2、定时器初始化
    Tim2.TIM_Period = arr;    //自动装载值    装载值10000-1
    Tim2.TIM_CounterMode=TIM_CounterMode_Up;    //计数模式 向上计数
    Tim2.TIM_ClockDivision=TIM_CKD_DIV1;    //时钟分割是输入捕获用的,故这里随便给
    Tim2.TIM_Prescaler=psc;    //预分频值        7200-1

    TIM_TimeBaseInit(TIM2,&Tim2);    
    //3、打开更新中断
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);    //此处有中断

    //4、优先级    有中断就有中断优先级
    NVIC_Initx.NVIC_IRQChannel = TIM2_IRQn;    //配置目标:中断线0
    NVIC_Initx.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Initx.NVIC_IRQChannelPreemptionPriority = 1;        //设置抢占优先级
    NVIC_Initx.NVIC_IRQChannelSubPriority = 2;                        //设置响应优先级
    NVIC_Init(&NVIC_Initx);
    
    
    //5、启动定时器
    TIM_Cmd(TIM2,ENABLE);
}


//构建中断服务函数,在.s启动文件中找
void TIM2_IRQHandler()
{
    //交替闪烁    
    //如果B5输出为1 则B5输出为0 E5输出1
    if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))
    {
        LED1_ON;
        LED2_OFF;
    }
    else    //如果B5输出为0 则B5输出为1 E5输出0
    {
        LED2_ON;
        LED1_OFF;
    }
    //                否则B5输出为1 E5输出为0
    
    //清除中断标记位        如何已经触发过来,再次使用不清除就一直是触发过后的高电平
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}

tim.h配置

#ifndef __TIM_H
#define __TIM_H


#include "stm32f10x.h"
void Tim_init(u16 arr,u16 psc);

#endif

usart.c配置

#include "stm32f10x.h"
#include "usart.h"

void Usart_Init(int bsp)
{
    GPIO_InitTypeDef Initx;
    NVIC_InitTypeDef NVIC_Initx;
    USART_InitTypeDef USART_Initx; 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);//开io时钟
    
    //1、io设置 A9复用推挽和A10浮空 复用
    //初始化 A9复用推挽 A10浮空 复用
    Initx.GPIO_Mode = GPIO_Mode_AF_PP;
    Initx.GPIO_Pin = GPIO_Pin_9;
    Initx.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&Initx);//A9复用推挽
    
    Initx.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    Initx.GPIO_Pin = GPIO_Pin_10;
    Initx.GPIO_Speed = GPIO_Speed_50MHz;    
    GPIO_Init(GPIOA,&Initx);//A10浮空 复用
    
    //2、开串口1时钟
    //3、设置串口1的工作方式
    USART_Initx.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//输入和输出
    USART_Initx.USART_Parity = USART_Parity_No;//无奇偶校验 Even偶校验 Odd奇校验
    USART_Initx.USART_StopBits = USART_StopBits_1;//帧结尾传输一个停止位
    USART_Initx.USART_WordLength = USART_WordLength_8b;//9位数据位
    USART_Initx.USART_BaudRate = bsp;//波特率
    USART_Initx.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制
    USART_Init(USART1,&USART_Initx);
    //4、打开串口的 “接收” 数据中断
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//接收中断
    //5、设置中断优先级
    
    NVIC_Initx.NVIC_IRQChannel = USART1_IRQn;//配置目标USART1 全局中断
    NVIC_Initx.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Initx.NVIC_IRQChannelPreemptionPriority = 2;        //设置抢占优先级
    NVIC_Initx.NVIC_IRQChannelSubPriority = 2;                        //设置响应优先级
    NVIC_Init(&NVIC_Initx);
    
    //6、启动串口
    USART_Cmd(USART1,ENABLE);
    
}
void USART1_IRQHandler()
{
    u16 data;
    if(USART_GetITStatus(USART1,USART_IT_RXNE))    //是接收中断就触发此条件
    {
        data = USART_ReceiveData(USART1);//读数据
        USART_SendData(USART1,data);//把data数据发出去
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标记位        
    }//可能有多个原因引起串口中断
    //else if(xxx中断)

}

 

usart.h文件配置

 #ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"
void Usart_Init();

#endif

main.c配置

#include "stm32f10x.h"
#include "tim.h"
#include "usart.h"

int main()
{
    u16 data;
    u8 num[6],i = 0;
    //中断分组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    Tim_init(999,8999);
    Usart_Init(115200);
    

    //delay_init();
    //编写程序功能
    //BEEP_ON;
    while(1){;
        //读取定时器的当前值
        data = TIM_GetCounter(TIM2);
        i = 0;
        //拆分当前值
        while(data)
        {
            num[++i] = data %10;//把个位放入数组中保存
            data = data / 10;//去掉当前数的个位
        }
        //发送当前值
        for(;i>=1;i--)
        {
            USART_SendData(USART1,num[i]+'0');
            while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==0);
        }
        //发完一组数据,换行
        USART_SendData(USART1,'\r');
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==0);
        USART_SendData(USART1,'\n');
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==0);
    }
    return 0;
}

运行结果:

总结

USART 是一种功能强大的串行通信接口,广泛应用于各种嵌入式系统和物联网设备中。通过合理配置 USART 参数,可以实现高效、稳定的数据传输。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux - 进程等待和进程替换

进程等待 前面我们了解了如果父进程没有回收子进程, 那么当子进程接收后, 就会一直处于僵尸状态, 导致内存泄漏, 那么我们如何让父进程来回收子进程的资源. waitpid 我们可以通过 Linux 提供的系统调用函数 wait 系列函数来等待子进程死亡, 并回收资源. #include <sys/t…

虚拟主机怎么选哪家的性价比高

选择虚拟主机不能只看价格&#xff0c;还要看质量和服务&#xff0c;稳定快速的虚拟主机再加上优质的售后服务&#xff0c;才可令网站顺利运行&#xff0c;站长才无后顾之忧。 选虚拟主机或云服务器还是要选大牌主机商的产品比较好&#xff0c;质量和服务更有保障&#xff0c;例…

英文论文翻译成中文,怎样翻译更地道?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 最近学员群有同学问&#xff0c;英文论文翻译成中文的解决方案—“DeepL翻译出来的内容总是有点别扭&#xff0c;ChatGPT能翻译的地道一些吗&#xff1f;”。 正好有位刚加入的…

40分钟学 Go 语言高并发:服务监控与追踪

服务监控与追踪 一、知识要点总览 模块核心内容技术选型难度监控指标请求量、响应时间、错误率、资源使用Prometheus Grafana中链路追踪分布式调用链、性能瓶颈分析Jaeger, OpenTelemetry高日志处理日志收集、分析、存储ELK Stack中告警系统告警规则、通知渠道、告警分级Ale…

【Unity高级】如何实现粒子系统的间歇式喷射

先看下要最终实现的效果&#xff1a; 代码如下&#xff1a; using UnityEngine; using System.Collections;public class ParticleBurstController : MonoBehaviour {private ParticleSystem _particleSystem; // 获取粒子系统public float burstDuration 2f; // 每次…

clipchamp制作视频文字转语音音频

一.准备工作&#xff1a; 1.在浏览器打开 https://app.clipchamp.com/首次打开需要登录&#xff0c;未登录用户注册登录 2.点击右上角头像到Settings页面&#xff0c;点击Language切换到中文&#xff08;英文水平好的可以忽略此步骤&#xff09;因中文英文界面有微小差异&…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

三菱伺服通过MR Configurator2进行的试运行模式

(1)试运行模式 (a)JOG运转 可以不使用伺服系统控制器执行J0G运行。请在解除强制停止的状态下使用。无论伺服0N/伺服OFF或伺服系统控制器有无连接均可使用。 通过MR Configurator2的J0G运行画面进行操作。 1)运行模式 2)运行方法 "“仅在长按正转、反转按钮中运行”的复选框…

Sqoop导入数据(mysql---->>hive)

目录 数据传输流程脚本报错和异常说明1. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf2. 数据导入hive后显示NULL 数据传输流程 mysql---->>hdfs---->>hive 数据从mysql表中取出&#xff0c;放到hdfs上&#xff08;由targ…

Flask返回中文Unicode编码(乱码)解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【C++AVL树】枝叶间的旋律:AVL树的和谐之道

公主请阅 1.AVL树的概念2.AVL树的插入AVL树插入一个值的大概过程平衡因子更新更新原则更新停止条件 3.AVL树的右转旋转的原则右单旋 4.AVL树的左旋左单旋 5.AVL树的左右双旋6.AVL树的右左双旋7.AVL树的模拟实现 1.AVL树的概念 AVL树是最先发明的自平衡二叉查找树&#xff0c;AV…

深入理解C#的TCPIP通信机制

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;在分布式系统和实时数据交换应用中&#xff0c;C#作为一种现代面向对象编程语言&#xff0c;利用其***命名空间下的Socket类&#xff0c;提供强大的TCP/IP通信功能。本文将探讨C#中TCP/IP通信的基本概念、使用方…

基于yolov8的SAR影像目标检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的SAR影像目标检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的SAR影像目标…

Prime2_解法二:openssl解密凭据

Prime2_解法二&#xff1a;openssl解密凭据 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担全…

Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1

文章目录 Jenkins环境一站式教程&#xff1a;从安装到配置&#xff0c;打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、安装配置Jenkins2.1 安装JDK…

K8S命令部署后端(流水线全自动化部署)

前言 本文为链接: 云效流水线k8s半自动部署java&#xff08;保姆级&#xff09;的补充,本文起初的目的是为了补充完善k8s流水线的全自动化部署,但是也适用于k8s的一键重启,因为使用k8s的web页面容易出现漏点的情况,因此也可以把代码保存为shell脚本,同样可以实现一键重启。关于…

力扣-图论-7【算法学习day.57】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

TEA系列例题

解析 TEA 加密算法(C语言、python)&#xff1a;_tea加密-CSDN博客 CTF-RE 从0到N: TEA_tea加密原理-CSDN博客 1 字节 8 位 牢记密文的64位和密钥的128位,最好可以自己独立的写出tea解密代码 相当于密文是传入8个字符类型数据或者是2个整型数据, 密钥是16个字符数据或者4个…

首批|云轴科技ZStack成为信通院AI Cloud MSP技术服务实验室成员单位

近日&#xff0c;由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;、中国通信企业协会承办的云AI计算国际合作论坛在京举行&#xff0c;会上公布了AI Cloud MSP&#xff08;人工智能云管理服务提供商&#xff09;技…

Docker安装部署RabbitMQ

1. Docker环境准备 1.1 安装Docker 在开始Docker安装部署RabbitMQ之前&#xff0c;确保您的系统环境已经满足Docker的运行要求。以下是在不同操作系统上安装Docker的步骤和命令行演示。 对于Linux系统 在基于Debian的系统&#xff08;如Ubuntu&#xff09;上&#xff0c;您…