本帖最后由 Shuyang 于 2019-1-17 15:31 编辑
2.4 GPIO实验
下面我们将用两个实验来熟悉GPIO的两种基本应用场景——LED闪烁和读取按键。这两个应用场景分别对应GPIO的输出和输入,也是最经典的应用。通过这两个实验也可以进一步熟悉单片机GPIO的寄存器操作。
在实验开始之前需要清楚MSP430G2 LaunchPad板上LED和按键的硬件电路。板上共有2个LED灯和2个按键,P1.0连接红色LED,P1.6连接绿色LED。这两个LED都是通过跳线帽连接的,如果想断开LED,只需拔掉跳线帽即可。P1.3连接左边的按键,这个按键可以由用户自定义功能。右边的按键是Reset键,按下之后单片机会复位。
2.4.1 GPIO输出实验——LED闪烁
LED闪烁实验可谓是单片机编程中的“Hello World”实验,我们将用这个实验来熟悉GPIO寄存器的操作,同时利用该实验也将讲解如何进行程序调试。
实验目标:让MSP430G2553 LaunchPad上的绿色LED闪烁。
1) 新建一个CCS工程
新建一个CCS工程,芯片型号选择MSP430G2553,工程模板选择EmptyProject(with main.c)
2) GPIO初始化
将Lab2a_Output.txt中的代码拷贝到main.c中。这段代码中已经写好了程序框架,需要自行编写的是GPIO的初始化和LED闪烁的代码。首先在主程序中需要对GPIO做初始化,请根据之前介绍的LaunchPad硬件电路找到绿色LED对应的I/O口,并将其初始化为输出状态。请在“// Addyour code below to initialize the GPIO”下面一行添加你自己的初始化代码。 - int main(void) {
- WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
- // Add your code below to initialize the GPIO
-
- // End of your code
复制代码
3) LED闪烁
初始化完成后,就要通过编程让LED开始闪烁了。闪烁的过程是通过一个while循环完成的,每个循环中先将LED对应I/O口的电平置高,再置低,中间添加延时就可以实现LED闪烁。程序中已经设置好了延时的时间,请自行添加改变GPIO状态的语句。如果一切正常,代码执行后绿色LED将以1s左右为周期闪烁。 - while(1)
- {
- // Add your code below to set P1.6 high
-
- // End of your code
- _delay_cycles(500000);
-
- // Add your code below to Set P1.6 low
-
- // End of your code
- _delay_cycles(500000);
- }
-
- return 0;
复制代码
4) 在线调试程序
将程序编译并下载到LaunchPad中开始运行,LED是否按照预期开始闪烁了呢?如果没有也不用着急,下面我们将介绍如何在CCS中利用断点和单步调试功能对一个程序进行调试。在此之前请参考本实验的solution代码,该代码是本实验的示例代码。
在程序运行状态下点击暂停按钮,再点击Restart按钮,让程序重新回到初始状态。
下面我们打开寄存器查看窗口,来看一下P1DIR和P1OUT寄存器的值。在CCS Debug界面下,右上方应该会有寄存器查看窗口(Registers),如果没有可以通过View->Registers菜单打开。Registers窗口中可以看到所有的寄存器,展开Port_1_2可以找到P1DIR和P1OUT两个寄存器。
下面我们要查看程序执行过程中这两个寄存器的变化过程,但因为程序执行的速度是很快的,要看到寄存器变化的瞬间,必须利用CCS的单步调试功能。点击Step Over按钮,可以让程序一句一句的执行,同时在程序每一行的最左边会出现一个蓝色箭头,表示当前程序执行到这一句了。点击Step Over按钮,直到箭头指到GPIO初始化语句P1DIR |=BIT6这一句上。
此时程序还未执行这一句,再点击一下Step Over按钮,程序就将执行该语句。点击Step Over之后请观察Registers窗口,我们会发现P1DIR寄存器变成了黄色,这表示刚才执行的语句使P1DIR发生了变化。展开P1DIR,会发现其中第6位即P1.6从0变成了1,这表示我们已经成功将P1.6端口设成了输出端口。
下面我们将观察单片机是如何让LED实现闪烁的。这次我们使用断点功能来调试。所谓断点其实就是人为设置的程序暂停点,程序执行到断点处将自动暂停,以方便用户观察寄存器变化。
分别在“P1OUT |=BIT6”和“P1OUT&=~ BIT6”这两句之前的蓝色区域用鼠标双击,会出现一个小方块,表示我们在这两句之前加了断点。现在再点击前进按钮 ,程序会自动执行到第一个断点之前停下。
再点击一次前进,程序会停在第二个断点处。此时程序已经执行完“P1OUT |=BIT6”以及延时语句,我们观察Registers窗口,会发现P1OUT的第6位变成了1,同时观察LaunchPad,应该会发现绿色LED已经亮起。
再点击一次前进,程序会继续执行,直到遇到下一个断点,此时程序已完成一个while循环并回到第一个断点处,观察寄存器会看到P1OUT第6位变成了0,同时LaunchPad上的绿色LED熄灭。
不断重复点击前进,就会发现LED灯不断重复点亮和熄灭的过程,这就是LED闪烁的实现方式。
学会了使用单步调试和断点功能,当程序遇到问题时我们就可以利用这些调试手段快速找到出现问题的地方,以便我们分析程序出错的原因。上述的调试方法需要大家熟练掌握。
思考题1:刚才的程序中,我们使用了2句语句来分别将P1.6置高和置低。请将这两句合并成一句,完成同样的闪烁功能。 提示:回顾1.7节中介绍过的“取反”操作。
思考题2:本实验中使用了延时函数来实现LED闪烁,其实这是一种很浪费CPU资源的实现方式。请思考原因并想想有没有更好地解决方法。
|