历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2019年10月12日 | STM32-自学笔记(11.通过串口与PC通信,发Hello)

发布者:国宝集团 来源: eefocus关键字:STM32  串口  通信 手机看文章 扫描二维码
随时随地手机看文章

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  串口  通信 引用地址:STM32-自学笔记(11.通过串口与PC通信,发Hello)

上一篇:stm32后生成编译文件大小探索之二
下一篇:STM32F1笔记(三)UART/USART

推荐阅读

据外媒报道,美光科技周三表示,计划向关注无人驾驶汽车、工厂自动化和其他新兴领域的人工智能创业公司投资最多1亿美元。美光早在十几年前就启动了企业风投计划。不过美光首席业务官苏米特·萨达纳(Sumit Sadana)表示,到目前为止该公司的投资非常分散,并且大多接近该公司的核心业务,即芯片制造。在旧金山举行的美光首次人工智能会议上,他表示,现有...
  今年初,射洪将中国锂都会战年确立为实现年度目标的首要任务。半年多来,无论是基础设施建设还是产业发展,都加快有序推进,中国锂都核心区的规划蓝图正从纸上“走到”地上。   明方向咬定目标不放松   今年6月,省委书记彭清华结合遂宁锂电产业发展,对全省特色优势产业集群发展作出了批示。我市把锂电及新材料产业作为推动全市产业发展的“一...
全球云和本地环境数据管理软件的公认领导者Commvault(纳斯达克代码:CVLT)为骆驼集团股份有限公司提供数据备份与恢复解决方案,助力其确保数据的可用性和安全性,大幅提高企业生产效率,从而为其数字化转型进程保驾护航。 骆驼集团成立于1994年,现已发展成为亚洲最大的汽车电池生产商,在全球范围为近50,000客户和超过90%家喻户晓的汽车品牌提供了400多...
Flex 推出适合于 RFPA 和 PoE 应用的 PKU4116HD 系列 1/16 砖DC/DC转换器• 1/16 砖格式,110W 输出• 2250V隔离电压• 低成本方案,成熟技术• 面向射频功率放大器(RFPA)和以太网供电(PoE)应用Flex Power Modules 宣布推出PKU4116HD带 通孔安装孔的DC/DC转换器,该产品具有36~60V输入(80V峰值)和完全稳压的 55V输出,其开放式框架...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved