STM32-自学笔记(11.通过串口与PC通信,发Hello)

本文深入解析STM32的USART串口通信功能,包括其特点、配置步骤及其实现全双工异步通信的过程。通过实例展示如何使用STM32的USART与PC进行数据交换,涵盖硬件电路设计、软件编程要点及注意事项。

USART,中文是通用同步/异步串行接收/发送器。

人们常常称为串口(要知道串行通信口USART和串行总线接口SPI是完全不同的接口设备)。

USART在当代的通用计算机上几乎消失殆尽了,因为其通信速率、距离、硬件特性等不适合PC的要求,

取而代之的是“通用串行通信口” ,也就是USB口。

但在嵌入式应用领域,USART仍无法取代。

STM32的USART的配备

  • 可实现全双工的异步通信。
  • 符合NRZ标准格式。
  • 配备分频数波特率发生器:波特率可编程,发送和接收共用,最高达4.5Mbps。
  • 可编程数据长度(8位或9位)。
  • 可配置停止位,支持1或2个停止位。
  • 可充当LIN总线主机,发送同步断开符;还可充当LIN总线从机,检测断开符。当USART配置成LIN总线模式时,可生成13位断开符;可检测10/11位断开符。
  • 发送方为同步传输提供时钟。
  • 配备IRDA、SIR编码/解码器:在正常模式下支持3/16位的持续时间。
  • 智能卡模拟功能:智能卡接口支持ISO7816-3标准里定义的异步智能卡协议;支持智能卡协议里的0.5和1.5个停止位填充。
  • 可实现单线半双工通信。
  • 可使用DMA多缓冲器通信:支持在SRAM里利用集中式DMA缓冲接收/发送字节。
  • 具有单独的发送器和接收器使能位。
  • 3种检测标志:接收缓冲器满标志;发送缓冲器空标志;传输结束标志标志。

可以看出,STM32的USART除了其最根本的串行通信功能之外,配合STM32的DMA单元可以得到更为快速的串行数据传输,而众多的错误检测功能足以保证USART通信的稳定与可靠性。

实验设计

使用PC向STM32的USART发送一个字节的数据,而后STM32将此数据传回给PC端。

硬件电路

RS232电平转换电路

软件设计(程序设计)

要点注意

  1. 配置RCC寄存器组,使用PLL输出72MHz时钟并作为主时钟源。
  2. 配置GPIOA端口,设置GPIOA.9为第2功能推挽输出模式,GPIOA.10为浮空输入模式。
  3. 配置USART设备,主要参数为:使用9600bps波特率、8位数据长度、1个停止位且无校验位、全双工模式。

主函数  main.c

#include"stm32f10x_lib.h"

void RCC_Configuration (void);

void GPIO_Configuration (void);

void USART_Configuration (void);

int main (void)

{

vu16 i=0;
RCC_Configuration ();               //设置系统时钟 

GPIO_Configuration ();              //设置gpio端口

USART_Configuration ();             //设置USART

while(1)

{

if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)    //等待USART1接收数据完毕

{

USART_SendData(USART1,USART_ReceiveData(USART1));     //向串口发送接收到的数据

for(i<0;1<500;i++);                                   //短延时,保证收发稳定性

}

}

}


设置系统各部分时钟   RCC_Configuration

void RCC_Configuration(void)

{

ErrorStatus HSEStartUpStatus;      //定义枚举类型变量 HSEStartUpStatus

RCC_DeInit();                     //复位系统时钟设置

RCC_HSEConfig(RCC_HSE_ON);         //开启HSE

HSEStatrtUpStatus=RCC_WaitForHSEStartUp();   //等待HSE起振并稳定

if(HSEStatrtUpStatus==SUCCESS)     //判断HSE是否起振成功,是则进入if()内部

{

RCC_HCLKConfig(RCC_SYSCLK_Div1);   //选择HCLK(AHB)时钟源为SYSCLK分频

RCC_PCLK2Config(RCC_HCLK_Div1);    //选择PCLK2时钟源为HCLK(AHB)1分频

RCC_PCLK1Config(RCC_HCLK_Div2);    //选择PCLK1时钟源为HCLK(AHB)2分频

FLASH_SetLatency(FLASH_Latency_2);  //设置Flash延时周期数为2

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);   //使能Flash预取缓存

//选择PLL时钟源为 HSE 1 分频,倍频数为9,则PLL=8MHz *9=72MHz

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

RCC_PLLCmd(ENABLE);                  //使能PLL

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);  //等待PLL输出稳定

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);    //选择SYSCLK时钟源为PLL

while(RCC_GetSYSCLKSource()!=0x08);      //等待PLL成为SYSCLK时钟源

}

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);    //打开APB2总线上的USART1和GPIOA时钟

}

设置各GPIO端口功能   GPIO_Configuration

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

//设置USART1的Tx引脚(PA.9)为第二功能推挽输出,最大翻转频率为50MHz

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

//设置USART1的Rx引脚(PA.10)为浮空输入脚

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

}

设置USART1  USART_Configuration

void USART_Configuration(void)

{

USART_InitTypeDef USART_InitStructure;       //定义USART初始化结构体USART_InitStructure

USART_ClockInitTypeDef USART_ClockInitStructure;  //定义USART初始化结构体USART_ClockInitStructure

//波特率为9600bps;8位数据长度,1个停止位,无检验位;禁用硬件流控制;禁止USART时钟;时钟极性低;在第2个边沿捕获数据;最后一位数据的时钟脉冲不从SCLK输出

USART_InitStructure.USART_BaudRate=9600;

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_Cmd(USART1,ENABLE);         //使能USART1

}

注意事项

  1. 如果使用115200,9600等常用数值作为波特率参数,则请注意一定要把PLL输出设为72MHz,并且作为主时钟使用,否则波特率需要重新计算。
  2. 读者要明确USART和GPIO是两种不同的设备,USART是“借用”了GPIO设备作为自己的输出通道,所以不仅要打开USART的时钟,也要打开相应GPIO的时钟,同时将对应的GPIO引脚设置为第2功能模式。

 

下一篇写本篇程序代码用到的库函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值