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电平转换电路
软件设计(程序设计)
要点注意:
配置RCC寄存器组,使用PLL输出72MHz时钟并作为主时钟源。
配置GPIOA端口,设置GPIOA.9为第2功能推挽输出模式,GPIOA.10为浮空输入模式。
配置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
}
注意事项:
如果使用115200,9600等常用数值作为波特率参数,则请注意一定要把PLL输出设为72MHz,并且作为主时钟使用,否则波特率需要重新计算。
读者要明确USART和GPIO是两种不同的设备,USART是“借用”了GPIO设备作为自己的输出通道,所以不仅要打开USART的时钟,也要打开相应GPIO的时钟,同时将对应的GPIO引脚设置为第2功能模式。
上一篇:stm32后生成编译文件大小探索之二
下一篇:STM32F1笔记(三)UART/USART
推荐阅读
史海拾趣



ASM10DTBD-S664






京公网安备 11010802033920号