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
推荐阅读
史海拾趣
ECI公司深知人才是企业发展的关键因素。因此,公司高度重视人才的引进、培养和激励。公司建立了完善的人才选拔机制,选拔具有潜力和才华的员工进行重点培养。同时,公司还提供了丰富的培训和发展机会,帮助员工提升自身素质和能力。此外,ECI还建立了科学合理的薪酬制度和激励机制,让员工在为公司创造价值的同时也能获得相应的回报。这种对人才的重视和投入让ECI公司汇聚了一批优秀的员工队伍,为公司的发展提供了有力的保障。
ECI公司自成立以来,一直致力于技术创新和研发。在电子行业的早期,ECI就投入巨资研发先进的半导体技术,成功推出了多款高性能、低功耗的芯片产品。这些产品迅速在市场上获得认可,为公司赢得了良好的口碑。随着技术的不断进步,ECI公司不断推出更加先进的电子产品,引领了电子行业的发展趋势。
随着市场的不断发展和变化,汇科公司始终将技术创新作为发展的核心驱动力。2012年,汇科第一台球磨机节电柜研发成功,并成功申请国家专利,这标志着公司在节能环保技术领域取得了重要突破。随后,公司又成功研发了柱塞泵节电柜、新一代全智能球磨机节电柜等产品,这些产品不仅提升了公司的市场竞争力,也推动了整个电子行业的发展。
在电子行业这个竞争激烈的领域里,技术的更新换代速度非常快。为了保持领先地位,Exclara高度重视研发投入,不断引进高端人才和先进设备,加强研发团队建设。通过持续的研发投入,公司不仅保持了技术的领先地位,还成功开发出了一系列具有自主知识产权的核心技术。
随着电子行业的不断发展,晶豪科技也积极应对市场变化。公司扩大代工厂的晶圆开工规模,以满足不断增长的客户需求。这一举措不仅使公司能够更灵活地应对市场波动,还为客户提供了更稳定的产品供应。同时,随着晶圆开工量的增加,公司的销售额也实现了稳步增长。
随着军事现代化的推进,DLA意识到整合与优化供应链的重要性。于是,DLA开始着手整合各个军事部门的后勤系统,实现资源的集中管理和统一调配。通过引入先进的供应链管理技术,DLA大幅提高了物资采购、存储、运输和分发的效率,确保了美军在全球范围内的作战需求得到及时、准确的满足。
引言 目前,半导体激光(LI))已广泛应用于通信、信息检测、医疗和精密加工与军事等许多领域。激光电源是激光装置的重要组成部分,其性能的好坏直接影响到整个激光器装置的技术指标。本设计采用受DSP控制的恒流源来为半导体激光器提供电流,在电路中 ...… 查看全部问答∨ |
2008年,对于中国来说,的确是不平凡的一年。大灾大幸,大起大落。奥运会刚刚闭幕,奶和油又掀起了新一轮的波澜。 “三鹿门”转瞬之间由小变大,数千个孩子的生命安全引起了全社会的关注。短短几天,二十多家奶制品厂被查出添加有毒物质,包括全国 ...… 查看全部问答∨ |
在读取文件目录时,调用sprintf函数时,总是出错,不知问题在哪里,高手帮忙啊。 /*************************************************************************************** FunctionName : AppScanFiles()* Description &nbs ...… 查看全部问答∨ |
刚学习vxWorks,今天碰到了一个问题,想请教一下各位!先谢谢了! 今天看到了一个这样的函数,是有关msgQSend的! int DataProcess(char *pData, int DataLen) { char *ReceivePack = NULL; MNREMSG msgSend; &n ...… 查看全部问答∨ |
MMU理解的高手来帮帮小弟啊,别人看到后也会有所帮助 在软件设计与优化一书中,发现有两处疑问。。 疑问一:我怀疑是编书错误。 “一个L2粗页表有256个页表项,占用1KB的主存空间” “一个L2细页表有1024个页表项,占用4KB的主存空间” 这有问 ...… 查看全部问答∨ |
|
在ARM7TDMI体系结构中,如果某一功能程序为了提高和优化性能, 是不是可以把程序放到内部RAM中运行,不知如何才能让我的程序在内部 RAM中运行? 小弟用的是S3C44B0,把8KB的Cache空间作为片内SRAM使用。刚开始 学ARM,请多拍砖支 ...… 查看全部问答∨ |
|
刚装完CCS,想试下牛刀利否于是跑了一下点LED的例程。呵呵比linux快多了。而且不用什么SD卡。只要狗板一块就行。 以下这个程序是starterware的例程,我下到的beaglebone,绿色的灯居然一闪一闪地亮了。 由于搞的太晚,现在补充一下: 虽然是例程但 ...… 查看全部问答∨ |