11028|33

1158

帖子

2

TA的资源

版主

楼主
 

【MSP430趣谈】MSP430第九讲之串口使用 [复制链接]

 
本帖最后由 michael_llh 于 2016-2-2 12:11 编辑

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,的串口软件,如果你有其他的也可以。
串口选择如图所示:
    这一讲花了很长时间,说实话没有一直在看这个部分,是因为他很复杂,一再看着看着就放弃了,要是以前可能就不想学了,就直接放弃了,但是现在是有责任在身必须要给大家一个好的交代,这一块可能讲的不是很好,后面我会在进行改进的。
感谢大家的支持!!!!!!

MSP430G2x53、MSP430G2x13 混合信号微控制器(Rev. G).pdf (1.74 MB, 下载次数: 65)
MSP430x2xx 系列用户指南 (Rev. I).pdf (4.48 MB, 下载次数: 856)
code9_1.rar (410.56 KB, 下载次数: 143)

前面几讲都整合到这里了。

最新回复

赞一个,谢谢楼主,支持分享   详情 回复 发表于 2019-3-16 19:48

赞赏

1

查看全部赞赏

 
点赞 关注(5)

回复
举报

710

帖子

5

TA的资源

一粒金砂(高级)

沙发
 
顶顶,,

点评

感谢支持!  详情 回复 发表于 2016-2-1 22:31
 
 

回复

821

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
楼主把前8讲链接放在文章后部多好。方便阅读。

点评

好的我加上去下  详情 回复 发表于 2016-2-1 22:31
 
 
 

回复

1158

帖子

2

TA的资源

版主

4
 

感谢支持!
 
 
 

回复

1158

帖子

2

TA的资源

版主

5
 
lising 发表于 2016-2-1 22:28
楼主把前8讲链接放在文章后部多好。方便阅读。

好的我加上去下
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
写得很好。 感谢楼主的系列!

点评

恩恩,多谢支持了哈!  详情 回复 发表于 2016-2-2 12:12
 
 
 

回复

151

帖子

3

TA的资源

一粒金砂(中级)

7
 
波特率配置那部分应该是有一个小错误,“我们先选择为0,即进入了MSP430的UART的低频率控制模式,那么我们需要跳转到第四步去执行,我们需要查阅Table21-4,如下:
    这里我们需要先计算一下我们的UCBRx = INT(N/16)  =  0”这里

点评

哦哦,看到了,感谢纠正哈!  详情 回复 发表于 2016-2-2 12:09
 
 
 

回复

1158

帖子

2

TA的资源

版主

8
 
wanyisq 发表于 2016-2-2 10:09
波特率配置那部分应该是有一个小错误,“我们先选择为0,即进入了MSP430的UART的低频率控制模式,那么我们 ...

哦哦,看到了,感谢纠正哈!
 
 
 

回复

1158

帖子

2

TA的资源

版主

9
 
jeremyino0630 发表于 2016-2-2 10:06
写得很好。 感谢楼主的系列!

恩恩,多谢支持了哈!
 
 
 

回复

954

帖子

25

TA的资源

纯净的硅(初级)

10
 
赞一个

点评

谢谢!  详情 回复 发表于 2016-2-17 15:48
 
个人签名这个人不懒,但是仕么都没留下
 
 

回复

1158

帖子

2

TA的资源

版主

11
 
 
 
 

回复

6069

帖子

4

TA的资源

版主

12
 
学习了

点评

谢谢支持!!  详情 回复 发表于 2016-2-19 14:30
 
 
 

回复

1158

帖子

2

TA的资源

版主

13
 

谢谢支持!!
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

14
 
支持支持

点评

谢谢!  详情 回复 发表于 2016-3-4 21:29
 
 
 

回复

1158

帖子

2

TA的资源

版主

15
 

谢谢!
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

16
 
楼主,想请问你一下像串口的配置可以在Grace中进行配置,为什么你这里要调用库函数自己写呢?谢谢!

点评

因为作为学习来讲,就不应该选择懒散的方式,虽然这种方式很方便,但是个人觉得学习更应该懂得原理,懂得具体的实现方式,要不然哪一天真正在工作岗位上面,公司给你一款芯片的开发环境没有这个功能,那你怎么办  详情 回复 发表于 2016-4-13 12:35
 
 
 

回复

1158

帖子

2

TA的资源

版主

17
 
crjmail 发表于 2016-4-13 10:25
楼主,想请问你一下像串口的配置可以在Grace中进行配置,为什么你这里要调用库函数自己写呢?谢谢!

因为作为学习来讲,就不应该选择懒散的方式,虽然这种方式很方便,但是个人觉得学习更应该懂得原理,懂得具体的实现方式,要不然哪一天真正在工作岗位上面,公司给你一款芯片的开发环境没有这个功能,那你怎么办
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

18
 
你说的有道理,其实我也有困惑的地方。比如,我在grace把某些引脚定义为输入输出了,但是具体到里面,某些引脚是什么功能还是需要另外进行宏定义的,你说是不?

点评

很抱歉,这个具体你需要看代码,在不熟悉芯片的情况下不建议用Grace  详情 回复 发表于 2016-4-13 17:46
 
 
 

回复

1158

帖子

2

TA的资源

版主

19
 
crjmail 发表于 2016-4-13 14:01
你说的有道理,其实我也有困惑的地方。比如,我在grace把某些引脚定义为输入输出了,但是具体到里面,某些 ...

很抱歉,这个具体你需要看代码,在不熟悉芯片的情况下不建议用Grace
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

20
 
楼主真是好人啊

点评

多谢支持,也欢迎多交流!!  详情 回复 发表于 2016-4-13 21:05
 
 
 

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

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表