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中配置路径。不再做一边了哈。