查看: 16893|回复: 44

【有奖征文】LM4F Launchpad之按键中断

  [复制链接]
  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-12-29 18:41:04 | 显示全部楼层 |阅读模式
    分享到:
        我想当大家有个开发板时建的第一个工程应该是点亮LED灯吧。这回我们也来点亮下LED灯,不过鉴于点亮LED灯的程序就是官方提供的例程Project0,所以我们稍微加点东西吧。我们使用LM4F Launchpad开发板上的按键来点亮开发板上的RGB三色LED灯,这样一来GPIO口的输入,输出和中断功能全部都使用到了,应该也是一个入门的好方法。下面我们使用CCS来建立我们的工程。
        1.打开CCS,File->New->CCS Project,在弹出来的对话匡中国输入工程名KeyInt,选择对应的型号Stellaris LM4F120H5QR,并选择建立Empty Project(with main.c)
        未命名.jpg
        2.右击工作空间中的KeyInt,单击Properties
        未命名1.jpg
        选择build->ARM Compiler->Include Options,在右边的包含路径中加入StellarisWare固件库的路径,我的是"D:\ti\StellarisWare",请根据你的路径修改;在build->ARM Linker->File Search Path下包含要用的driverlib-cm4f.lib,该文件在
    StellarisWare\driverlib\ccs-cm4f\Debug下
        未命名1.jpg 未命名2.jpg
        3.开发板的按键对应的引脚为PF4,我们可以使用GPIO Port F的中断来检测按键。因为要使用中断,所以我们要将初始化中断向量表的startup_ccs.c复制到工程文件目录下,该文件可以在官方提供的Project0中找到。在startup_ccs.c中找到GPIO Port F的中断函数地址处,加入中断处理函数KeyISR,并在文件前面加入extern void KeyISR(void);表示中断文件在其他文件中。
        4.在main.c中包含头文件,编写中断函数KeyISR和主函数
    1. /*
    2. * main.c
    3. */
    4. #include "inc/hw_memmap.h"
    5. #include "inc/hw_types.h"
    6. #include "driverlib/sysctl.h"
    7. #include "driverlib/gpio.h"
    8. #include "driverlib/interrupt.h"
    9. #include "inc/hw_ints.h"

    10. #define SYS_CLOCK        50000000                   //CPU时钟频率

    11. #define KEY GPIO_PIN_4                                //按键USE_SW1引脚宏定义

    12. #define RED_LED   GPIO_PIN_1             //红色LED灯宏定义
    13. #define BLUE_LED  GPIO_PIN_2                //蓝色LED灯宏定义
    14. #define GREEN_LED GPIO_PIN_3                //绿色LED灯宏定义

    15. long key_value  = 0;                //按键值
    16. //**********************************************************************
    17. //本工程使用PF4上的按键采用中断方法依次点亮和熄灭RGB三色LED灯(PF1,PF2,PF3)
    18. //**********************************************************************
    19. void main(void)
    20. {
    21.         int i = 0;
    22.         long temp = 0;
    23.         //使用外部16M晶振,使用PLL,系统时钟设为50MHz
    24.         SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |
    25.                                SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
    26.         //使能按键和LED所在的GPIO
    27.         SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    28.         //初始化LED灯引脚,设置为输出
    29.         GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,RED_LED | BLUE_LED | GREEN_LED);
    30.         //配置LED灯引脚:最大输出电流2mA,推拉输出
    31.         GPIOPadConfigSet(GPIO_PORTF_BASE,RED_LED | BLUE_LED| GREEN_LED,
    32.                                  GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD);
    33.         //初始化按键引脚,设置为输入
    34.         GPIOPinTypeGPIOInput(GPIO_PORTF_BASE,KEY);
    35.         //配置按键引脚:弱上拉输入
    36.         GPIOPadConfigSet(GPIO_PORTF_BASE,KEY,
    37.                                          GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
    38.         //设置GPIO中断方式:上升沿触发
    39.         GPIOIntTypeSet(GPIO_PORTF_BASE,KEY,GPIO_RISING_EDGE);
    40.         //使能按键引脚的GPIO中断
    41.         GPIOPinIntEnable(GPIO_PORTF_BASE,KEY);
    42.         IntEnable(INT_GPIOF);
    43.         while(1)
    44.         {
    45.                 //如果按键按下进入事件处理
    46.                 if(key_value & KEY)
    47.                 {
    48.                         switch(i)
    49.                         {
    50.                         case 0://红灯翻转
    51.                                 temp = GPIOPinRead(GPIO_PORTF_BASE,RED_LED);
    52.                                 GPIOPinWrite(GPIO_PORTF_BASE,RED_LED,~temp);
    53.                                 key_value &= ~KEY;
    54.                                 i = 1;
    55.                                 break;
    56.                         case 1://蓝灯翻转
    57.                                 temp = GPIOPinRead(GPIO_PORTF_BASE,BLUE_LED);
    58.                                 GPIOPinWrite(GPIO_PORTF_BASE,BLUE_LED,~temp);
    59.                                 key_value &= ~KEY;
    60.                                 i = 2;
    61.                                 break;
    62.                         case 2://绿灯翻转
    63.                                 temp = GPIOPinRead(GPIO_PORTF_BASE,GREEN_LED);
    64.                                 GPIOPinWrite(GPIO_PORTF_BASE,GREEN_LED,~temp);
    65.                                 key_value &= ~KEY;
    66.                                 i = 0;
    67.                                 break;
    68.                         }
    69.                 }
    70.                 else
    71.                 {
    72.                 }
    73.         }
    74. }
    75. void KeyISR(void)
    76. {
    77.         //读取中断状态
    78.         key_value = GPIOPinIntStatus(GPIO_PORTF_BASE,true);
    79.         //清中断标志
    80.         GPIOPinIntClear(GPIO_PORTF_BASE,key_value);
    81.         //延时约10ms
    82.         SysCtlDelay(10 * (SYS_CLOCK / 3000));
    83. }
    复制代码
    5.点击Project->Build Project来编译工程,再点Run->Debug进入调试界面,按F8开始调试,按下按键可以看到红灯亮,再按会有其他等依次亮起再依次熄灭。下面是效果视频和完整工程,记得要把StellarisWare固件库的路径和driverlib-cm4f.lib 的路径改成你的,不然可能会报错
       
    KeyInt.zip (35.24 KB, 下载次数: 43)
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2014-5-18 22:32
  • 签到天数: 257 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-12-29 19:14:07 | 显示全部楼层
    学习了,给力
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-12-29 19:24:59 | 显示全部楼层
    qinkaiabc 发表于 2012-12-29 19:14
    学习了,给力

    算是一个入门贴,新手学习比较有用
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-8-7 21:35
  • 签到天数: 340 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-12-29 20:45:38 | 显示全部楼层
    支持一下……
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-12-29 21:05:02 | 显示全部楼层
    kk5290122 发表于 2012-12-29 20:45
    支持一下……

    呵呵,谢谢啦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-8-7 21:35
  • 签到天数: 340 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-12-29 21:12:39 | 显示全部楼层
    ming1006 发表于 2012-12-29 21:05
    呵呵,谢谢啦

    呵呵……客气啥,大家相互支持!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-12-29 21:21:15 | 显示全部楼层
    kk5290122 发表于 2012-12-29 21:12
    呵呵……客气啥,大家相互支持!

    最近玩的什么板子呢?M4的好像就我们几个抢到的和买的人在玩
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-2-19 13:12
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-12-29 21:21:59 | 显示全部楼层
    支持支持,最近忙,没时间玩板子了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-12-29 21:37:44 | 显示全部楼层
    xuyuanping1075 发表于 2012-12-29 21:21
    支持支持,最近忙,没时间玩板子了。

    是在忙期末考吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-2-19 13:12
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-12-29 21:39:11 | 显示全部楼层
    ming1006 发表于 2012-12-29 21:37
    是在忙期末考吗

    期末考试不多,假期去德国的一个月,交换项目,最近忙签证呢
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-21 13:52 , Processed in 0.201483 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.