历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-10-12 来源:eefocus

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功能模式。


推荐阅读

史海拾趣

Analog Microwave Design公司的发展小趣事

随着市场的不断变化和客户需求的多样化,Analog Microwave Design公司意识到单一的产品线已经无法满足市场需求。为了丰富和完善产品线,公司开始加大对新产品的研发力度。除了继续深耕微波器件领域外,公司还积极拓展相关领域的产品线,如射频模块、天线等。通过不断推出新产品,公司不仅满足了客户的多样化需求,还进一步巩固了市场地位。

Golledge Electronics公司的发展小趣事

Analog Microwave Design公司成立于XXXX年,当时正值微波技术快速发展的时期。公司创始人凭借对微波技术的深厚理解,看到了微波技术在通信、雷达和卫星等领域的巨大潜力。然而,初创时期的资金短缺和技术难题让公司的发展步履维艰。为了克服这些困难,创始人带领团队夜以继日地研发,并通过与高校和研究机构的合作,获得了技术支持和资金支持。经过一番努力,公司终于成功开发出了首款高性能微波器件,为公司的后续发展奠定了坚实的基础。

灿科盟(Ckmtw)公司的发展小趣事

为了提升产品质量,增强客户信任,灿科盟在2008年成功通过了ISO9001:2000版质量管理体系认证。这一认证标志着公司在质量管理方面达到了国际标准,也为公司赢得了更多客户的青睐。此后,公司继续加强质量管理体系建设,不断提升产品质量和服务水平。

Heraeus公司的发展小趣事

为了提升产品质量,增强客户信任,灿科盟在2008年成功通过了ISO9001:2000版质量管理体系认证。这一认证标志着公司在质量管理方面达到了国际标准,也为公司赢得了更多客户的青睐。此后,公司继续加强质量管理体系建设,不断提升产品质量和服务水平。

DAESAN公司的发展小趣事

随着全球化进程的加速,DAESAN公司开始将目光投向国际市场。他们制定了详细的国际化战略,积极拓展海外市场。通过与国外企业的合作和交流,DAESAN公司逐渐建立起全球化的生产和销售网络。他们的产品不仅畅销亚洲市场,还成功打入欧美等发达国家市场。国际化战略的实施,使DAESAN公司的品牌知名度和影响力得到了显著提升。

Gazelle Microcircuits Inc公司的发展小趣事
随着个人电脑市场的不断发展,用户对主板性能的需求也在不断变化。现代主板更加注重的是高速数据传输、稳定性、能效比等方面,而不再是传统的模拟电路或特殊模块的需求。

问答坊 | AI 解惑

ADS1605:速度最快的16位Delta-Sigma ADC

豪华的单片机开发系统498元 可稳定视频输出的: S3C2410 ARM9开发板780元DSP5402学习开发板II200元 暑期大优惠:S3C44B0开发板(标准版)350元 单片机以太网开发板  180元 DSP5402学习开发板II200元 LABTOOL-48UXP &nb ...…

查看全部问答>

如何提升模拟设计水平?

模拟技术是目前所有电子产品设计中不可或缺的部分,相信大家对模拟技术可以说一点都不陌生,从接触电子产品开始,我们就接触模拟技术了。模拟技术更多需要经验积累,对新入门的工程师来说,如何提升自己的模拟设计水平?我们欢迎广大资深工程师都来 ...…

查看全部问答>

vxWorks系统中有几个task,其中一个task在执行过程中会挂掉(SUSPEND),请问有可能是哪些原因?

如题。 我以前没有接触过此系统,不知道它是如何使用内存的…… ----------   迷惑:一个task在执行过程中怎么会挂掉自己呢?task之间没有访问保护,写错地方了就是挂掉别的task或系统啊!   明白的此情况的,请提示一下! ...…

查看全部问答>

wince6.0 模拟器的问题

自己编了个wince 6.0的模拟器,下载了一个flash播放器,在开发板的真实硬件环境可以跑起来并且运行flash,但是在模拟器上只能运行flash播放器,无法运行flash文件,请问是不是需要什么库或者组件的支持?谢谢!!…

查看全部问答>

转让友善之臂mini2440开发板

450转让友善之臂mini2440开发板 09年底入手的2440开发板,带3.5寸屏,128M NAND Flash,带usb线,串口线,Jtag小板,送原厂开发板资料DVD和5张视频教程DVD,送USB串口转接线; 板子详情查看官方网站http://www.arm9.net/mini2440-feature.asp 有 ...…

查看全部问答>

Enumeration for HS USB device to full speed only Host fail

需要开发USB device 本身是High speed 的, 先把XP Device manager 中的所有的EHCI 都disable (如果没有这一步,设备是可以正常自举的), 然后插入设备,不能正常自举, 抓的log 显示停在 set address request 这一步,device 没有回 0 byte的ACK. ...…

查看全部问答>

如何对usb设备的多个端点进行读写

我现在在做一个驱动,使用了5个端点,端点1为in,其他2,3,4,5断点为out的,我有一个1k的数据包,如何利用2,3,4,5端点,对设备进行高速写入,最后可以把usb跑到800-900k每秒…

查看全部问答>

看的眼都直了

搞了个DS18B20,但无论怎么搞温度总是01℃!费了好大得劲!用KEIL仿真时提示有错误!但我看不出来是哪里!希望那个能有人能够答疑解惑!这里先谢谢了! DQ是P2^5,RW我直接接地了,RS接的P2^0,E接P2^1,液晶屏用的是LM016L #include #define uc ...…

查看全部问答>

【设计工具】2010年电子设计竞赛培训资料

培训的内容如下:•北京中教仪装备技术有限公司介绍•Xilinx公司介绍•Xilinx公司产品概述•Xilinx公司软件平台介绍•Xilinx公司ISE10.1软件介绍•EXCD-1硬件开发平台介绍•基于HDL、IP核和原理图的设计输入和 ...…

查看全部问答>

【设计工具】ISE7.1i 中文教程

奉献Xilinx  ISE7 中文教程,希望多学习的朋友有所帮助.…

查看全部问答>