2023年STM学习笔记USART串口的使用_第1页
2023年STM学习笔记USART串口的使用_第2页
2023年STM学习笔记USART串口的使用_第3页
2023年STM学习笔记USART串口的使用_第4页
2023年STM学习笔记USART串口的使用_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.

串口的基本概念在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据互换。USART运用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIRENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多解决器通信。还可以使用DMA方式,实现高速数据通信。USART通过3个引脚与其他设备连接在一起,任何USART双向通信至少需要2个引脚:接受数据输入(RX)和发送数据输出(TX)。RX:

接受数据串行输入。通过过采样技术来区别数据和噪音,从而恢复数据。TX:

发送数据输出。当发送器被严禁时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处处在高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接受。

2.

串口的如何工作的一般有两种方式:查询和中断。(1)查询:串口程序不断地循环查询,看看当前有没有数据要它传送。假如有,就帮助传送(可以从PC到STM32板子,也可以从STM32板子到PC)。(2)中断:平时串口只要打开中断即可。假如发现有一个中断来,则意味着要它帮助传输数据——它就立即进行数据的传送。同样,可以从

PC到STM3板子,也可以从STM32板子到PC。

3.

串口的硬件连接我用的奋斗STM32V3开发板拥有二路RS-232

接口,CPU

的PA9-US1-TX(P68)、PA10-US1-RX(P69)、PA9-US2-TX(P25)、PA10-US2-RX(P26)通过MAX3232

实现两路RS-232

接口,分别连接在XS5

和XS17

接口上。

USART1

在系统存储区启动模式下,将通过该口通过PC对板上的CPU进行ISP,该口也可作为普通串口功能使用,JP3,JP4

的短路冒拔去,将断开第二路的RS232通信,仅作为TTL

通信通道。

4.

编程实例我们要对串口进行操作,一方面要将STM32的串口和CPU进行连接。在Windows操作系统中,有一个自带的系统软件叫“超级终端”。VISTA以上的操作系统去掉了这个软件,但是可以从XP的系统中,复制“hypertrm.dll”和“hypertrm.exe”到“windows/system32”文献夹下,然后双击运营hypertrm.exe,就可以看见超级终端的运营界面了。运营超级终端以后,会弹出“连接描述”,输入名称和选择图标,这个地方随便写个什么名称都可以。然后弹出“连接到”设立,在“连接时使用”选择你自己PC和STM32连接的COMx,假如不知道是哪个COM口的话,可以在PC的设备管理器中找到。在选择好COM口之后,会弹出一个“属性”对话框,在“位/秒”选择和你STM32中设立的波特率一致就好,数据位也是按照STM32的设立来选择,奇偶校验选择无,停止位选择1,数据流控制选择无。注意,以上的选项都必须和STM32中的串口设立相匹配,要不然也许会出现一些未知错误。配置好超级终端之后,我们便可以开始对STM32进行编程了。编程一般按照如下环节进行:(1)

RCC配置;(2)

GPIO配置;(3)

USART配置;(4)

NVIC配置;(5)

发送/接受数据。在RCC配置中,我们除了常规的时钟设立以外,要记得打开USART相相应的IO口时钟,USART时钟,尚有管脚功能复用时钟。在GPIO配置中,将发送端的管脚配置为复用推挽输出,将接受端的管脚配置为浮空输入。在USART的配置中,通过USART_InitTypeDef结构体对USART进行初始化操作,按照自己所需的功能配置好就可以了。注意,在超级终端的设立中,需要和这个里面的配置相相应。由于我是采用中断接受数据的方式,所以记得在USART的配置中药打开串口的中断,同时最后还要打开串口。在NVIC的配置中,重要是USART1_IRQChannel的配置,和以前的笔记中讲述的中断配置类似,不会配置的可以参考以前的笔记。所有配置好之后就可以开始发送/接受数据了。发送数据用USART_SendData()函数,接受数据用USART_ReceiveData()函数。具体的函数功能可以参考固件库的参考文献。根据USART的配置,在发送和接受时,都是采用的8bits一帧来进行的,因此,在发送的时候,先开辟一个缓存区,将需要发送的数据送入缓存区,然后再将缓存区中的数据发送出去,在接受的时候,同样也是先接受到缓存区中,然后再进行相应的操作。注旨在对数据进行发送和接受的时候,要检查USART的状态,只有等到数据发送或接受完毕之后才干进行下一帧数据的发送或接受。采用USART_GetFlagStatus()函数。同时还要注意的是,在发送数据的最开始,需要清除一下USART的标志位,否则,第1位数据会丢失。由于在硬件复位之后,USART的状态位TC是置位的。当包具有数据的一帧发送完毕之后,由硬件将该位置位。只要当USART的状态位TC是置位的时候,就可以进行数据的发送。然后TC位的置零则是通过软件序列来清除的,具体的环节是“先读USART_SR,然后写入USART_DR”,只有这样才可以清除标志位TC,但是在发送第一帧数据的时候,并没有进行读USART_SR的操作,而是直接进行写操作,因此TC标志位并没有清空,那么,当发送第一帧数据,然后用USART_GetFlagStatus()检测状态时返回的是已经发送完毕(由于TC位是置1的),所以程序会立即发送下一帧数据,那么这样,第一帧数据就被第二帧数据给覆盖了,所以看不到第一帧数据的发送。按照上面的方法编程后,我们便可以在超级终端上查看串口通信的具体状态了。我的这个例程,在硬件复位以后,可以立即在超级终端上看见“WelcometomySTM32!Pleasepressanykey!”字样,然后假如在超级终端中通过PC机键盘按下相应的键,则这个键会发送到STM32中,并且立即返回到PC机的超级终端上,因此可以立即从超级终端的页面中看到按下的相应的键。

5.

程序源代码

#include"stm32f10x_lib.h"

FlagStatusRX_status;

voidRCC_cfg();voidGPIO_cfg();voidUSART_cfg();voidNVIC_cfg();

intmain(){

inti;

unsignedcharTxBuf1[]="WelcometomySTM32!Pleasepressanykey!";

RCC_cfg();

GPIO_cfg();

NVIC_cfg();

USART_cfg();

//清除标志位,否则第1位数据会丢失

USART_ClearFlag(USART1,USART_FLAG_TC);

//发送数据

//PB5的作用是显示正在发送数据

//当有数据在发送的时候,PB5会亮

for(i=0;TxBuf1[i]!='\0';i++)

{

USART_SendData(USART1,TxBuf1[i]);

GPIO_SetBits(GPIOB,GPIO_Pin_5);

//等待数据发送完毕

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

GPIO_ResetBits(GPIOB,GPIO_Pin_5);

}

while(1);

}

//RCC时钟配置voidRCC_cfg(){

//定义错误状态变量

ErrorStatusHSEStartUpStatus;

//将RCC寄存器重新设立为默认值

RCC_DeInit();

//打开外部高速时钟晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速时钟晶振工作

HSEStartUpStatus=RCC_WaitForHSEStartUp();

if(HSEStartUpStatus==SUCCESS)

//设立AHB时钟(HCLK)为系统时钟

RCC_HCLKConfig(RCC_SYSCLK_Div1);

//设立高速AHB时钟(APB2)为HCLK时钟

RCC_PCLK2Config(RCC_HCLK_Div1);

//设立低速AHB时钟(APB1)为HCLK的2分频

RCC_PCLK1Config(RCC_HCLK_Div2);

//设立FLASH代码延时

FLASH_SetLatency(FLASH_Latency_2);

//使能预取指缓存

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//设立PLL时钟,为HSE的9倍频

8MHz*9=72MHz

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

//使能PLL

RCC_PLLCmd(ENABLE);

//等待PLL准备就绪

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);

//设立PLL为系统时钟源

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//判断PLL是否是系统时钟

while(RCC_GetSYSCLKSource()!=0x08);

}

//打开GPIO时钟,复用功能,串口1的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);}

//IO口配置voidGPIO_cfg(){

GPIO_InitTypeDefGPIO_InitStructure;

//PA9作为US1的TX端,打开复用,负责发送数据

GPIO_StructInit(&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

//PA10作为US1的RX端,负责接受数据

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

//LED显示串口正在发送/接受数据

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOB,&GPIO_InitStructure);}

//串口初始化voidUSART_cfg(){

USART_InitTypeDefUSART_InitStructure;

//将结构体设立为缺省状态

USART_StructInit(&USART_InitStructure);

//波特率设立为115200

USART_InitStructure.USART_BaudRate=115200;

//一帧数据的宽度设立为8bits

USART_InitStructure.USART_WordLength=USART_WordLength_8b;

//在帧结尾传输1个停止位

USART_InitStructure.USART_StopBits=USART_StopBits_1;

//奇偶失能模式,无奇偶校验

USART_InitStructure.USART_Parity=USART_Parity_No;

//发送/接受使能

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

//硬件流控制失能

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

//设立串口1

USART_Init(USART1,&USART_InitStructure);

//打开串口1的中断响应函数

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

//打开串口1

USART_Cmd(USART1,ENABLE);}

//配置中断voidNVIC_cfg(){

NVIC_InitTypeDefNVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

//选择中断分组2

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQChannel;

//选择串口1中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;

//抢占式中断优先级设立为0

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论