【MSP430趣谈】MSP430第九讲之串口使用

上次一讲中我们说到了定时器的两种写法,一种是利用寄存器进行书写的,另外一种是利用官方库函数进行书写的。我们通过对比这两种写法,发现库函数居然写的要比寄存器还多,这不是更加不方便了吗。其实库函数和寄存器应该说各有好处吧,因为TI官方给了我们很多的寄存器定义,所以相对看起来不是那么难懂,库函数的话也相对是简洁明了的。我个人的观点是,在一些相对寄存器较少,运行速度较慢的单片机里面我们用寄存器写的话是最高效的,对于430来说,官方给的库相对的话运行速度不会和寄存器差点哪去(具体我也没测试过,瞎说),但库函数一定会比操作寄存器慢一点,因为他需要多步才可以配置到寄存器。但是之后大家如果接触32的话也会发现同样存在寄存器和库函数的版本,也同样是这个道理,库函数慢一点,但是简洁明了,方便。

寄存器更快,但是识别度相对会低一点。但对32的72MHz的运行速度也就基本没什么差了。讲了这么多想说明一个什么道理呢?我们现在接触的单片机是算很底层的操作了,很底层的设计和应用了,相对的,我们有ARM9等等,这些复杂的芯片,就已经没有办法用所谓的寄存器进行操作了,因为它拥有的寄存器实在是太多了,所以就会有系统的产生,让芯片运行在系统上面,底层的东西集成了,减少了开发难度。之后大家接触了其他语言,比如c++和java,其实这两个是类似的,只要会了一个另一个也基本花一点时间就可以学会了。这两个语言的思想也和这个类似,把很多东西封装起来,你只要懂得怎么调用就好了,和我们调用函数类似,不用考虑函数具体是怎么实现这个功能的。

所以希望大家既可以明白寄存器具体是怎么操作的,同时学会应用库函数进行开发。

这一次我们将进入一个重要的篇章,通信协议,这个我们会通过几个章节来讲,主要介绍下面三种通信协议,一种是串口UART,一种是SPI,一种是IIC,三种我们都讲通过实例来说明。

这次我们要说的是串口UART的使用,串口应该算是一种最简单的通信方式了,我们通常值得串口指的是UART-Lite,也就是说它是由四根线组成,分别是VCC,RX,TX,GND。我们常用的就是这四根线了,真正意义上他还有一些其他的功能的线我们也很少用到。

UART的全称是通用异步收发传输器,是属于一种串行的数据总线,我们解释一下什么事串行的吧,比如说我要穿一个八位的数据,0100_1100,这样子,那好我现在要给你这个数据,我就有两种方式,一种是串行,一种是并行的了。

从上面的串行方式,我们又可以引出另外一个东西,就是我们一位一位的传的话时间间隔的问题,如果我可以选择任意时间传一个数据,每个数据之间的时间间隔不同的话就是所谓的异步通信,如果以相同的时间间隔的话就是所谓的同步通信了。

好了,我们现在来了解一下串口通信中比较重要的几个参数:

a.波特率:

简洁明了,就是你要传多快的问题。从上面我们看到是把一个字节拆分成成八个位,那么波特率指的就是说每秒钟传多少个位了,举个例子,比如说波特率为9600bps,那么就是1秒钟内传输9600个bit,就是1200个字节,应该可以明白吧。

b. 数据位

这个怎么说呢,我们看图好了。

一个数据包就由上面三个组成,也就是说,我们在使用UART通信的话就需要配置这三个参数,到了我们写程序的时候大家还会看到这三个参数。

c. 停止位

用于上面我们数据包中的最后一位,典型值为1位,1.5位,2位。该位提供了时钟的方式,如果双方时钟不同步,可以通过该位来调整时钟的同步。

d. 奇偶校验位

简单解释下奇偶校验位,就是统计我们这个数据当中给定位数的二进制数中的1的个数是奇数还是偶数个。是一种最简单的数据传输错误检测的方式了。

看到这里可能大家还是会有不明白的地方,但是没有关系,最简单的方法就是我们先用起来,什么参数,什么原理,都不管他,用的时候遇到什么问题在百度嘛!!!

好了,干起来!!

建立工程就不在说了。

同样打开我们的两份文档,数据手册和库函数参考手册。

同样看到这么多的函数,我们还是需要使用到初始化函数。但是这里我们看到它前面有一个EUSCI,不禁问道,这是什么鬼!!!通过看到数据手册我们知道全称是Enhanced Universal Serial Communication Interface,翻译过来就是增强通用串行通信接口,TI把UART和SPI以及IIC都归类在这里面,之后我们会讲到另外两个,同样也是串行通信的方式。

在这之前我们还有注意一点,一定需要配置时钟,因为默认的时钟相对不是那么准确,我们配置成我们想要的时钟频率这样子方便我们写程序和计算。

我们从官方给的注释中可以很快的得到我们的参数输入。

这里我也不再解释具体的写法了,我们就直接写了。

在数据手册的

我们找到下面的说明,就是我们上面说到的UART通信的几个要设置的元素之一,就是波特率的设置,这里因为是英文,看起来比较吃力,我们翻译过来。

波特率设置:

要计算出正确的设置给波特率的生成,执行以下步骤:

1.计算出 N = fBRCLK / Baudrate 如果N>16则调到步骤3,否则执行步骤2

2.设置UCOS16 = 0,UCBRx = INT(N) 之后执行步骤4,这里我解释一下, INT(N)这里指的是N的整数部分,等下我们会看到设置的部分计算出的N是会有小数的。

3.UCOS16 = 1,UCBRx = INT(N/16),UCBFRx = INT( [ N/16 - INT ( N/16 ) ] x 16)

4.UCBRSx 能够在Table21-4中找到,等下我们会用到。我们要运用我们运算得到N - (INT)N的小数部分,来对应表格找到UCBRSx该赋予的值。

5.如果UCOS16 = 0被选中了,建议进行详细的误差计算。

(图中的OS16指的就是UCOS16这个位)

好了我们看下具体的使用方法,比如我们要设置波特率为9600,那么该怎么做?

第一步:

我们需要选择一个fBRCLK,那么我们在UART模块的Block diagram中找到,

我们可以看到它有三个时钟进行选择,分别是UC0CLK、ACLK、SMCLK,通过配置UCSSELx这个寄存器可以得到。后面两个时钟相信大家都比较熟悉了,那我们看一下第一个时钟是什么。(翻遍了数据手册没有找个的说明,可能我找到的不够仔细,翻了几本书也没有找到,但是后面我们也基本没有用到这个,暂且忽略吧,等我明白了是什么,会在补充上来的)

这样我们的时钟也就选定了。假定我们选择ACLK,这里的ACLK是32.768KHz,从我们时钟图上面可以看出,这里不再说明哈,大家试着自己找一下咯!!

我们就可以计算出N值了,N = fBRCLK / Baudrate = 3.4133333

第二步:

这里我们要选择OS16这个位为1或者0

我们先选择为0,即进入了MSP430的UART的低频率控制模式,那么我们需要跳转到第四步去执行,我们需要查阅Table21-4,如下:

这里我们需要先计算一下我们的UCBRx = INT(N/16)  =  0

(错误说明,这里执行的应该是第二步的后面一步,计算的是UCBRx = INT(N)  =  3。)

N - (INT)N = 3.413 - 3 = 0.413,对应表格如下:

所以这里我们要设置UCBRSx = 0x53。

同样的如果我们设置OS16这个位为1,即进入了MSP430的UART的过采样模式,那么我们就要执行上面的第3步了。

UCBRx   =  INT(N/16) = 0

UCBFRx  =  INT( [ N/16 - INT ( N/16 ) ] x 16) = 0

通过上面我们大概了解了整个波特率的设置过程,我们会发现这中间其实非常的复杂和繁琐,也有很多东西我们设置完了就根本不知道对不对,我自己看的时候也是搞得很晕,一看就觉得烦导致这一讲的教程写了一个礼拜都没写完就是一直拖拖拖,但是我们认真的去看数据手册的话在后面可以看到其实TI给了我们相关的推荐配置,我们可以按照官方给的配置进行相关的寄存器配置从而达到我们想要的效果。

这两幅图中就给出了所有时钟源的大小对应的波特率以及UCOS位的设置对应的一些寄存器的值,我们以后可以不用自己去计算那些量,可以直接运用查表的方式进行配置,这样可以更加方便,同时配置出来的相对比较可靠。

是不是觉得前面都是废话,其实也不然,这算是一个探索的过程吧,也能够帮助我们去明白这个过程是怎么实现的,如果觉得前面都是废话,那直接跳到这里来就好了。

我们选择配置这个参数,选择这个参数也有一定原因的,是因为我们看到后面的TX error和RX error的百分比都是比较低的,所以他的通信可靠性比较高,所以我们选择这个进行配置。

好了接下来看下我们的库函数代码:

写完了才发现,板子上没有把P2.0 P2.1这两个口引出来,坑!!教训!!!

后来想想不对,我们板子插进电脑的时候回有一个串口出现,应该我们的ESUCI_A0模块也就是我们对应P2.0和P2.1所对应的串口了。

好了我们现在写好了一下的代码:

相对注释的话也比较清楚了,有什么不明白的地方留言一下,我会帮你解答的。

解释一下MSB/LSB  (Least Significant Bit)/(Most Significant Bit)

这个的意思就是说,举个例子来说比较清楚,就是说我们要发一个自己的数据比如说我们发一个数据位0100_1011这样,那么我们看来这个数据从低位0到最高位1这样子,那么我们在发送这个数据的时候就有两种模式了,一种是LSB,就是从最低位开始发到最高位,也就是最低位有效,那么另外一种自然而然就是相反了,从高位往地位开始发到最低位,就是MSB模式了,这样子大家应该可以明白了吧。

这个部分还算是比较难的,很多东西需要细细去看,一步一步去做,像我调试这个程序的时候我一直以为是我的计算出错了,还是那个寄存器的配置出错了,但后来发现不是这样的,是因为的总中断没开,就这么一句简单的话,哎!!!弄了半天。

我们看下实际的效果,我们把代码下载进去,打开我们的软件,这里我用的是XCOM V2.0,的串口软件,如果你有其他的也可以。

串口选择如图所示:

这一讲花了很长时间,说实话没有一直在看这个部分,是因为他很复杂,一再看着看着就放弃了,要是以前可能就不想学了,就直接放弃了,但是现在是有责任在身必须要给大家一个好的交代,这一块可能讲的不是很好,后面我会在进行改进的。

感谢大家的支持!!!!!!

(0)

相关推荐

  • STM32系统学习——USART(串口通信)

    串口通信是一种设备间非常常用的串行通行方式,其简单便捷,大部分电子设备都支持. 一.物理层 常用RS-232标准,主要规定了信号的用途.通信接口以及信号的电平标准. "DB9接口" ...

  • STM32串口通信基本原理

    通信方式 并行通信 传输原理:数据各个位同时传输 优点:速度快(一个引脚传输一个位) 缺点:占用引脚资源多 串行通信 传输原理:数据按位顺序传输 优点:占用引脚资源少(一个引脚都可以) 缺点:速度相对 ...

  • 【MSP430趣谈】MSP430第十二讲之ADC(下)

    Ksps的意思是每秒转换次数为多少. 这里插播一个细节的东西,德州仪器(TI)的官网不管对于库函数还是寄存器都给出了示例代码,我们通过我们CCS环境下面的TI Resource Explorer下面查 ...

  • 【MSP430趣谈】MSP430第十二讲之ADC(上)

    首先我们需要明白一个问题是什么是ADC,中文翻译过来就是模数转换器,从他的英文名的话我们会更加好记,Analog-to-Digital Converter. 简而言之就是将模拟量转换为数字量.在我们的 ...

  • 【MSP430趣谈】MSP430第十讲之SPI总线驱动OLED

    上次我们说到了430的UART的使用方法,当我们一步一步开始探索的时候会发现它的实际应用是十分复杂的,但是经过我们的慢慢的看下来,我们看到TI给了很多官方的参数供给我们进行选择,所以这里给我们带来了很 ...

  • 【MSP430趣谈】MSP430第八讲之时钟设置

    写到现在已经是第八讲了,希望大家多多支持.可能我的行文风格和我们的标题不大符合,趣谈,对吧.但是希望能够仔细的讲到每一点,让所有初学者能够明白.如果大家有不懂的地方也麻烦留言一下,也有帮助我补充和完善 ...

  • 【MSP430趣谈】MSP430第四讲之简谈中断

    上次和大家聊到了GPIO的使用,但是讲的不是很全面,要是全面涉及的话就是我们后面要讲的内容了,这里我们就不多加描述.在后期的讲解中也会慢慢涉及我们没有讲到的一些功能的.今天我们要涉及一个对于单片机来说 ...

  • 【MSP430趣谈】MSP430第二讲

    在上次我们说到了软件的安装以及相关的资料. 那么接下来我们即将进入"板子游戏"开发的过程咯! 首先打开我们的软件: 出现上面的对话框,我们可以选择我们自己的工程路径,一般下面的Us ...

  • 【MSP430趣谈】MSP430第一讲

    现在市面上属于单片机的有很多很多了,包括基础一点的51单片机,他出现的比较早,相对而言资料也稍微丰富一点.430也作为一款优秀的单片机,相信也有很多人运用这款单片机的作为自己的单片机入门的选项.但相对 ...

  • 【MSP430趣谈】MSP430第十三讲之DMA的应用

    本系列教程应该来说也已经基本接近尾声了,还会有几讲的内容,最后如果可以的话还回附上一个具体的案例让我们来看下具体该如何应用430这款产品.也将更加深入的探讨他的低功耗特性. 今天我们还是继续讨论430 ...

  • 【MSP430趣谈之六】时钟简介与图形化配置方式

    不知道大家现在有没有一点感觉步入单片机的感觉,这次我们来聊一聊关于单片机的"心脏基调",也就是单片的时钟.为什么说是心脏呢?也就是说单片机的运行步伐是靠这个时钟来决定的,按照时钟的 ...