历史上的今天

今天是: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

推荐阅读

虽然机器人还取代不了人工同传,但是取代仓库管理员绰绰有余。最近优衣库在东京的一个仓库启用了一套自动化系统,由机器人负责仓库内服装检查和分拣工作,这也是优衣库第一个“机器人仓库”,优衣库表示这套系统能取代 90% 的人力,并且可以 24 小时不间断运行。日本媒体 Japan News 受邀参观优衣库这一仓库,了解整套机器人系统的运作流程。在服装...
一早最大的新闻,是之前雄心勃勃的戴森宣布放弃造车的事情,昨日戴森公司的创始人詹姆斯·戴森宣布,因商业化难以落地,公司决定停止造车项目。戴森放弃造车并非因为产品故障或团队问题,公司开发的汽车是出色的,但戴森难以让这款汽车在商业上可行,所以公司董事会作出停止项目的决定,戴森公司曾试图给自己的造车方案寻求其他买家,但未能如愿。 Dyson ...
无论是系统软件iOS还是硬件芯片,苹果一直以安全著称。偶尔有漏洞或者被越狱,也不会导致致命问题,并且很快就能修复。最近一名网络安全研究人员表示,使用苹果 T2 安全芯片的英特尔 Mac 容易受到攻击,该漏洞可能使黑客绕过磁盘加密,固件密码和整个 T2 安全验证链。 苹果T2芯片是2018年搭载在苹果MacBook Pro上的一颗安全芯片,后来被应用到了新...
据钜亨网报道,半导体硅晶圆厂商环球晶现货急单持续涌入,一路排到明年上半年,6英寸、8英寸与12 英寸产能全线满载。此前环球晶董事长徐秀兰在法说会上表示,目前公司订单能见度非常高,明、后两年客户的需求也很稳健,并陆续签定长约,合约期间有3年、5年,甚至最长到8年客户。预付货款金额超过190亿元新台币(单位下同),预付款约是订单金额的 20-30%...

史海拾趣

问答坊 | AI 解惑

基于DSP的精密半导体激光驱动电源系统

引言 目前,半导体激光(LI))已广泛应用于通信、信息检测、医疗和精密加工与军事等许多领域。激光电源是激光装置的重要组成部分,其性能的好坏直接影响到整个激光器装置的技术指标。本设计采用受DSP控制的恒流源来为半导体激光器提供电流,在电路中 ...…

查看全部问答∨

当油变成奶,奶变成油……

2008年,对于中国来说,的确是不平凡的一年。大灾大幸,大起大落。奥运会刚刚闭幕,奶和油又掀起了新一轮的波澜。 “三鹿门”转瞬之间由小变大,数千个孩子的生命安全引起了全社会的关注。短短几天,二十多家奶制品厂被查出添加有毒物质,包括全国 ...…

查看全部问答∨

FatFs下目录扫描出现问题了,高手帮忙啊

在读取文件目录时,调用sprintf函数时,总是出错,不知问题在哪里,高手帮忙啊。 /*************************************************************************************** FunctionName   : AppScanFiles()* Description &nbs ...…

查看全部问答∨

关于msgQSend的问题!!!急等~~

刚学习vxWorks,今天碰到了一个问题,想请教一下各位!先谢谢了! 今天看到了一个这样的函数,是有关msgQSend的! int DataProcess(char *pData, int DataLen) {     char *ReceivePack = NULL;     MNREMSG msgSend; &n ...…

查看全部问答∨

请教一个WINCE的问题:

  各位朋友是这样的:WINCE控制面板里的程序一打开,为什么它们的窗口大小和我们的屏幕的大小不一致呢?怎么样可以让它们和我们的屏幕大小一致辞呢?…

查看全部问答∨

关于MMU转换表基址的问题

MMU理解的高手来帮帮小弟啊,别人看到后也会有所帮助 在软件设计与优化一书中,发现有两处疑问。。 疑问一:我怀疑是编书错误。 “一个L2粗页表有256个页表项,占用1KB的主存空间” “一个L2细页表有1024个页表项,占用4KB的主存空间” 这有问 ...…

查看全部问答∨

如何取得当前系统是CE或者Mobile

怎么获得当前系统是Windows CE或者Windows Mobile …

查看全部问答∨

如何把一段程序放到内部RAM中运行?

在ARM7TDMI体系结构中,如果某一功能程序为了提高和优化性能, 是不是可以把程序放到内部RAM中运行,不知如何才能让我的程序在内部 RAM中运行?     小弟用的是S3C44B0,把8KB的Cache空间作为片内SRAM使用。刚开始 学ARM,请多拍砖支 ...…

查看全部问答∨

高手请进

目前 主流的编译开发环境是什么 ADS  还是MDK  ,还是IAR   ,谢谢  ,以前用的mdk  现在 想用IAR  ,, ,我学M3不久  , 希望结识大家   交流进步   ...…

查看全部问答∨

beaglebone心得七:点亮LED

刚装完CCS,想试下牛刀利否于是跑了一下点LED的例程。呵呵比linux快多了。而且不用什么SD卡。只要狗板一块就行。 以下这个程序是starterware的例程,我下到的beaglebone,绿色的灯居然一闪一闪地亮了。 由于搞的太晚,现在补充一下: 虽然是例程但 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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