找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4920|回复: 0
打印 上一主题 下一主题
收起左侧

STM32学习—串口实验

[复制链接]
跳转到指定楼层
楼主
ID:82083 发表于 2015-6-9 00:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电路如图所示:
?USB-USART1


?USB-USART1


?USB-USART1


USART1_IRQHandler函数:
void USART1_IRQHandler(void)函数是串口1的中断响应函数,当串口1发生了相应的中断后,就会跳到该函数执行。这里设计了一个接收协议:通过这个函数配合一个数组USART_RX_BUF[] ,一个接收状态寄存器 USART_RX_STA(此寄存器其实就是一个全局变量,由笔者自行添加。由于它起到类似寄存器的功能,这里暂且称之为寄存器)实现对串口数据的接收管理。USART_RX_BUF 的大小由 USART_REC_LEN 定义,也就是一次接收的数据最大不能超过 USART_REC_LEN个字节。 USART_RX_STA 是一个接收状态寄存器,其各位的定义如表所示:
?接收状态寄存器位定义表


设计思路如下:
当接收到计算机发过来的数据时,把接收到的数据保存在 USART_RX_BUF中,同时在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(回车的表示由2个字节组成:0X0D 和0X0A)的第一个字节 0X0D 时,计数器将不再增加,等待 0X0A 的到来,而如果 0X0A没有来到?,则认为这次接收失败,重新开始下一次接收。如果顺利接收到 0X0A ,则标记USART_RX_STA 的第15位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次接收,而如果迟迟没有收到 0X0D,那么在接收数据超过 USART_REC_LEN 的时候,则会丢弃前面的数据重新接收。
?USART1_IRQHandle函数


EN_USART1_RX 和 USART_REC_LEN 都是在 usart.h文件里面定义的,当需要使用串口接收的时候,只要在 usart.h 里面设置 EN_USART1_RX 为1即可。不使用的时候,设置EN_USART1_RX 为0即可,这样可以省出部分 SRAM 和 FLASH,默认是设置 EN_USART1_RX为1,也就是开启串口接收的。
OS_CRITICAL_METHOD 则是用来判断是否使用 uc/OS,如果使用了 uc/OS,则调用OSIntEnter 和 OSIntExit 函数;如果没有使用 uc/OS,则不调用这两个函数。

uart_init函数:
void uart_init(u32 pclk2,u32bound)函数是串口1的初始化函数。该函数有2个参数,一个为pclk2,是系统的时钟频率。第二个参数为需要设置的波特率,例如:9600、115200等。而这个函数的重点就是在波特率的设置,由于STM32 采用了分数波特率,所以 STM32 的串口波特率设置范围很宽,而且误差很小。
STM32 的每个串口都有一个自己独立的波特率寄存器USART_BRR,通过设置该寄存器就可以达到配置不同波特率的目的。其各位描述如图所示:
?寄存器USART_BRR各位描述


前面提到 STM32的分数波特率概念,其实就是在这个寄存器(USART_BRR)里面体现的。USART_BRR的最低4位(位[3:0])用来存放小数部分DIV_Fraction,紧接着的12位(位[15:4])用来存放整数部分 DIV_Mantissa,最高16位未使用。
这里简单介绍一下波特率的计算,STM32 的串口波特率计算公式如下:
?串口波特率计算公式


上式中,fpclkx 是给串口的时钟(PCLK1 用于 USART2、3、4、5,PCLK2 用于USART1);USARTDIV 是一个无符号定点数。只要得到 USARTDIV 的值,就可以得到串口波特率寄存器USART1->BRR的值,反过来,得到USART1->BRR的值,也可以推导出USARTDIV 的值。但更关心的是如何从 USARTDIV的值得到 USART_BRR 的值,因为一般知道的是波特率和 PCLKx的时钟,要计算的就是 USART_BRR 的值。
接下来就可以初始化串口了,需要注意的是,这里初始化串口是按8位数据格式,1位停止位,无奇偶校验位的。具体代码如下:
?uart_init函数



串口最基本的设置就是波特率的设置。STM32的串口使用起来还是蛮简单的,只要开启了串口时钟,并设置相应I/0口的模式,然后配置波特率、数据位长度、奇偶校验位等信息,就可以使用了。下面,就简单介绍这个与串口基本配置直接相关的寄存器。
①串口时钟使能。串口作为 STM32的一个外设,其时钟由外设时钟使能寄存器控制,这里使用的串口1是在 APB2ENR 寄存器的第14位。除了串口1的时钟使能在APB2ENR 寄存器,其他串口的时钟使能位都在 APB1ENR 寄存器。
②串口复位。当外设出现异常的时候可以通过复位寄存器里面的对应设置实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。串口1的复位是通过配置APB2RSTR 寄存器的第14位来实现的。APB2RSTR 寄存器的各位描述如图所示:
?APB2RSTR寄存器各位描述


从图可知串口1的复位设置位在 APB2RSTR 的第14位。通过向该位写1复位串口1,写0结束复位。其他串口的复位在APB1RSTR 里面。
③串口波特率设置。通过设置 USART_BRR就可以达到配置不同波特率的目的。
④串口控制。STM32 的每个串口都有3个控制寄存器USART_CR1~3,串口的很多配置都是通过这3个寄存器来设置的。这里只要用到 USART_CR1就可以实现需要的功能了,该寄存器各位描述如图所示:
?USART_CR寄存器各位描述


该寄存器的高18位没有用到,低14位用于串口的功能设置。UE为串口使能位,通过该位置1来使能串口。M为字长选择位,当该位为0的时候设置串口为8个字长外加n个停止位,停止位的个数(n)是根据USART_CR2 的[13:12]位设置来决定的,默认为0。PCE 为校验使能位,设置为0,则禁止校验,否则使能校验。PS为校验位选择,设置为0则为偶校验,否则为奇校验。TXIE 为发送缓冲区空中断使能位,设置该位为1,当 USART_SR 中的 TC位为1时,将产生串口中断。RXNEIE 为接收缓冲区非空中断使能,设置该位为1,当 USART_SR 中的 ORE 或者 RXNE位为1时,将产生串口中断。TE 为发送使能位,设置为1将开启串口的发送功能。RE 为接收使能位,用法同 TE。
⑤数据发送和接收。STM32 的发送与接收是通过数据寄存器USART_DR 来实现的,这是一个双寄存器,包含 TDR 和RDR。当向该寄存器写数据的时候就会自动发送,当收到数据的时候,也是存在该寄存器内。该寄存器的各位描述如图所示:
?USART_DR寄存器各位描述  


可以看出,虽然是一个32位寄存器,但是只用了低9位(DR[8:0]),其他都保留。
DR[8:0]为串口数据,包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR),一个给接收用(RDR),因此兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口。RDR 寄存器提供了输入移位寄存器和内部总线之间的并行接口。
当使能校验位(USART_CR1中的PCE位被置位)进行发送时,写到MSB的值(根据数据的长度不同,MSB是第7位或者第8位)会被后来的校验位取代。
⑥串口状态。串口的状态可以通过状态寄存器 USART_SR读取。USART_SR 的各位描述如图所示:
?USART_SR寄存器各位描述


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

串口实验:
重新建立一个工程,在 HARDWARE 文件夹下新建一个 led文件夹,用来存放按键输入实验相关的代码。?
?在HARDWARE 下新增 LED 文件夹


然后我们打开 USER 文件夹下的 USER.uvproj工程,按新建按钮新建一个文件,然后保存在 HARDWARE->led 文件夹下面,保存为led.h,在该文件中输入如下代码:
?led.h


保存 led.h 代码,然后我们按同样的方法新建一个 led.c 文件,也保存在 led 文件夹 下面。在led.c 中输入如下代码:
?led.c


我们把 led.c 加入到 HARDWARE 里面,如图所示:
?将led.c 添加到HARDWARE中


回到主界面,在 USER.c 中输入如下代码:

?user.c


?user.c


然后按编译,编译工程,得到结果如图:

?编译结果


软件实现功能:
?串口调试助手收到的信息


?发送数据后收到的信息


该程序仅使能了发送,并没有使能发送完成中断。中断是由接收产生的,接收到了数据,接收缓冲区非空产生中断。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表