嵌入式软件--stm32 DAY 5 USART串口通讯(上)

发布于:2025-05-01 ⋅ 阅读:(84) ⋅ 点赞:(0)

前边我们学的都是通用的功能,例如GPIO、中断,现在我们要学习的是某一个特定的功能。典型的就是通讯功能。其中,最简单的通讯协议就是串口了。

一、串口_通讯基础知识

1.1 串行与并行

按数据传送的方式分类的。

串行通信一位一位传输,并行则是8位(16、32位)同行。(按位传输)

频率越高,电流产生电磁场,干扰越大。

早期用的硬盘ATA,后来有了SATA硬盘(S是串行的意思)

传输接口基本上都是串行。

1.2 单工、半双工、全双工

单工传输:数据单向传输,只能A-->B

半双工传输:数据双向传输,但同一时刻只能传一个方向,不可同时。如对讲机!

全双工传输:至少2条线,同时双向传输。

1.3 同步和异步

同步和异步区别:有无时钟!

同步至少两根线:一个传输时钟信号,一个传输数据信号

异步只有一根线,单工或半双工

二、串口通讯:

两根线实现全双工

串口通讯协议:

波特率:

奇偶校验位:

奇校验:所有1加起来是一个奇数

偶校验:所有1加起来是一个偶数

空闲位:

分数波特率的产生

小数部分:DIV_Fraction

整数部分:DIV_Mantissa

状态寄存器SR

IDEA:0没有检测到空闲 ,1检测到空闲总线

TXE:

TC:

RXNE:

控制寄存器1USART_CR1

控制寄存器2USART_CR2

三、USART外设

同步异步收发器,串行通信设备,全双工数据交换。

UART与USART相比去掉了同步通讯功能

USART1通讯速率最高,可以达到4.5Mbps。2,3,4,5最高只有USART1的一半。

我们在stm32中,调试口用USART1.

以前台式电脑,就是以上的Bj9接口. 

UART是异步收发器。UART,有时指设备,有时指协议。

RS485两根线,作差分传输,半双工。

四、波特率设置

分数波特率的产生

接收器和发送器的波特率在USARTDIV的整数和小数寄存器中的值应设置成相同。

fck=72MHZ

如果DIV_Mantissa=27,整数是27,DIV_Fraction=12(USART_BRR=0x1BC),小数是12.

例二是我们要常用的,可以配波特率。

五、串口所用寄存器

TDR

RDR

检测到空闲帧,IDLE置1.

六、寄存器实现

目前很多电脑没有串口接口,为了使用串口,我们自制的下载器STLink2.1拥有USB转串口的功能。

所用引脚:

上位机,串口调试工具:

文末给大家分享的资料包里有。我们能通过串口工具向stm32发信息。当然stm32要想收到,必须有相应的接收程序。

2.1 创建工程

 

创建新的外设代码文件USART

 

有了新的文件,KEIL里面必须配置上。

 

之后便是通过VSCODE打开。

2.2 代码编写 

将usart.c和usart.h,预处理编码做好。声明需要编写的函数。

我们用的usart1在APB2系统总线上。

我们也要开启GPIO的时钟,因为有输入输出。

usart.h

#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"
//初始化
void USART_Init(void);

//发送一个字符
void USART_SendChar(uint8_t ch);

//接收一个字符
uint8_t USART_ReceiveChar(void);

#endif

usart.c 

#include "usart.h"

//初始化
void USART_Init(void)
{
   //开启时钟
   RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
   RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

   //GPIO工作模式
   // PA9:TX 复用推挽输出,CNF=10,MODE=11
   GPIOA->CRH |= GPIO_CRH_MODE9;
   GPIOA->CRH |= GPIO_CRH_CNF9_1;
   GPIOA->CRH &= ~GPIO_CRH_CNF9_0;
   // PA10:RX 浮空输入,CNF=01,MODE=00
   GPIOA->CRH &= ~GPIO_CRH_MODE10;
   GPIOA->CRH &= ~GPIO_CRH_CNF10_1;
   GPIOA->CRH |= GPIO_CRH_CNF10_0;
   
   //串口模块设置
   //设置波特率 115200
   USART1->BRR = 0x271;
   //使能串口和收发模块
   USART1->CR1 |= USART_CR1_UE;
   USART1->CR1 |= (USART_CR1_TE|USART_CR1_RE);
   //配置数据帧格式
   USART1->CR1 &=~ USART_CR1_M;   //长度为8位的数据,没有校验位
   USART1->CR1 &=~ USART_CR1_PCE;  //无校验,不使用校验位
   USART1->CR2 &=~ USART_CR2_STOP;  //1位停止位
   }

//发送一个字符
void USART_SendChar(uint8_t ch)
{
   //判断TDR是否为空,必须等待TDR为空才能写入数据,也就是继续发送
   while((USART1->SR & USART_SR_TXE)==0)
   {

   }

   //将要发送的数据写入TDR
   USART1->DR = ch;
}

//接收一个字符
uint8_t USART_ReceiveChar(void)
{
  //判断RDR是否非空。必须有数据才能读取数据
  while((USART1->SR & USART_SR_RXNE)==0)
  {
    
  }
  //读取接收到的数据,返回
  return USART1->DR;
}

main.c

#include "usart.h"
#include "delay.h"

int main(void)
{
	//1.初始化
    USART_Init();
	
	//发送单个字符
	USART_SendChar('A');
	USART_SendChar('B');
	USART_SendChar('C');
	USART_SendChar('\n');
	while(1)
	{
		
	//不停发送字符
		USART_SendChar('D');
		USART_SendChar('\n');
		//延时
		Delay_ms(500);
	}
	
}

 

还可以看看接收,接收到我们在软件中发送的,再次发到软件。

这样可能不太明显,如果我们在软件上位机发给stm32一个小写字母,我们32端收到后,将其转化为大写字母,再次发到上位机。因为小写字母与大写字母在ASCII值相差32,所以只要做差即可

 

七、资料

stm32开发官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘


网站公告

今日签到

点亮在社区的每一天
去签到