收藏 分享(赏)

正点原子串口实验.docx

上传人:fcgy86390 文档编号:4294165 上传时间:2018-12-21 格式:DOCX 页数:8 大小:184.23KB
下载 相关 举报
正点原子串口实验.docx_第1页
第1页 / 共8页
正点原子串口实验.docx_第2页
第2页 / 共8页
正点原子串口实验.docx_第3页
第3页 / 共8页
正点原子串口实验.docx_第4页
第4页 / 共8页
正点原子串口实验.docx_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、 第九章 串口实验前面两章介绍了 STM32 的 IO 口操作。这一章我们将学习 STM32 的串口,教大家如何使用 STM32 的串口来发送和接收数据。本章将实现如下功能:STM32 通过串口和上位机的对话,STM32 在收到上位机发过来的字符串后,原原本本的返回给上位机。本章分为如下几个小节:9.1 STM32 串口简介9.2 硬件设计9.3 软件设计9.4 下载验证9.1 STM32 串口简介串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的 MCU 都会带有串口,STM32 自然也不例外。STM32 的串口资源相当丰富的,功能也相当强劲

2、。ALIENTEK 战舰 STM32 开发板所使用的 STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、支持调制解调器操作、智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA 等。5.3 节对串口有过简单的介绍,接下来我们将从寄存器层面,告诉你如何设置串口,以达到我们最基本的通信功能。本章,我们将实现利用串口 1 不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。战舰STM32 开发板板载了 1 个 USB 串口和 1 个 RS232 串口,我们本章介绍的是通过 USB串口和电脑

3、通信。串口最基本的设置,就是波特率的设置。STM32 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,详见 5.3.2 节。下面,我们就简单介绍下这几个与串口基本配置直接相关的寄存器。1,串口时钟使能。串口作为 STM32 的一个外设,其时钟由外设时钟使能寄存器控制,这里我们使用的串口 1 是在 APB2ENR 寄存器的第 14 位。APB2ENR 寄存器在之前已经介绍过了,这里不再介绍。只是说明一点,就是除了串口 1 的时钟使能在APB2ENR 寄存器,其他串口的时钟使能位都在 APB1ENR 寄存

4、器。2,串口复位。当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。串口 1 的复位是通过配置APB2RSTR 寄存器的第 14 位来实现的。APB2RSTR 寄存器的各位描述如图 9.1.1 所示:图 9.1.1 APB2RSTR 寄存器各位描述从图 9.1.1 可知串口 1 的复位设置位在 APB2RSTR 的第 14 位。通过向该位写 1复位串口 1,写 0 结束复位。其他串口的复位位在 APB1RSTR 里面。3,串口波特率设置。在 5.3.2 节,我们已经介

5、绍过了,每个串口都有一个自己独立的波特率寄存器 USART_BRR,通过设置该寄存器就可以达到配置不同波特率的目的。具体实现方法,请参考 5.3.2 节。4,串口控制。STM32 的每个串口都有 3 个控制寄存器 USART_CR13,串口的很多配置都是通过这 3 个寄存器来设置的。这里我们只要用到 USART_CR1 就可以实现我们的功能了,该寄存器的各位描述如图 9.1.2 所示:图 9.1.2 USART_CR 寄存器各位描述该寄存器的高 18 位没有用到,低 14 位用于串口的功能设置。 UE 为串口使能位,通过该位置 1,以使能串口。M 为字长选择位,当该位为 0 的时候设置串口为

6、8 个字长外加 n 个停止位,停止位的个数(n)是根据 USART_CR2 的13:12 位设置来决定的,默认为 0。PCE 为校验使能位,设置为 0,则禁止校验,否则使能校验。PS 为校验位选择,设置为 0 则为偶校验,否则为奇校验。TXIE 为发送缓冲区空中断使能位,设置该位为 1,当 USART_SR 中的 TXE 位为 1 时,将产生串口中断。TCIE 为发送完成中断使能位,设置该位为 1,当 USART_SR 中的 TC 位为 1 时,将产生串口中断。RXNEIE 为接收缓冲区非空中断使能,设置该位为 1,当 USART_SR 中的 ORE 或者RXNE 位为 1 时,将产生串口中断

7、。TE 为发送使能位,设置为 1,将开启串口的发送功能。RE 为接收使能位,用法同 TE。其他位的设置,这里就不一一列出来了,大家可以参考STM32 参考手册第542 页有详细介绍,在这里我们就不列出来了。5,数据发送与接收。STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内。该寄存器的各位描述如图9.1.3 所示:图 9.1.3 USART_DR 寄存器各位描述可以看出,虽然是一个 32 位寄存器,但是只用了低 9 位(DR8:0),其他都是保留。

8、DR8:0为串口数据,包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR),一个给接收用 (RDR),该寄存器兼具读和写的功能。TDR 寄存器提供了内部总线和输出移位寄存器之间的并行接口。RDR 寄存器提供了输入移位寄存器和内部总线之间的并行接口。当使能校验位(USART_CR1 种 PCE 位被置位)进行发送时,写到 MSB 的值(根据数据的长度不同,MSB 是第 7 位或者第 8 位)会被后来的校验位该取代。当使能校验位进行接收时,读到的 MSB 位是接收到的校验位。6,串口状态。串口的状态可以通过状态寄存器 USART_SR 读取。USART_SR 的各位描述如图

9、9.1.4 所示:图 9.1.4 USART_SR 寄存器各位描述这里我们关注一下两个位,第 5、6 位 RXNE 和 TC。RXNE(读数据寄存器非空) ,当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读USART_DR 可以将该位清零,也可以向该位写 0,直接清除。TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读USART_SR,写 USART_DR。2)直接向该位写 0。通过以上一些寄存器的操作外加一下

10、IO 口的配置,我们就可以达到串口最基本的配置了,关于串口更详细的介绍,请参考STM32 参考手册第 516 页至 548 页,通用同步异步收发器一章。9.2 硬件设计本实验需要用到的硬件资源有:1) 指示灯 DS02) 串口 1串口 1 之前还没有介绍过,本实验用到的串口 1 与 USB 串口并没有在 PCB 上连接在一起,需要通过跳线帽来连接一下。这里我们把 P6 的 RXD 和 TXD 用跳线帽与PA9 和 PA10 连接起来。如图 9.2.1 所示:图 9.2.1 硬件连接图示意图连接上这里之后,我们在硬件上就设置完成了,可以开始软件设计了。9.3 软件设计本章的代码设计,比前两章简单

11、很多,因为我们的串口初始化代码和接收代码就是用我们之前介绍的 SYSTEM 文件夹下的串口部分的内容。这里我们对代码部分稍作讲解。打开上一章的 TEST 工程,然后在 SYSTEM 组下双击 usart.c,我们就可以看到该文件里面的代码,先介绍 uart_init 函数,该函数代码如下:/初始化 IO 串口 1/pclk2:PCLK2 时钟频率(Mhz)/bound:波特率void uart_init(u32 pclk2,u32 bound)float temp;u16 mantissa;u16 fraction;temp=(float)(pclk2*1000000)/(bound*16);

12、/得到 USARTDIVmantissa=temp; /得到整数部分fraction=(temp-mantissa)*16; /得到小数部分mantissaAPB2ENR|=1APB2ENR|=1CRH/IO 状态设置GPIOA-CRH|=0X000008B0;/IO 状态设置RCC-APB2RSTR|=1APB2RSTR / 波特率设置USART1-CR1|=0X200C; /1 位停止,无校验位.#if EN_USART1_RX /如果使能了接收/使能接收中断USART1-CR1|=1CR1|=1BRR 的内容。然后开始初始化串口引脚,接着把 USART1 复位,然之后设置波特率和奇偶校验

13、等。这里需要注意一点,因为我们使用到了串口的中断接收,必须在 usart.h 里面设置 EN_USART1_RX 为 1(默认设置就是 1 的) 。该函数才会配置中断使能,以及开启串口 1 的 NVIC 中断。这里我们把串口 1 中断放在组 2,优先级设置为组 2 里面的最低。串口 1 的中断服务函数 USART1_IRQHandler,在 5.3.1 已经有详细介绍了,这里我们就不再介绍了。介绍完了这两个函数,我们回到 test.c,在 test.c 里面编写如下代码:#include “sys.h“#include “usart.h“#include “delay.h“#include “

14、led.h“#include “beep.h“#include “key.h“int main(void)u16 t;u16 len;u16 times=0;Stm32_Clock_Init(9); /系统时钟设置uart_init(72,9600); /串口初始化为 9600delay_init(72); /延时初始化LED_Init(); /初始化与 LED 连接的硬件接口BEEP_Init(); /初始化蜂鸣器端口KEY_Init(); /初始化与按键连接的硬件接口while(1)if(USART_RX_STA/得到此次接收到的数据长度printf(“您发送的消息为: “);for(t=

15、0;tDR=USART_RX_BUFt;while(USART1-SR/等待发送结束printf(“);/插入换行USART_RX_STA=0;elsetimes+;if(times%5000=0)printf(“战舰 STM32 开发板 串口实验“);printf(“正点原子ALIENTEK“);if(times%200=0)printf(“请输入数据,以回车键结束“);if(times%30=0)LED0=!LED0;/闪烁 LED,提示系统正在运行 .delay_ms(10);这段代码比较简单,重点看下以下两句:USART1-DR=USART_RX_BUFt;while(USART1-S

16、R/等待发送结束第一句,其实就是发送一个字节到串口,通过直接操作寄存器来实现的。第二句呢,就是我们在写了一个字节在 USART1-DR 之后,要检测这个数据是否已经被发送完成了,通过检测 USART1-SR 的第 6 位,是否为 1 来决定是否可以开始第二个字节的发送。其他的代码比较简单,我们执行编译之后看看有没有错误,没有错误就可以开始仿真与调试了。整个工程的编译结果如图 9.3.1 所示:图 9.3.1 编译结果可以看到,编译没有哦任何错误和警告,下面我们可以开始下载验证了。9.4 下载验证前面 2 章实例,我们均介绍了软件仿真,仿真的基本技巧也差不多介绍完了,接下来我们将淡化这部分,因为

17、代码都是经过作者检验,并且全部在 ALIENTEK 战舰STM32 开发板上验证了的,有兴趣的朋友可以自己仿真看看。但是这里要说明几点:1, IO 口复用的,信号在逻辑分析窗口是不能显示出来的(看不到波形) ,这一点请大家注意。比如串口的输出,SPI,USB ,CAN 等。你在仿真的时候在该窗口看不到任何信息。遇到这样的情况,你就不得不准备一个逻辑分析仪,外加一个 ULINK 或者JLINK 来做在线调试。但一般情况,这些都是有现成的例子,不用这几个东西一般也能编出来。2,仿真并不能代表实际情况。只能从某些方面给你一些启示,告诉你大方向,不能尽信仿真,当然也不能完全没有仿真。比如上面 IO 口

18、的输出,仿真的时候,其翻转速度可以达到很快,但是实际上 STM32 的 IO 输出就达不到这个速度。总之,我们要合理的利用仿真,也不能过于依赖仿真。当仿真解决不了了,可以试试在线调试,在线调试一般都可以知道问题在哪个地方,但是问题要怎么解决还是得各位自己动脑筋、找资料了。我们把程序下载到战舰 STM32 开发板,可以看到板子上的 DS0 开始闪烁,说明程序已经在跑了。串口调试助手,这里我们选择的是 SSCOM3.3,是由大虾网版主丁丁(聂小孟)编写,是一个非常好用的串口调试助手。它的优点有:1,绿色,免安装;2,体积小,整个软件才 700 多 KB;3,支持自动搜索串口;4,支持中文字符收发;

19、5,具有扩展发送功能。以上是一些主要的优点,当然这个软件也有些小 bug,比如串口在连接的情况下,如果突然断开,那么程序就死机了,而且无法正常关闭(必须在任务管理器里面强制结束),还有只要该软件打开着,你的电脑就别想关机。不过瑕不掩瑜,该软件总的来说,还是非常适合各位使用的。接着我们打 SSCOM3.3,设置串口为 CH340 的 USB 串口(根据你自己的电脑选择,我的电脑是 COM3),可以看到如图 9.4.1 所示信息:图 9.4.1 串口调试助手收到的信息从图 9.4.1 可以看出,STM32 的串口数据发送是没问题的了。但是,因为我们在程序上面设置了必须输入回车,串口才认可接收到的数据,所以必须在发送数据后再发送一个回车符,这里 SSCOM3.3 提供的发送方法是通过勾选发送新行实现,如图9.4.1,只要勾选了这个选项,每次发送数据后,SSCOM3.3 都会自动多发一个回车。设置好了发送新行,我们再在发送区输入你想要发送的文字,然后单击发送,可以得到如图 9.4.2 所示结果:图 9.4.2 发送数据后收到的数据可以看到,我们发送的消息被发送回来了(图中圈圈内 )。大家可以试试,如果不发送回车(取消发送新行 ),在输入内容之后,直接按发送是什么结果。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 中学实验

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报