STM32F103ZET6 串口

【 0. 通信的分类 】

根据不同的定义标准有以下不同的分类
在这里插入图片描述

  • 常见串行通信接口
    在这里插入图片描述

  • STM32的串行通信接口
    UART:通用异步收发器(Universal Asynchronous Receiver / Transmitter)
    USART:通用同步/异步收发器 (Universal Synchronous/Asynchronous Receiver / Transmitter)
    (大容量STM32F10x系列芯片,包含3个USART和2个UART)
    本文章只讲 UART。

【 1. UART 】

特点

  1. 全双工异步通信。
  2. 分数波特率发生器系统,提供精确的波特率。
    发送和接受共用的可编程波特率,最高可达4.5Mbits/s。
  3. 可编程的数据字长度(8位或者9位)。
  4. 可配置的停止位(支持1或者2位停止位)。
  5. 可配置的使用DMA多缓冲器通信。
  6. 单独的发送器和接收器使能位。
  7. 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志。
  8. 多个带标志的中断源,触发中断。
  9. 其他:校验控制,四个错误检测标志。

引脚


引脚连接方法:
RXD(Receive External Data):数据输入引脚。
TXD(Transmit External Data):数据发送引脚。
在这里插入图片描述

【 2. 串口通信过程 】

在这里插入图片描述

【 3. 数据位 】

  1. 起始位
  2. 数据位(8位或者9位)
  3. 奇偶校验位(第9位)
  4. 停止位(1,15,2位)
    在这里插入图片描述

【 4. 波特率 】

在这里插入图片描述
在这里插入图片描述

【 6. 相关寄存器 】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【 7. 相关函数 】

初始化串口

void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能 

使能串口

void USART_Cmd();  //使能串口

串口发送数据

void USART_SendData(); //发送数据到串口,DR 

串口接收数据

uint16_t USART_ReceiveData(); //接受数据,从DR读取接受到的数据

获取状态标志位

FlagStatus USART_GetFlagStatus(); //获取状态标志位

清除状态标志位

void USART_ClearFlag(); //清除状态标志位

使能串口中断

void USART_ITConfig(); //使能相关中断

获取串口中断标志位

ITStatus USART_GetITStatus();  //获取中断状态标志位

清除串口中断标志位

void USART_ClearITPendingBit(); //清除中断状态标志位

标志位核心代码
内部程序要求,发送的字符是以回车换行结束(0x0D,0x0A)

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//上一次接收到的数据为0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始(0xod后应该是0x0a)
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //上一次接收到的数据不是0x0d
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;  //这次接收到0x0d,标志位bit14置1
				else   //这次没接收到0x0d,接收到数据位
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;  //存入缓冲区
					USART_RX_STA++;      //有效数据个数+1
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误(大于缓冲区预定长度),重新开始接收	  
					}		 
				}
			}   		 
     } 

【 8. 配置过程 】

  1. 使能串口时钟,使能GPIO时钟。
  2. 配置GPIO端口模式(查表得)。
  3. 串口参数初始化。
  4. 开启中断并且初始化NVIC。(如果需要开启中断才需要这个步骤)。
  5. 使能串口。
  6. 编写中断处理函数。(如果需要开启中断才需要这个步骤)。

【 9. 范例 】

电脑发送字符到STM32,STM32接收并返回给电脑

#include "stm32f10x.h"
void myUSART_InitTypeDef(void)
{
	GPIO_InitTypeDef MyGPIOstruct; 
    USART_InitTypeDef MyUSARTstruct;	
	NVIC_InitTypeDef  MyNVICstruct;
	                                                                       /************①使能相应时钟***********/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //GPIO 时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  //串口时钟使能
                                                                        /*************②初始化GPIO口模式(查表得)*******/
	MyGPIOstruct.GPIO_Mode=GPIO_Mode_AF_PP;   //GPIO模式配置Pin9, TXD
	MyGPIOstruct.GPIO_Pin=GPIO_Pin_9;
	MyGPIOstruct.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&MyGPIOstruct);
	
	MyGPIOstruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;   //GPIO模式配置Pin10,RXD
	MyGPIOstruct.GPIO_Pin=GPIO_Pin_10;
	MyGPIOstruct.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&MyGPIOstruct);
	                                                                      /***********③初始化串口参数***************/
	MyUSARTstruct.USART_BaudRate=115200;  //波特率配置
	MyUSARTstruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  //不适用硬件流
	MyUSARTstruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;    //发送和接收均使能
	MyUSARTstruct.USART_Parity=USART_Parity_No; //不使用奇偶校验位
	MyUSARTstruct.USART_StopBits=USART_StopBits_1;   //一个停止位
	MyUSARTstruct.USART_WordLength=USART_WordLength_8b; //8位字长
	USART_Init(USART1,&MyUSARTstruct);

	                                                                   /************④中断配置******************/
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);   //开启接收中断,接收数据后执行中断函数
	
	MyNVICstruct.NVIC_IRQChannel=USART1_IRQn; //串口1入口参数
	MyNVICstruct.NVIC_IRQChannelCmd=ENABLE;   //使能
	MyNVICstruct.NVIC_IRQChannelPreemptionPriority=1;      //设置抢占优先级 
	MyNVICstruct.NVIC_IRQChannelSubPriority=1;              //设置响应优先级
	NVIC_Init(&MyNVICstruct);   //设置相应中断响应优先级和抢占优先级
	                                                                   /************⑤使能串口******************/
	USART_Cmd(USART1,ENABLE); //使能串口1
}

	                                                                   /************⑥编写中断处理函数******************/
void USART1_IRQHandler(void)
{
	u8 res1;
	if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))  //第二个参数确定中断类型,即接收中断
	{
		res1=USART_ReceiveData(USART1);
	  USART_SendData(USART1,res1);
	}
}


 int main(void)
 {	
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //系统优先级分组2
	 myUSART_InitTypeDef();
	 
	 while(1);
 }
  • 6
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STM32F103ZET6是一款基于ARM Cortex-M3内核的单片机,具有丰富的外设,包括串口模块。而串口Modbus RTU是一种常用的工业通信协议,用于实现不同设备间的通信。 在STM32F103ZET6上实现串口Modbus RTU,需要进行以下步骤: 1. 硬件连接:将STM32F103ZET6串口模块连接到Modbus RTU网络中的设备上,可以通过RS485或者RS232接口进行连接。 2. 配置串口:在STM32F103ZET6上配置串口的参数,包括波特率、数据位、停止位和奇偶校验位等,以适配Modbus RTU的通信要求。 3. 实现Modbus RTU协议:根据Modbus RTU协议的要求,编写程序来处理串口接收到的数据,并解析出Modbus的功能码和数据内容,然后进行相应的处理和响应。 4. 数据交换:根据Modbus RTU协议的指令集,通过串口模块与其他Modbus RTU设备进行数据的发送和接收。可以使用STM32F103ZET6串口发送和接收函数来实现数据的传输。 5. 错误处理:在实现过程中,需要处理Modbus RTU通信过程中可能出现的错误,如校验错误、超时错误等,以保证通信的可靠性。 总之,通过使用STM32F103ZET6串口模块,配合编程实现Modbus RTU协议的数据处理和通信操作,可以实现STM32F103ZET6与其他Modbus RTU设备的通信。同时,可以根据具体应用需求,进一步优化和扩展功能。 ### 回答2: STM32F103ZET6是一款强大的微控制器芯片,它具有串口通信功能,可以用于实现Modbus RTU通信协议。 Modbus RTU是一种常用的串口通信协议,主要用于工业自动化领域。它基于RS-485物理层通信,通过发送和接收数据帧来实现设备之间的通信。 在STM32F103ZET6上实现Modbus RTU通信,需要使用其内置的UART模块,配合相关的软件开发工具进行开发。 首先,我们需要配置UART模块的相关参数,如波特率、数据位数、校验位等。然后,将该模块连接到RS-485通信线路上,以便与其他设备进行数据交换。 接下来,我们需要编写相关的软件代码。在STM32F103ZET6上,可以使用C语言或者汇编语言进行编程。我们需要编写发送和接收函数,以实现Modbus RTU通信的功能。 在发送函数中,我们需要将要发送的数据帧按照协议规定的格式进行封装,并通过UART模块发送出去。在接收函数中,我们需要监听UART模块接收到的数据,并根据协议规定的格式对数据进行解析和处理。 最后,我们可以根据具体的应用需求,设计和实现更高级的功能,如读取和写入数据寄存器、处理异常情况等。 总的来说,STM32F103ZET6可以作为一个强大的控制器,利用其串口功能实现Modbus RTU通信协议。通过合适的配置和编程,我们可以实现设备之间的高效数据交换和控制,从而满足工业自动化应用的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MR_Promethus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值