【MSP430趣谈】MSP430第五讲之库函数的使用
<div class='showpostmsg'>MSP430教程之五 哈哈!经过前面的四讲,不知道大家有收获没有。至少感觉自己有点入门了吧。可能大家会说为什么要写这个,那么多的书籍,也有很多的教程。我的出发点是他们大部分的都是以工程师的身份了,或者说已经从事这一块行业比较长的时间了。可能在学习的时候,很多时候他们遇到的问题对于他们来说没什么,但是我们有时候完全搞不明白。但是我觉得我作为一名刚刚学430的大学生来说,可能写出来的更加贴切大家在实际学习。也希望说把每一个问题都可以说到,但是这很难,也希望大家能够指出来,来帮助完成这个教程咯。 (PS:不知道大家有没有遇到说跟着教程做,但是他是对的,自己也是一步一步来的,但是就是不对,完全不知所以然,有时候,真的给气死。) 好了,废话讲了一堆,进入我们今天的学习,我们这次学习的话就是来看看怎么运用官方的库。对于前面两三次的代码我们都是通过直接操作寄存器的方式,(就不解释寄存器了哈,这个概念还是蛮复杂的哈,自行百度)那么还有其他的方式,就是建立在库的层面,也就是我们看不到寄存器了,看到是每一个子函数的函数名了,也就是所谓的API(Application Programming Interface,应用程序编程接口)。可能说的有点抽象哈,我们看下具体长什么样哈。 文件在第一讲的文件当中哈,文件夹MSP-EXP430FR5969_Software_Examples_windows 打开我们看到, 在Readme中我们可以了解整个文件夹的结构和他们的内容。(就不翻译了,不要嫌我懒,因为真的太多了) 这里我们利用的是上图红色方框中的库文件,打开后目录如下, 我们打开driverlib,里面有个文件夹MSP430FR5xx_6xx,好了,我们看到我们的库了。 好多好多好多。。。。。。。其实TI官方也挺懒的,有没有发现每个文件都只是以模块命名的,没有说使用与那些单片机,当以后大家下载TI其他芯片的库的时候发现他也是这样做的,哎。等等我们来改造一下好了。我们开的这个文件夹430BOOST-SHARP96_GrlibExample_FR5969是一个TI官方的一个Demo 我们看下怎么导入这个工程哈。 打开ccs,点击files 单击Import 选择 Code Composer Studio下面的CCS Project 单击Browse,找到你的文件夹,记住是430BOOST-SHARP96_GrlibExample_FR5969,这个文件夹。单击Finish即可。但是这里我犯了一个错误,就是我把这个工程放在了中文路径下,如果大家要编译这个工程的话一定要放在英文路径下。大家就可以在工程的那个窗口中找到我们的工程,可以看看目录长什么样,这里我们就不讲了,我们看看怎么用这个库。 我们这里要运用外设库,我们右键复制上面的driverlib,然后右键我们新的工程名,选择粘贴即可。 接下来我们需要更改一下路径,把我们刚刚添加进来的文件的路径加进去。右键工程名选择properties。 单机黑色方框中的按钮, 选择workspace。 选择driverlib。单击ok即可。接下来我们就可以进行程序编写了。但是有个问题就是我们该如何使用这个库呢?TI官方有个网站来说明这些库函数的具体使用方法,我再最后给出了该网站的HTML文件,方便大家使用。还有一份PDF的说明文件,建议用这个吧。在附件中。路径如下。 (PS:上面的方法是不用msp430ware的方法,大家可以通过msp430ware的安装来完成一样的功能。430ware我不是很熟悉,这里就不介绍了,之后有机会我们在说说它的使用) 现在我们使用库文件来实现上次讲的按键中断点亮led的功能。第一步同样还是需要关闭看门狗,我们建立工程的时候选择了带有main.c的工程,已经帮我们写好了main函数和关闭看门狗的语句,这里就不在写了。第二步就是要关闭LPM5模式,我们看下怎么用库。所先第一步要将我们所有的库文件包含进来,#include “driverlib.h” 在PDF文件夹中,我们在PMM章节中找到关闭LPM5的方法。只需这样写:PMM unlockLPM5();(关于函数的具体内容我们直接点击PDF文件中蓝色的文字即可马上跳转过去,很方便。)接下来我们需要配置引脚方向,跳转到GPIO章节。 这里列出了所有的函数列表,方便我们查找(对英文有一定挑战!!年轻人,这有什么,不就是英文嘛,打开有道词典,别怂!!) GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);//设置为LED端口为输出 GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);//设置LED默认输出为点亮 GPIO_setAsInputPin(GPIO_PORT_P1,GPIO_PIN1);//设置为按键端口为输入 GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1,GPIO_PIN1);//配置按键上拉电阻 GPIO_selectInterruptEdge(GPIO_PORT_P1,GPIO_PIN1,GPIO_HIGH_TO_LOW_TRANSITION);//设置按键输入下降沿触发 GPIO_enableInterrupt(GPIO_PORT_P1,GPIO_PIN1);//使能按键端口中断上面我们就完成了端口的设置#pragma vector = PORT1_VECTOR //该语句用来标识我们所列矢量的中断服务函数如果这句不是很理解也没关系,暂且明白,就是要这么用。下面就是我们的中断函数了。我们将上次的代码全部改成用库函数来编写。__interrupt void PORT1_ISR(void){ unsigned int Key = 0; Key = GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN1); if(Key == 0) { __delay_cycles(50000); if(Key == 0) { GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0); } } GPIO_clearInterrupt(GPIO_PORT_P1,GPIO_PIN1);} 这里再解释几个问题,关于__delay_cycles(10000)是调用了系统函数,但是函数的具体意思我也不是很明白,希望大家可以帮忙回答哈。解释一下按键的延时,为什么要这样。因为按键是属于机械机构,具有不稳定性,需要进行一段时间才可以稳定,刚按下状态是不定,产生抖动。通过延时去除这种不稳定性。我们这里使用的是软件消抖,当然也通过硬件的方式,并联一个电容即可,但是这样就增加了硬件成本。 附件中给了另外一份库文件,如果大家没有下载之前的文档也没关系,使用方法也和上面类似的,就是把driverlib拷贝到你的工程目录下面然后右键工程选择Import下面的import, 选择File System然后找到工程目录下的driverlib就可以了。其他的和上面一样。 得到下面的工程目录。同样的在properties中配置路径。不再做一边了哈。【MSP430趣谈】MSP430第一讲【MSP430趣谈】MSP430第二讲【MSP430趣谈】MSP430第三讲之如何写自己的第一个程序【MSP430趣谈】MSP430第四讲之简谈中断【MSP430趣谈】MSP430第五讲之简谈中断【MSP430趣谈】MSP430第六讲之时钟简介与图形化配置方式【MSP430趣谈】MSP430第七讲之库函数的定时器使用
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> 呵呵,首先对教程的更新点赞{:1_103:},关于TI的文件以模块命名,并不是因为懒哦,是因为许多芯片虽然型号不同(芯片的资源有差异)但仍有很多资源的用法是相同的(例如串口),所以很多时候我们把某个系列芯片的头文件包含进来就可以了,这样命名更好的体现了通用性,教程中的开发工具本人没用过,如果使用IAR的话,会发现库文件里其实是有对应的指定型号单片机的头文件的,很灵活的。尽量避免做重复的工作,“懒”也是一种美德哦 dong2213dong 发表于 2015-12-1 08:49
呵呵,首先对教程的更新点赞,关于TI的文件以模块命名,并不是因为懒哦,是因为许多芯片虽然型号 ...
嗯嗯,有时候这样做必然有他的道理,可能我从32过来,突然换了有点不习惯 首先给楼主点个赞{:1_103:}{:1_103:}{:1_103:},__delay_cycles(10000)调用void __delay_cycles(unsigned long cycles);函数,机器周期延时。再提一个意见,直接从ccs导入空的库工程,效率高很多 数码小叶 发表于 2015-12-1 16:51
首先给楼主点个赞,__delay_cycles(10000)调用void __delay_cycles( ...
好的,具体我试试看,谢谢咯! 给楼主点赞{:1_103:}{:1_103:} 真的是好文章,支持版主{:1_103:}{:1_103:}{:1_103:}{:1_103:}{:1_103:} 写的不错:) crysislove 发表于 2015-12-1 18:38
给楼主点赞
谢谢支持!! lclhitwh 发表于 2015-12-1 19:11
真的是好文章,支持版主
谢谢支持哈!! wateras1 发表于 2015-12-1 22:40
写的不错
谢谢支持:) 我感觉库函数用起来运行速度和编译速度都太慢了,直接写寄存器比较快。
vilsen 发表于 2015-12-3 11:43
我感觉库函数用起来运行速度和编译速度都太慢了,直接写寄存器比较快。
恩,对于430来说可能在运行速度上面库函数和寄存器可能差的会多一点,我后面会给出库函数和寄存器的两张方法实现各个模块的功能,主要讲库函数的原因是因为当你接触了稍微复杂一点的单片机,或者更为上层的开发的时候,你能够更好更快的上手 不错 继续:time: xuanxuan170 发表于 2015-12-3 18:50
不错 继续
谢谢支持!! 希望楼主可以继续更新。这个系列我都看了,感觉确实有了很多与以往不同的认识。谢谢楼主,支持楼主,楼主继续,希望早日看到你的第六讲 纠结者 发表于 2015-12-7 21:50
希望楼主可以继续更新。这个系列我都看了,感觉确实有了很多与以往不同的认识。谢谢楼主,支持楼主,楼主继 ...
谢谢支持!! 为何编译程序的时候,错误显示:无法打开“driverlib.h”? 是我没添加路径正确?我按照步骤把 driverlib添加到我的工程下的,然后又设置了路径。不知道哪里出错了! 什么时候更新下一章啊,卤煮!:Cry: