一、串行通信的通信方式


1.同步通信:带时钟同步信号传输,有一根线是同步时钟。例如SPI(全双功)、IIC(半双工)通信接口


2.异步通信:不带时钟同步信号,必须约定好波特率。例如UART(全双功)


二、STM32的串口通信接口


UART:通用异步收发器。


USART:通用同步异步收发器。


STM32F10x系列包含3个USART和2个UART。

都是TTL电平交叉相连即可

与PC机可以使用USB-TTL进行通信。


三、通信引脚

四、常用串口相关寄存器


1.USART_SR状态寄存器:里面一些相关位可以用来判断是否发送接收完成等。


2.USART_DR数据寄存器:通过读写这个寄存器来发送接收数据


3.USART_BRR波特率寄存器:


波特率计算方法:波特率=fPLCLKX /(16*USARTDIV);USARTDIV=72000000/(115200*16)=39.0625


DIV_Fraction=16*0.0625=1=0X01;(小数部分)


DIV_Mantissa=39=0X27;(整数部分)


从而得到USART_BRR波特率寄存器的值为0X0271,这就是115200的波特率对应的寄存器值。


五、串口操作相关库函数


void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);


串口初始化:波特率,数据字长,奇偶校验,硬件控制流以及收发使能。


第一个成员变量是串口标号,第二个成员变量是结构体


typedef struct


{


  uint32_t USART_BaudRate;  //波特率          


  uint16_t USART_WordLength;       //位长,8位或9位  


  uint16_t USART_StopBits;          //停止位


  uint16_t USART_Parity;             //奇偶校验位


  uint16_t USART_Mode;              //使能输入输出


  uint16_t USART_HardwareFlowControl; //硬件流控制


} USART_InitTypeDef;


 


void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);


使能串口


 


void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);


使能相关中断


 


void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);


发送数据到串口


 


uint16_t USART_ReceiveData(USART_TypeDef* USARTx);


从串口接收数据


 


FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);


获取状态标志位


 


void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);


清除状态标志位


 


ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);


获取中断状态标志位


 


void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);


清除中断状态标志位


 


六、串口配置一般步骤


1.串口时钟使能


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    


2.串口复位(不是必须的)


USART_DeInit();


3.GPIO模式设置


对GPIO口输入输出的设置


4.串口初始化设置


USART_Init(USART1, &USART_InitStructure); 


5.开启中断并且初始化NVIC


NVIC_Init();


USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);


6.使能串口


USART_Cmd(USART1, ENABLE);  


7.编写中断处理函数


void USART1_IRQHandler(void)   


8.串口数据收发


void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);


uint16_t USART_ReceiveData(USART_TypeDef* USARTx);


9.串口传输状态获取


ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);


void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);


七、串口初始化程序编写


void uart_init(u32 bound){


    GPIO_InitTypeDef GPIO_InitStructure;


    USART_InitTypeDef USART_InitStructure;


    NVIC_InitTypeDef NVIC_InitStructure;


     


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);   


  


    //GPIOA.9发送GPIO配置


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 


  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 


  GPIO_Init(GPIOA, &GPIO_InitStructure);


   


  //GPIOA.10接收GPIO配置


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


  GPIO_Init(GPIOA, &GPIO_InitStructure);


 


  // NVIC 配置(在主函数中需要对NVIC设置分组)


    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;


    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;


    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        


    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           


    NVIC_Init(&NVIC_InitStructure);    


  


   //对USART配置波特率、停止位、校验位等配置


    USART_InitStructure.USART_BaudRate = bound;


    USART_InitStructure.USART_WordLength = USART_WordLength_8b;


    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); 


 


    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能接收中断


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


}

关键字:STM32F103  UART  通信讲解 引用地址:STM32F103 UART通信讲解

上一篇:为物联网应用开发提速 STM32MP1 MPU贸泽开售
下一篇:STM32F103 时钟配置

推荐阅读

   在今天早上联想集团副总裁常程在微博上宣布,将于10月18日在北京举办联想S5 Pro新品发布会,据了解该机将是上半年发布的S5的升级版,将主打“偶像级”自拍。从官微放出的联想S5 Pro预热海报中可以看到,联想S5 Pro的额头隐隐出现了两个摄像头,由此可以推测该机将提供前置双摄+后置双摄的组合。在今年3月份联想已经发布了全面屏机型联想S5,采用...
问题: 如何测量不同光源的光强度? 回答: 拿一只红光、绿光、蓝光LED。 光强度的确定可能至关重要,例如,在设计房间的照明或准备拍摄照片时。在物联网(IoT)时代,确定光强度对于所谓智能农业也有着重要作用。在这种情况下,一项关键任务是监测和控制重要的植物参数,以促进植物最好地生长并加速光合作用。因此,光是最重要的因素之一。大多数植物通常吸...
据外媒报道,realme将于本月7日在海外举办发布会,届时将会带来全新的realme 7系列新机。近日realme印度CEO表示,将会在欧洲推出支持更高快充的realme 7系列机型,同时还放上了realme的125W快充头,这是在暗示什么吗?据悉realme海外发布会将于7日举办,新机realme 7系列可能会搭载最先进的125W超级快充技术,官方表示仅需3分钟即可将4000mAh电池充至33...
技术部署PLC数据采集处理基于远程服务器组态软件的数据解析控制,将数据通过无线4G的方式传输到服务器,使多项目点进行集中管理控制。由于PLC的应用场景不同,通信接口各异。串口使用欣仰邦4G DTU实现数据采集,只需要在DTU配置工具中写入服务器端口及地址即可。对于网口的PLC,实现远程数据传输,就难度比较大,需要通过企业内网,将多个PLC架设成同个局...

史海拾趣

问答坊 | AI 解惑

想从Ansoft Designer导出数据的xdjm看过来

以前在本版常看到有人问如何从designer导出S曲线、方向图等问题,似乎一直没有得到解决,查看软件帮助,里面的提示也是错误的。这次我自己碰到了这个问题,不得不潜心研究一番,现将结果公布如下,希望不会是toooooooooold。 在HFSS中,生成re ...…

查看全部问答∨

PSoC在LG“巧克力”手机中的应用探密

如果您正在设计一款手机,您必须解决的关键问题就是能将多少功能集成到尽可能小的空间中。手机的功能是否越多越好?这可不一定。很多人常常碰到难用的手机,就是因为这些手机在过小的空间内塞进了过多的功能。 如何将多种功能整合在一个较小空间内 ...…

查看全部问答∨

Linux发行版,你了解么?

作者:孙天泽,华清远见嵌入式学院金牌讲师。 从1991年诞生的那天起,Linux内核就在全世界的黑客们精心呵护下不断发展壮大。很多Linux Fans想为Linux内核做贡献,但或许是包括技术在内的等等原因,你的Ideas不一定会被内核容纳。对于操作系统来 ...…

查看全部问答∨

PLC与PC串口RTU通讯问题

最近写了一个PC与PLC 串口通信的小程序,我对PLC一点都不了解,主要是读取寄存器的值. 我想问问 1 PLC的地址怎么表示,只有一台PLC通过USB转串口连接PC 2 RTU模式读取数,我是不是也应该在PLC上设置成RTU? (施耐德的PLC 怎么设置?) …

查看全部问答∨

PC可以直接使用手机显示屏吗?

有个工控设备,其中内置一台个人电脑(PC全内置主板),需要配备显示器和键盘。 因为安装空间太小,容纳不了普通CRT或笔记本LCD显示器。况且,该设备的用户界面很简单,只需要控制串口通讯以及操作一个简单的ACCESS数据库,使用带触摸的2.5~3.5寸 ...…

查看全部问答∨

VS2005下的类视图分页下,一个类在类列表里面看不到,怎么回事?.h和.cpp文件工程下都加进去了。

VS2005下的类视图分页下,一个类在类列表里面看不到,怎么回事?.h和.cpp文件工程下都加进去了。…

查看全部问答∨

EVC pocket pc 2003程序和VS2005 pocket pc SE2003程序区别及问题!

EVC下pocket pc 2003和VS2005 pocket pc se 2003模拟器有什么区别???? 是这样的,我在EVC下pocket pc 2003下编译成功并能运行的一个.exe文件直接共享在VS2005 pocket pc se 2003下,但是却点击运行不了.出现如下错误: connot find "mfctest"(// ...…

查看全部问答∨

维纶触摸屏MT6系列产品问题

前几日使用维纶触摸屏MT6100I系列产品,大约7天后发现故障: 基本症状如下: 黑屏与维纶手型标志交替闪动. 咨询厂家说: 没有遇到此类情况. 把屏返回厂家说,测试了几天,没有发现故障. 大约7天后,另外一个工地,同样的屏出现了同样的故障.即黑屏与维纶手 ...…

查看全部问答∨

Stellaris ICDI ND manual(811国产板使用说明书)

附:stellaris_icdi_switch转换工具的使用说明…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved