⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpio_k40.c

📁 freescale k40/k60 gpio 例程
💻 C
字号:
/*
 * File:		gpio_k40.c
 * Purpose:		LED and Switch Example
 *
 *                      Configures GPIO for the LED and push buttons on the TWR-K40X256
 *                      Blue LED - On
 *                      Green LED - Toggles on/off
 *                      Orange LED - On if SW4 pressed
 *                      Yellow LED - On if SW3 pressed
 *
 *                      Also configures push buttons for falling IRQ's. ISR
 *                        configured in vector table in isr.h
 */

#define GPIO_PIN_MASK            0x1Fu
#define GPIO_PIN(x)              (((1)<<(x & GPIO_PIN_MASK)))

#include "common.h"

//Function declarations
void init_gpio(void);
void delay(void);

/********************************************************************/

void main (void)
{
  printf("TWR-K40X256 GPIO Example!\n");

  /* Turn on all port clocks */
  SIM_SCGC5 = SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK;

  /* Enable GPIOC interrupts in NVIC */
  enable_irq(89); //GPIOC Vector is 105. IRQ# is 105-16=89

  /* Initialize GPIO on TWR-K40X256 */
  init_gpio();

  while(1)
  {
    //Set PTB11 to 0 (turns on blue LED)
    GPIOB_PDOR&=~GPIO_PDOR_PDO(GPIO_PIN(11));

    //Toggle the green LED on PTC9
    GPIOC_PTOR|=GPIO_PDOR_PDO(GPIO_PIN(9));

    //Look at status of SW3 on PTC5
    if((GPIOC_PDIR & GPIO_PDIR_PDI(GPIO_PIN(5)))==0) //if pressed...
    {
      GPIOC_PDOR&=~GPIO_PDOR_PDO(GPIO_PIN(8)); //Set PTC8 to 0 (turns on yellow LED)
    }
    else  //else if not pressed...
    {
      GPIOC_PDOR|=GPIO_PDOR_PDO(GPIO_PIN(8)); //Set PTC8 to 1 (turns off yellow LED)
    }

    //Look at status of SW4 on PTC13
    if((GPIOC_PDIR & GPIO_PDIR_PDI(GPIO_PIN(13))) == 0)  //If pressed...
    {
      GPIOC_PDOR&=~GPIO_PDOR_PDO(GPIO_PIN(7)); //Set PTC7 to 0 (turns on orange LED)
    }
    else //else if not pressed...
    {
      GPIOC_PDOR|=GPIO_PDOR_PDO(GPIO_PIN(7)); //Set PTC7 to 1 (turns off orange LED)
    }

    delay();
  }
}

/*
 * Initialize GPIO for Tower switches and LED's
 *
 *   PTC5 - SW3
 *   PTC13 - SW4
 *
 *   PTB11 - Blue LED (E4)
 *   PTC9 - Green LED (E3)
 *   PTC8 - Yellow LED (E2)
 *   PTC7 - Orange LED (E1)
 *
 */
void init_gpio()
{
  //Set PTC5 and PTC13 (connected to SW3 and SW4) for GPIO functionality, falling IRQ,
  //   and to use internal pull-ups. (pin defaults to input state)
  PORTC_PCR5=(0|PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK);
  PORTC_PCR13=(0|PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK);

  //Set PTB11, PTC7, PTC8, and PTC9 (connected to LED's) for GPIO functionality
  PORTB_PCR11=(0|PORT_PCR_MUX(1));
  PORTC_PCR7=(0|PORT_PCR_MUX(1));
  PORTC_PCR8=(0|PORT_PCR_MUX(1));
  PORTC_PCR9=(0|PORT_PCR_MUX(1));

  //Change PTB11, PTC7, PTC8, PTC9 to outputs
  GPIOB_PDDR=GPIO_PDDR_PDD(GPIO_PIN(11));
  GPIOC_PDDR=GPIO_PDDR_PDD(GPIO_PIN(7) | GPIO_PIN(8) | GPIO_PIN(9));	
}
/********************************************************************/

/*
 * ISR for PORTC interrupts
 */
void portc_isr(void)
{
  if(PORTC_ISFR & PORT_ISFR_ISF(GPIO_PIN(5)))
  {
     printf("SW3 Pressed\n");
  }
  if(PORTC_ISFR & PORT_ISFR_ISF(GPIO_PIN(13)))
  {
     printf("SW4 Pressed\n");
  }
  PORTC_ISFR=0xFFFFFFFF;  //Clear Port C ISR flags
}

/*
 * ISR for PORTE interrupts
 */
void porte_isr(void)
{
  PORTE_ISFR=0xFFFFFFFF;  //Clear Port E ISR flags
}

/*
 * ISR for PORTA interrupts
 */
void porta_isr(void)
{
  PORTA_ISFR=0xFFFFFFFF;  //Clear Port A ISR flags
}


/*
 * Function to provide a short delay
 */
void delay()
{
  unsigned int i, n;
  for(i=0;i<30000;i++)
  {
    for(n=0;n<200;n++)
    {
      asm("nop");
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -