百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

STM32F103 串口的使用方法

dezehang 2024-11-25 10:48 1 浏览

串口通讯简介:

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式。


通讯结构

设备内部一般以TTL电平传输,设备之间是通过RS232/RS485电平标准传输。

两个设备或者器件要想实现串口通讯,要电平匹配才能够正常通讯。

电平标准

根据使用的电平标准不同,串口通讯可分为 RS232标准及TTL标准,具体标准如下:

在电子电路中,模块之间常使用TTL的电平标准,但其抗干扰能力较弱,为了增加串口的通讯距离及抗干扰能力,使用RS-232电平标准在设备之间传输信息,经常使用MA3232芯片对TTL电平及RS-232电平进行相互转换。


协议层

1.数据包

串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备得RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能正常收发数据。


2.波特率

由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串口初始化结构体来实现。


3.起始和停止信号

数据包的首尾分别是起始位和停止位,数据包的起始信号由一个逻辑0的数据位表示,停止位信号可由0.5、1、1.5、2个逻辑1的数据位表示,双方需约定一致。STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。


4.有效数据

有效数据规定了主题数据的长度,一般为8或9位,其在STM32中也是通过串口初始化结构体来实现的。


5.数据校验

在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、 0 校验(space)、 1 校验(mark)以及无(noparity)。这些也都可以在串口初始化结构体中实现的。


串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,

其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter),

4、5是通用异步串行接口UART(Universal Asynchronous Receiver/Transmitter)。


STM32比51单片机好用的一个地方就是串口比较多,51单片机一般只有2个串口,有时不够用。


下面以USART1为例,说明一下STM32串口设置的一般步骤:

1) 串口时钟使能,GPIO 时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟


2) GPIO端口设置

设置发送和接收引脚的信息,将Tx(发送引脚)配置为推挽复用模式用来发送数据,Rx(接收引脚)配置为浮空输入模式用来接收数据。

GPIO_InitTypeDef GPIO_InitStructure;

//USART1_TX   GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
//USART1_RX      GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10


3)Usart1 NVIC 配置(如果需要开启中断,才进行本步骤的设置)

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);    //根据指定的参数初始化NVIC寄存器

//如果需要接收串口数据,则开启串口接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断


4) 串口参数初始化

USART_InitTypeDef结构体,内部包含串口通讯相关工作参数:

typedef struct {
    uint32_t USART_BaudRate; // 波特率
    uint16_t USART_WordLength; // 字长
    uint16_t USART_StopBits; // 停止位
    uint16_t USART_Parity; // 校验位
    uint16_t USART_Mode; // USART 模式
    uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;


USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

USART_Init(USART1, &USART_InitStructure); //初始化串口1

5) 使能串口

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


6) 编写串口发送函数

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

//发送字符串,遇到字符串结尾标志'\0'结束
void USART1_Send_String(u8 *Data)                 
{
    while(*Data)
        USART1_Send_Byte(*Data++);
}

//按长度发送字符串,这种方法可以发送含0x00的字符串
void USART1_Send_String_By_Lens(u8 *Data, int Len)
{
    int i;
    for(i=0; i<Len; i++)
    {
        USART_SendData(USART1, Data[i]);          
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);      //串口1发送数据
    }
}

//重定向printf函数发送字符串,一般使用此函数直接输出打印调试信息,使用方法跟C语言中的使用方法一致。
int fputc(int ch, FILE *f)
{
    USART_SendData( DEBUG_USARTx,  (uint8_t) ch);
    /* 等待发送完毕 */
    while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
    return ch;
}


7) 编写中断处理函数

//串口1中断服务程序,此接收的数据是以0x0D、0x0A结尾为标志的数据帧。
void USART1_IRQHandler(void)                    
{
    u8 Res;

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    {
        USART_ClearFlag(USART1, USART_IT_RXNE);             //清除标志位
        
        Res =USART_ReceiveData(USART1);    //读取接收到的数据
        
        if((USART_RX_STA&0x8000)==0)//接收未完成
        {
            if(USART_RX_STA&0x4000)//接收到了0x0d
            {
                if(Res==0x0D)
                    USART_RX_STA|=0x4000;
                else if(Res!=0x0a)
                    USART_RX_STA=0;//接收错误,重新开始
                else
                    USART_RX_STA|=0x8000;    //接收完成了
            }
            else //还没收到0X0D
            {    
                if(Res==0x0d)
                    USART_RX_STA|=0x4000;
                else
                {
                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                    USART_RX_STA++;
                    if(USART_RX_STA>(USART_REC_LEN-1))
                        USART_RX_STA=0;//接收数据错误,重新开始接收      
                }         
            }
        }
     }
}


接收完数据之后,在main函数中对接收到的数据进行处理。

if(USART_RX_STA&0x8000)
{
    //得到此次接收到的数据长度,即USART_RX_BUF数组中的有效数据长度
    uart1Len=USART_RX_STA&0x3f;                   
            
    //对接收到的数据进行数据处理,接收的数据暂存在USART_RX_BUF数组中   
    //... ... 
            
    USART_RX_STA=0;   
    memset(USART_RX_BUF, 0, sizeof(USART_RX_BUF));        //清空数组  
}


串口应用:

  • 与TTL串口传感器或模块直接通讯;
  • 转为RS232与PC通讯;
  • 转为RS485与485部件的传感器或器件通讯;


USB转串口的原理图:

使用CH340C芯片的话,就可以省略外部晶振了,可以节省PCB布局空间;

win7系统一般选择CH340作为USB转串口驱动,Win10系统下选择CH341驱动作为USB转串口驱动;


TTL串口转RS232原理图:


TTL串口转RS485原理图:

RS485总线一般使用时默认处于接收状态。


参考资料:

【正点原子】MiniSTM32开发板资料


喜欢请关注微信公众号:程序员小哈

有啥想玩的模块,留言给我,咱们一起玩


相关推荐

WIN10系统如何安装UG10.0

随着科技的不断进步与更新,现在有很多公司己经安装上了WIN10的系统以及使用UG10.0了,但很多人反映WIN10系统安装UG10.0不好装,以下详细介绍一下1如果WIN10系统没有自带有JAVA需...

自学UG编程的心得分享

为什么有的人3个月学会基本的UG建模画图编程,有的断断续续3——5年才学会,还有的人干了7年的加工中心还不会电脑画图编程。这是什么原因?1.顾虑太多,什么都想得到,什么都想一起抓,总是上班加班没时间,...

UG/NX 绘制一个捞笊(zhào)模型,或者也可以叫它漏勺?

今天我们来看看这个模型,起因是群里有小伙伴说要做一个捞笊的模型,看见这名字直接给我整懵了,然后他发了张家里漏勺的图片才知道原来这玩意还有个这种名字。这东西相信每个小伙伴家里都有吧,它的建模方法也比较...

再也不用为学UG编程发愁了!380集最新UG资料免费送

上期发的UG教程很多粉丝都领到了,收获越来越多的好评!有你们一直陪伴真的很高兴,谢谢各位粉丝!为了给大家提供更优质的资源,这两个月都在整理你们最关心的UG资源,都是多位编程工厂老师傅的工厂实战精华,真...

优胜原创UG_3-4-5轴后处理下载

反复上机调试,安全稳定可靠,请放心使用2020.11.21,修复YSUG4-5轴后处理锁轴输出...

青华模具学院-UG10.0安装文件说明

青华模具学院分享:今天我们来跟大家一起学习NX10.0版本的安装方法,网上有很多这个版本的安装视频以及方法图文,但到最终安装软件时仍有很多新手对安装仍然感到头痛,基于这样的情况,我们特别就NX10.0...

UGnx10安装说明

温馨提示,安装前,请退出杀毒软件,关闭防火墙,因为这些软件可能阻断NX主程序和许可程序间的通信,导致安装后,软件无法启动。1、解压下载后的压缩包,右键,选择‘’解压到UGNX10_64位正式版(csl...

正版UG软件,正版UG代理,正版软件和盗版软件的区别

大家都知道,UG软件是制造业必不可少的一款三维软件,广泛应用于:CAE(有限元分析),CAD(产品设计/模具设计),CAM(计算机辅助制造编程),那么有人不禁要问了,正版软件和盗版软件在使用上有明显区...

非常全面的UG加工模块中英对照(图标注释)

大家好,我是粥粥老师,听说很多同学都在学习UG但是没有学习资料和安装包,今天粥粥老师就全部打包好免费发放给你们,那么怎么获取全套资料图档安装包呢领取途径①关注②评论、点赞、转发③私信“UG或者...

腾讯自研Git客户端 UGit|Git 图形界面客户端

支持平台:#Windows#macOS腾讯推出的一款Git图形界面客户端,简化了Git的使用流程,特别适合处理大型项目和文件。支持直接提交和推送操作,避免在大规模项目中由于远程频繁变更而导致...

经典收藏:UG重用库的一些不为人知小技巧

免费领取UG产品编程、UG多轴UG模具编程、安装包安装教程图档资料关注私信我“领取资料”,即可免费领取完整版,感谢支持,爱你们哟,么么主题:UG后处理+仿真+外挂UG重用库的正确使用方法:首先有...

UG编程常用指令G、M代码,快收藏好

今天给大家分享数控编程常用的指令代码,希望对正在学习路上的你带来一丝丝帮助。最好的方法就是转发到自己空间,方便以后学习。对了,如果你还需要其他UG教程学习资料,CNC加工中心的一些参数,以及UG画图,...

UG NX7.0中文版从入门到精通

Unigraphics(简称UG)是一套功能强大的CAD/CAE/CAM应用软件,UGNX7是其最新版本。《UGNX7从入门到精通(中文版)》以UGNX7为平台,从工程应用的角度出发,通过基...

经典UG建模基础练习图纸

UG是目前工作中比较优秀拥有大量用户的一款机械模具产品行业三维设计软件,cam加工丶软件支持全中文汉化;能够带给用户更为非凡的设计与加工新体验。很多朋友私信小编问有没有UG建模练习图纸,今天给大家分享...

UG NC软件基础操作,如何设置UG草图精度

默认情况下我们绘制草图一般只保留一位小数,即使你输入多位小数软件也会自动四舍五入,这个你做一些国标的图还好,国标以毫米为单位,一般保留小数点后一位就够了,但如果你做的图是英制单位,那么保留一位小数肯定...