基于正点原子stm32mini板的串行通信原理

本文详细介绍了STM32的UART异步通信原理,包括串行通信的两种方式、STM32的串口接口、硬件连接、通信特点、参数设置以及寄存器库函数配置。此外,还提供了串口通信实验的代码示例,展示了如何实现全双工异步通信,并通过中断处理数据传输。
摘要由CSDN通过智能技术生成

本篇文章将讲述正点原子stm32mini板的串行通信原理,小白总结,如有错误,请大神指教。

目录

一、通信双方的两种通信方式

二、STM32的串口通信接口

三、硬件连接

四、STM32UART异步通信方式特点:

五、STM32串口异步通信需要定义的参数:

六、STM32串口寄存器库函数配置


一、通信双方的两种通信方式

(1)并行通信

传输原理:数据各个位同时传输

优点:速度快

缺点:占用引脚资源多

(2)串行通信

传输原理:数据按位顺序传输

优点:占用引脚资源较少

缺点:速度相对较慢

(3)串行通信分类:

<1>单工通信:数据传输只支持数据在一个方向上传输。

<2>半双工通信:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。

<3>全双工通信:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式结合,它要求发送设备和接收设备都有独立的接收和发送能力。

串行通信的三种传送方式:

(4)串行通信的通信方式

<1>同步通信:带时钟同步信号传输——SPI,IIC通信接口

<2>异步通信:不带时钟同步信号——UART(通用异步收发器),单总线

二、STM32的串口通信接口

UART:通用异步收发器

USART:通用同异步收发器

三、硬件连接

 串口的连接要RX连接TX,TX连接RX。

四、STM32UART异步通信方式特点:

(1)全双工异步通信。

(2)分数波特率发生器系统,提供精准的波特率——发送和接受共用的可编程波特率,最高可达4.5Mbits/s。

(3)可编程的数据字长度(8位或者9位)。

(4)可配置的停止位(支持1或者2位停止位)。

(5)可配置的使用DMA多缓冲器通信。

(6)单独的发送器和接收器使能位。

(7)检测标志:①接收缓冲器②发送缓冲器空③传输结束标志

(8)多个带标志的中断源,触发中断。

(9)其他:校验控制,四个错误检测标志。

五、STM32串口异步通信需要定义的参数:

①起始位②数据位(8位或9位)③奇偶校验位(第9位)④停止位(1,15,2位)⑤波特率设置

六、STM32串口寄存器库函数配置

(1)常用的串口相关寄存器:USART_SR状态寄存器、USART_DR数据寄存器、USART_BRR波特率寄存器。

(2)波特率计算方法

 可以使用这个公式来计算波特率

(3)串口操作相关库函数(省略入口参数):

void USART_Init();//串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断
void USART_SendData();发送数据到串口,DR
uint16_t USART_ReceiveData();//接收数据,从DR读取接收到的数据
FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位

(4)串口配置的一般步骤(一般这些函数工程模板里有,这块写出来只是熟悉一下函数的功能)

①串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();

②串口复位:USART_DeInit();//这一步不是必须的

③GPIO端口模式设置:GPIO_Init();模式设置为GPIO_Mode_AF_PP

④串口参数初始化:USART_Init();

⑤开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)

NVIC_Init();

USART_ITConfig();

⑥使能串口:USART_Cmd();

⑦编写中断处理函数:USARTx_IRQHandle();

⑧串口传输状态获取:FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx,uint16_t USART_FLAG);

void USART_ClearITPendingBit(USART_TypeDef* USARTx,uint16_t USART_IT);

七、串口通信实验代码

main.c里

#include "sys.h"
#include "usart.h"		
#include "delay.h"	
#include "led.h" 
#include "key.h" 
#include "stdio.h"
//ALIENTEK Mini STM32¿ª·¢°å·¶Àý´úÂë3
//´®¿ÚʵÑé   
//¼¼ÊõÖ§³Ö£ºwww.openedv.com
//¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
 
int main(void)
{			
	u8 t;
	u8 len;	
	u16 times=0;  
	Stm32_Clock_Init(9); //ϵͳʱÖÓÉèÖÃ
	delay_init(72);	     //ÑÓʱ³õʼ»¯ 
	uart_init(72,9600);	 //´®¿Ú³õʼ»¯Îª9600
	LED_Init();		  	 //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú    
	while(1)
	{
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
			printf("\r\nÄú·¢Ë͵ÄÏûϢΪ:\r\n");
			for(t=0;t<len;t++)
			{
				USART1->DR=USART_RX_BUF[t];
				while((USART1->SR&0X40)==0);//µÈ´ý·¢ËͽáÊø
			}
			printf("\r\n\r\n");//²åÈë»»ÐÐ
			USART_RX_STA=0;
		}else
		{
			times++;
			if(times%5000==0)
			{
				printf("\r\nALIENTEK MiniSTM32¿ª·¢°å ´®¿ÚʵÑé\r\n");
				printf("ÕýµãÔ­×Ó@ALIENTEK\r\n\r\n\r\n");
			}
			if(times%200==0)printf("ÇëÊäÈëÊý¾Ý,ÒԻسµ¼ü½áÊø\r\n");  
			if(times%30==0)LED0=!LED0;//ÉÁ˸LED,ÌáʾϵͳÕýÔÚÔËÐÐ.
			delay_ms(10);   
		}
	}	 
}

然后剩下的就和模板一模一样就好。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FPGAI

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

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

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

打赏作者

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

抵扣说明:

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

余额充值