美文网首页
嵌入式TM4C123GXL —— LED和Button

嵌入式TM4C123GXL —— LED和Button

作者: 泽泽馥泽泽 | 来源:发表于2017-12-07 22:36 被阅读0次

    嵌入式导论实验报告Guo-Lab2

    TM4C123GXL Button and Led

    实验题目

    熟悉实验环境和实验工具
    熟练使用C语言和GPOI的定义和改变

    实验目的

    搭建实验环境—Code Compose Studio,熟悉开发板EK-TM4C123GXL,学会使用时钟中断进行捕获按钮SW1和SW2的状态

    实验要求

    lab2-1 使用按钮控制灯的亮灭,按钮按下即灭掉,否则亮着
    lab2-2 使用按钮控制灯的亮灭,按钮一次灯由亮转灭,再按一次,按钮由灭转亮,按钮按下后改变灯的状态
    lab2-3 板载仿真,模仿简单的报警系统

    实验过程

    EK-TM4C123GXL 开发板

    <img src="https://img.haomeiwen.com/i2560767/96a21d58852d2cc6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width=650 height=400>

    LED 电路图

    <img src="https://img.haomeiwen.com/i2560767/dc50094710b3b6a7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width=600 height=400 >

    LED 与 SW 的管脚图

    GPOIF.png
    1. 使用按钮控制灯的亮灭,按钮按下即灭掉,否则亮着
      PF0~PF4是属于GPIO_PORT_F下的一组
      使用板子右下角的按钮,LED灯的颜色挑选为绿色(PF3) #define LED_GREEN 0x08
      由LED和SW的管脚图可得,右下角按钮对应为(PF0)0x01

    打开时钟while((SYSCTL_PRGPIO_R&0x20)==0){}不断的捕获按钮是否被按下

    当按钮被按下时,In=0;那么In移位之后也是0,Out被置为0,灯灭
    否则In=1;那么In 左移三位,Out=0x08,就是LED_GREEN

    while(1)
      {
        In = GPIO_PORTF_DATA_R&0x01;   // read PF0 into Sw2
        Out = In<<3;                    // shift into position PF3
        GPIO_PORTF_DATA_R = Out;        // output Green
      }
    

    完整代码:

    /*
     * lab2.c
     *
     *  Created on: 2017年12月7日
     *      Author: Zhong
     */
    
    #include "inc\tm4c123gh6pm.h"
    #include <stdint.h>
    #define LED_RED 0x02
    #define LED_BLUE 0x04
    #define LED_GREEN 0x08
    unsigned long In; // input from PF0
    unsigned long Out; // output to PF3 (Green LED)
    
    int main(void)
    {
      SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF; // enable PORT F GPIO
    
      while((SYSCTL_PRGPIO_R&0x20)==0){}; // allow time for clock to start
    
      GPIO_PORTF_LOCK_R = 0x4C4F434B;   // 2) unlock GPIO Port F
      GPIO_PORTF_CR_R = 0x1F;           // allow changes to PF4-0
      GPIO_PORTF_DIR_R = 0x0E; // PF4,PF0 in, PF3-1 out
      GPIO_PORTF_PUR_R = 0x11;          // enable pull-up on PF0 and PF4
      GPIO_PORTF_DEN_R = 0x1F; // enable digital PORT F
      GPIO_PORTF_DATA_R = 0; // clear all PORT F
    
      GPIO_PORTF_DATA_R = GPIO_PORTF_DATA_R | LED_RED | LED_BLUE | LED_GREEN; // set LED PORT F pins high //
      while(1)
      {
        In = GPIO_PORTF_DATA_R&0x01;   // read PF0 into Sw2
        Out = In<<3;                    // shift into position PF3
        GPIO_PORTF_DATA_R = Out;        // output Green
      }
    }
    
    
    1. 使用按钮控制灯的亮灭,按钮一次灯由亮转灭,再按一次,按钮由灭转亮,按钮按下后改变灯的状态

    PF0~PF4是属于GPIO_PORT_F下的一组
    使用板子右下角的按钮,LED灯的颜色挑选为红色(PF1)
    也可以直接定义地址#define PF1 (*((volatile uint32_t *)0x40025008))

    打开时钟while((SYSCTL_PRGPIO_R&0x20)==0){}不断的捕获按钮是否被按下

    while(1){
        SSR_On();
        while(GPIO_PORTF_DATA_R&0x01);        // wait for button press
        while((GPIO_PORTF_DATA_R&0x01) == 0); // wait for button release
        SSR_Off();
        while(GPIO_PORTF_DATA_R&0x01);        // wait for button press
        while((GPIO_PORTF_DATA_R&0x01) == 0); // wait for button release
      }
    
    

    进入死循环,初始化红灯亮着SSR_On(),(两个while循环判断按下和释放可以解决按钮抖动的问题)当按钮按下并放开时,进入SSR_Off(),红灯灭,再次按下按钮并释放,红灯再次点亮,循环往复。

    按下一次按钮可以改变灯的状态。

    完整代码:

    /*
     * lab2.c
     *
     *  Created on: 2017年12月7日
     *      Author: Zhong
     */
    #include <stdint.h>
    #include "inc\tm4c123gh6pm.h"
    
    #define PF2   (*((volatile uint32_t *)0x40025010))
    #define PF1   (*((volatile uint32_t *)0x40025008))
    
    // Make PF1 an output, enable digital I/O, ensure alt. functions off
    void SSR_Init(void){
      SYSCTL_RCGCGPIO_R |= 0x20;        // 1) activate clock for Port F
      while((SYSCTL_PRGPIO_R&0x20)==0){}; // allow time for clock to start
                                        // 2) no need to unlock PF2
    
    
      GPIO_PORTF_LOCK_R = 0x4C4F434B;   // 2) unlock GPIO Port F
      GPIO_PORTF_CR_R = 0x1F;           // allow changes to PF4-0
    
      GPIO_PORTF_PCTL_R &= ~0x00000F00; // 3) regular GPIO
    
    
      GPIO_PORTF_AMSEL_R &= ~0x02;      // 4) disable analog function on PF2
      GPIO_PORTF_DIR_R |= 0x02;         // 5) set direction to output
      GPIO_PORTF_AFSEL_R &= ~0x02;      // 6) regular port function
      GPIO_PORTF_DEN_R |= 0x02;         // 7) enable digital port
    }
    
    //// Make PF2 high
    //void SSR_On(void){
    //  PF2 = 0x04;
    ////  GPIO_PORTF_DATA_R |= 0x04;
    //}
    //// Make PF2 low
    //void SSR_Off(void){
    //  PF2 = 0x00;
    ////  GPIO_PORTF_DATA_R &= ~0x04;
    //}
    
    // Make PF1 high
    void SSR_On(void){
      PF1 = 0x02;
    //  GPIO_PORTF_DATA_R |= 0x04;
    }
    // Make PF2 low
    void SSR_Off(void){
      PF1 = 0x00;
    //  GPIO_PORTF_DATA_R &= ~0x04;
    }
    
    
    int main(void){
      SSR_Init();               // initialize PF2 and make it output
      GPIO_PORTF_DIR_R &= ~0x01;// make PF4 in (PF4 built-in button #1)
      GPIO_PORTF_AFSEL_R &= ~0x01;// disable alt funct on PF4
      GPIO_PORTF_PUR_R |= 0x01; // enable pull-up on PF4
      GPIO_PORTF_DEN_R |= 0x01; // enable digital I/O on PF4
                                // configure PF4 as GPIO
      GPIO_PORTF_PCTL_R = (GPIO_PORTF_PCTL_R&0xFFF0FFFF)+0x00000000;
      while(1){
        SSR_On();
        while(GPIO_PORTF_DATA_R&0x01);        // wait for button press
        while((GPIO_PORTF_DATA_R&0x01) == 0); // wait for button release
        SSR_Off();
        while(GPIO_PORTF_DATA_R&0x01);        // wait for button press
        while((GPIO_PORTF_DATA_R&0x01) == 0); // wait for button release
      }
    }
    
    
    
    1. 板载仿真,模仿简单的报警系统


      3.png 2.png 1.png

    实验总结

    相关文章

      网友评论

          本文标题:嵌入式TM4C123GXL —— LED和Button

          本文链接:https://www.haomeiwen.com/subject/rtajixtx.html