0
点赞
收藏
分享

微信扫一扫

stm32f407探索者开发板(十六)——串行通信原理讲解-UART


文章目录

  • ​​一、串口通信接口背景知识​​
  • ​​1.1 处理器与外部设备通信的两种方式​​
  • ​​1.2 按照数据传送方向​​
  • ​​1.3 是否带有时钟信号​​
  • ​​1.4 常见的串行通信接口​​
  • ​​二、STM32F4串口通信基础​​
  • ​​2.1 STM32的串口通信接口​​
  • ​​2.2 UART异步通信方式引脚连接方法​​
  • ​​2.3 UART异步通信方式引脚(STM32F407ZGT6)​​
  • ​​2.4 UART异步通信方式特点​​
  • ​​2.5 STM32串口通信过程​​
  • ​​2.6 STM32串口异步通信需要定义的参数​​
  • ​​三、STM32串口框图​​

一、串口通信接口背景知识

1.1 处理器与外部设备通信的两种方式

  • 并行通信
    传输原理:数据各个位同时传输。
    优点:速度快
    缺点:占用引脚资源多
  • 串行通信
    传输原理:数据按位顺序传输。
    优点:占用引脚资源少
    缺点:速度相对较慢

串行通信:

1.2 按照数据传送方向

单工:

数据传输只支持数据在一个方向上传输

半双工:

允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;

全双工:

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

stm32f407探索者开发板(十六)——串行通信原理讲解-UART_数据

1.3 是否带有时钟信号

  • 同步通信:带时钟同步信号传输。
    SPI,IIC通信接口
  • 异步通信:不带时钟同步信号。
    UART(通用异步收发器),单总线

1.4 常见的串行通信接口

stm32f407探索者开发板(十六)——串行通信原理讲解-UART_串口_02

二、STM32F4串口通信基础

2.1 STM32的串口通信接口

  • UART:通用异步收发器
  • USART:通用同步异步收发器
    STM32F4XX目前最多支持8个UART,STM32F407一般是6个。 具体可以对照选型手册和数据手册来看
    STM32F103目前最多支持5个UART

2.2 UART异步通信方式引脚连接方法

RXD:数据输入引脚。数据接受。
TXD:数据发送引脚。数据发送。

stm32f407探索者开发板(十六)——串行通信原理讲解-UART_串口_03

2.3 UART异步通信方式引脚(STM32F407ZGT6)

stm32f407探索者开发板(十六)——串行通信原理讲解-UART_单片机_04

2.4 UART异步通信方式特点

  1. 全双工异步通信。
  2. 小数波特率发生器系统,提供精确的波特率。
  3. 可配置的16倍过采样或8倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能。
  4. 可编程的数据字长度( 8位或者9位) ;
  5. 可配置的停止位(支持1或者2位停止位) ;
  6. 可配置的使用DMA多缓冲器通信。
  7. 单独的发送器和接收器使能位。
  8. 检测标志:①接受缓冲器②发送缓冲 器空③传输结束标志
  9. 多个带标志的中断源。触发中断。
  10. 其他:校验控制,四个错误检测标志。

2.5 STM32串口通信过程

stm32f407探索者开发板(十六)——串行通信原理讲解-UART_单片机_05

2.6 STM32串口异步通信需要定义的参数

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

  • 范例

三、STM32串口框图

stm32f407探索者开发板(十六)——串行通信原理讲解-UART_单片机_06


参考代码

int main(void)
{

u8 t;
u8 len;
u16 times=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //延时初始化
uart_init(115200); //串口初始化波特率为115200
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++)
{
USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf("\r\nALIENTEK 探索者STM32F407开发板 串口实验\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);
}
}
}




举报

相关推荐

0 条评论