Kinetis MKE04Z4 - GPIO primer

Moderator: tilz0R

Kinetis MKE04Z4 - GPIO primer

OdgovorNapisal/-a s54mtb » 14 Okt 2015, 23:10

Mali "kinetis" MKE04Z8VTG4 je 16 pinski, ceneni arm M v TSSOP ohišju, ki ga lahko vsak sam nalota na tiskanino, ki jo povalja v laminatorju. Za debugiranje je potreben primeren vmesnik, ki se zna pogovarjat z cortex M0 preko SWD porta. Tiskanine sploh ne bom risal, ker se tu vse vidi:

ke04 PCB.JPG


Za vzpostavitev okolja MDK od keila so navodila tukaj:
viewtopic.php?f=29&t=3235

Tam sem končal s primerom za žmiganje z enim pinom. Zaradi preglednosti sem ločil tale primer, saj sem dodal "driver" za GPIO z nekaj osnovnimi funkcijami in definicijo portov.

Če zgoraj omenjeni primer deluje, je čas za pogon vseh pinov.

V projekt dodamo gpio.c z naslednjo ovsebino:
Koda: Izberi vse
#include "MKE04Z4.h"                    // Device header
#include "gpio.h"

/*****************************************************************************//*!
* @brief    Initialize the GPIO registers to the default reset values.
* @param[in] pGPIO      Pointer to GPIO module, can be PTA/PTB.
* @return none
*****************************************************************************/
void GPIO_DeInit(GPIO_Type *pGPIO)
{
    pGPIO->PCOR = 0x00000000;   /* Port Clear Output Register */
    pGPIO->PDDR = 0x00000000;   /* Port Data Direction */
    pGPIO->PDOR = 0x00000000;   /* Port Data Output Register */
    pGPIO->PIDR = 0xFFFFFFFF;   /* Port Input Disable Register */
    pGPIO->PSOR = 0x00000000;   /* Port Set Output Register */
    pGPIO->PTOR = 0x00000000;   /* Port Toggle Output Register */
}

/*****************************************************************************//*!
* @brief    Initialize GPIO pins which are specified by u32PinMask
* @param[in] pGPIO      Pointer to GPIO module, can be PTA/PTB.
* @param[in] u32PinMask GPIO pin mask need to be set
* @param[in] sGpioType  pin attribute
* @return   none
*
* @Note
*   . High-current drive function is disabled, if the pin is configured as an input
*   . Internal pullup is disabled if the pin is configured as an output
*****************************************************************************/
void GPIO_Init(GPIO_Type *pGPIO, uint32_t u32PinMask, GPIO_PinConfigType sGpioType)
{   
    /* Config GPIO for Input or Output */
    if ((sGpioType == GPIO_PinOutput) || (sGpioType == GPIO_PinOutput_HighCurrent))
    {
        pGPIO->PDDR |= u32PinMask;      /* Enable Port Data Direction Register */
        pGPIO->PIDR |= u32PinMask;      /* Set Port Input Disable Register */   
    }
    else if ((sGpioType == GPIO_PinInput) || (sGpioType == GPIO_PinInput_InternalPullup))
    {
        pGPIO->PDDR &= ~u32PinMask;   /* Disable Port Data Direction Register */
        pGPIO->PIDR &= ~u32PinMask;   /* Clear Port Input Disable Register */
    }
    /* Config PORT Pull select for GPIO */
   
    switch((uint32_t)pGPIO)
    {
        case PTA_BASE:
            (sGpioType == GPIO_PinInput_InternalPullup)?(PORT->PUEL |= u32PinMask):(PORT->PUEL &= ~u32PinMask);
            break;
        default:
            break;
     }
   
    /* Config PORT GPIO_PinOutput_HighCurrent for GPIO */

    if (u32PinMask & GPIO_PTC5_MASK)
    {   
        PORT->HDRVE |= PORT_HDRVE_PTC5_MASK;
    }   
    if (u32PinMask & GPIO_PTC1_MASK)
    {   
        PORT->HDRVE |= PORT_HDRVE_PTC1_MASK;
    }   
    if (u32PinMask & GPIO_PTB5_MASK)
    {   
        PORT->HDRVE |= PORT_HDRVE_PTB5_MASK;
    }   


}

/*****************************************************************************//*!
* @brief    Toggle the pins which are specified by u32PinMask
* @param[in] pGPIO       Pointer to GPIO module, can be PTA/PTB.
* @param[in] u32PinMask  Specify GPIO pin need to be toggled
* @return none
*****************************************************************************/
void GPIO_Toggle(GPIO_Type *pGPIO, uint32_t u32PinMask)
{
    pGPIO->PTOR = u32PinMask;   /* Toggle the pins specified by u32PinMask */
}

/*****************************************************************************//*!
* @brief Read input data from GPIO which is specified by pGPIO
* @param[in] pGPIO       Pointer to GPIO module, can be PTA/PTB.
* @return   GPIO input value unsigned int 32-bit
*****************************************************************************/
uint32_t GPIO_Read(GPIO_Type *pGPIO)
{
    return (pGPIO->PDIR);   /* Read Port Data Input Register */
}

/*****************************************************************************//*!
* @brief    Write output data to GPIO which is specified by pGPIO
* @param[in] pGPIO       Pointer to GPIO module, can be PTA/PTB.
* @param[in] u32Value    value to output
* @return   none
*****************************************************************************/
void GPIO_Write(GPIO_Type *pGPIO, uint32_t u32Value)
{
    pGPIO->PDOR = u32Value;    /* Write Port Ouput Data Register */ 
}

/*****************************************************************************//*!
* @brief    Initialize GPIO single pin which is specified by GPIO_Pin
* @param[in] GPIO_Pin        GPIO pin name, can be GPIO_PTA0,1 ...
* @param[in] GPIO_PinConfig  Config output or input
* @return   none
*****************************************************************************/
void GPIO_PinInit(GPIO_PinType GPIO_Pin, GPIO_PinConfigType GPIO_PinConfig)
{
    /* Config GPIO and pull select*/
     
      if (GPIO_Pin < GPIO_PTE0)
      {
         switch (GPIO_PinConfig)
         {
         case GPIO_PinOutput:
               PTA->PDDR |= (1<<GPIO_Pin);      /* Enable Port Data Direction Register */
               PTA->PIDR |= (1<<GPIO_Pin);      /* Set Port Input Disable Register */
               PORT->PUEL &= ~(1<<GPIO_Pin);    /* Disable Pullup */
            break;
         case GPIO_PinInput:
               PTA->PDDR &= ~(1<<GPIO_Pin);     /* Disable Port Data Direction Register */
               PTA->PIDR &= ~(1<<GPIO_Pin);     /* Clear Port Input Disable Register */
               PORT->PUEL &= ~(1<<GPIO_Pin);    /* Disable Pullup */
            break;
         case GPIO_PinInput_InternalPullup:
               PTA->PDDR &= ~(1<<GPIO_Pin);     /* Disable Port Data Direction Register */
               PTA->PIDR &= ~(1<<GPIO_Pin);     /* Clear Port Input Disable Register */
               PORT->PUEL |= (1<<GPIO_Pin);    /* Enable Pullup */
            break;
         case GPIO_PinOutput_HighCurrent:
               PTA->PDDR |= (1<<GPIO_Pin);      /* Enable Port Data Direction Register */
               PTA->PIDR |= (1<<GPIO_Pin);      /* Set Port Input Disable Register */
               PORT->PUEL &= ~(1<<GPIO_Pin);    /* Disable Pullup */
            break;
         }
      }
   
       
    /* Config GPIO HDRV */
    if(GPIO_PinConfig == GPIO_PinOutput_HighCurrent)
    {
        switch (GPIO_Pin)
        {
            case GPIO_PTB5:
                PORT->HDRVE |= PORT_HDRVE_PTB5_MASK;
                break;
            case GPIO_PTC1:
                PORT->HDRVE |= PORT_HDRVE_PTC1_MASK;
                break;
            case GPIO_PTC5:
                PORT->HDRVE |= PORT_HDRVE_PTC5_MASK;
                break;
            default:
                break;
        }
     }
}

/*****************************************************************************//*!
* @brief    Toggle GPIO single pin which is specified by GPIO_Pin
* @param[in] GPIO_Pin        GPIO pin name, can be GPIO_PTA0,1 ...
* @return   none
*****************************************************************************/
void GPIO_PinToggle(GPIO_PinType GPIO_Pin)
{
    if (GPIO_Pin < GPIO_PTE0)
    {
        /* PTA0-7, PTB0-7, PTC0-7, PTD0-7 */
       PTA->PTOR = (1<<GPIO_Pin);
    }

}

/*****************************************************************************//*!
* @brief    Set GPIO single pin which is specified by GPIO_Pin
* @param[in] GPIO_Pin        GPIO pin name, can be GPIO_PTA0,1 ...
* @return   none
*****************************************************************************/
void GPIO_PinSet(GPIO_PinType GPIO_Pin)
{
   
    if (GPIO_Pin < GPIO_PTE0)
    {
        /* PTA0-7, PTB0-7, PTC0-7, PTD0-7 */
        PTA->PSOR = (1<<GPIO_Pin);
    }


}

/*****************************************************************************//*!
* @brief    Clear GPIO single pin which is specified by GPIO_Pin
* @param[in] GPIO_Pin        GPIO pin name, can be GPIO_PTA0,1 ...
* @return   none
*****************************************************************************/
void GPIO_PinClear(GPIO_PinType GPIO_Pin)
{
    if (GPIO_Pin < GPIO_PTE0)
    {
        /* PTA0-7, PTB0-7, PTC0-7, PTD0-7 */
        PTA->PCOR = (1<<GPIO_Pin);
    }


}


/*****************************************************************************//*!
* @brief    Toggle the pins which are specified by u32PinMask in single cycle.
* @param[in] pGPIO       Pointer to GPIO module, can be FGPIOA/FGPIOB.
* @param[in] u32PinMask  Specify GPIO pin need to be toggled
*****************************************************************************/
void FGPIO_Toggle(FGPIO_Type *pFGPIO, uint32_t u32PinMask)
{
    pFGPIO->PTOR = u32PinMask;   /* Toggle the pins specified by u32PinMask */
}


/*****************************************************************************//*!
* @brief Read input data from GPIO which is specified by pGPIO in single cycle.
* @param[in] pGPIO       Pointer to GPIO module, can be FGPIOA/FGPIOB.
* @return   GPIO input value unsigned int 32-bit
*****************************************************************************/
uint32_t FGPIO_Read(FGPIO_Type *pFGPIO)
{
    return (pFGPIO->PDIR);      /* Read Port Data Input Register */
 
}

/*****************************************************************************//*!
* @brief    Write output data to GPIO which is specified by pGPIO in single cycle.
* @param[in] pGPIO       Pointer to GPIO module, can be FGPIOA/FGPIOB.
* @param[in] u32Value    value to output
*****************************************************************************/
void FGPIO_Write(FGPIO_Type *pFGPIO, uint32_t u32Value)
{   
    pFGPIO->PDOR = u32Value;    /* Write Port Ouput Data Register */
}



koda je povzeta po knjižnice kexxx driver library:
KEXX_DRIVERS_V1.2.1_DEVD.zip


dodamo še header datoteko gpio.h:
Koda: Izberi vse
#ifndef __GPIO_H__
#define __GPIO_H__
 
//#include "stdint.h"

/******************************************************************************
* define gpio pin name
*******************************************************************************/
typedef enum
{
    /* in GPIOA register */
    GPIO_PTA0 = 0,              /*!< GPIO Pin PTA0 */
    GPIO_PTA1,                  /*!< GPIO Pin PTA1 */
    GPIO_PTA2,                  /*!< GPIO Pin PTA2 */
    GPIO_PTA3,                  /*!< GPIO Pin PTA3 */
    GPIO_PTA4,                  /*!< GPIO Pin PTA4 */
    GPIO_PTA5,                  /*!< GPIO Pin PTA5 */
    GPIO_PTA6,                  /*!< GPIO Pin PTA6 */
    GPIO_PTA7,                  /*!< GPIO Pin PTA7 */
    GPIO_PTB0,                  /*!< GPIO Pin PTB0 */
    GPIO_PTB1,                  /*!< GPIO Pin PTB1 */
    GPIO_PTB2,                  /*!< GPIO Pin PTB2 */
    GPIO_PTB3,                  /*!< GPIO Pin PTB3 */
    GPIO_PTB4,                  /*!< GPIO Pin PTB4 */
    GPIO_PTB5,                  /*!< GPIO Pin PTB5 */
    GPIO_PTB6,                  /*!< GPIO Pin PTB6 */
    GPIO_PTB7,                  /*!< GPIO Pin PTB7 */
    GPIO_PTC0,                  /*!< GPIO Pin PTC0 */
    GPIO_PTC1,                  /*!< GPIO Pin PTC1 */
    GPIO_PTC2,                  /*!< GPIO Pin PTC2 */
    GPIO_PTC3,                  /*!< GPIO Pin PTC3 */
    GPIO_PTC4,                  /*!< GPIO Pin PTC4 */
    GPIO_PTC5,                  /*!< GPIO Pin PTC5 */
    GPIO_PTC6,                  /*!< GPIO Pin PTC6 */
    GPIO_PTC7,                  /*!< GPIO Pin PTC7 */
    GPIO_PTD0,                  /*!< GPIO Pin PTD0 */
    GPIO_PTD1,                  /*!< GPIO Pin PTD1 */
    GPIO_PTD2,                  /*!< GPIO Pin PTD2 */
    GPIO_PTD3,                  /*!< GPIO Pin PTD3 */
    GPIO_PTD4,                  /*!< GPIO Pin PTD4 */
    GPIO_PTD5,                  /*!< GPIO Pin PTD5 */
    GPIO_PTD6,                  /*!< GPIO Pin PTD6 */
    GPIO_PTD7,                  /*!< GPIO Pin PTD7 */
    /* in GPIOB register */
    GPIO_PTE0,                  /*!< GPIO Pin PTE0 */
    GPIO_PTE1,                  /*!< GPIO Pin PTE1 */
    GPIO_PTE2,                  /*!< GPIO Pin PTE2 */
    GPIO_PTE3,                  /*!< GPIO Pin PTE3 */
    GPIO_PTE4,                  /*!< GPIO Pin PTE4 */
    GPIO_PTE5,                  /*!< GPIO Pin PTE5 */
    GPIO_PTE6,                  /*!< GPIO Pin PTE6 */
    GPIO_PTE7,                  /*!< GPIO Pin PTE7 */
    GPIO_PTF0,                  /*!< GPIO Pin PTF0 */
    GPIO_PTF1,                  /*!< GPIO Pin PTF1 */
    GPIO_PTF2,                  /*!< GPIO Pin PTF2 */
    GPIO_PTF3,                  /*!< GPIO Pin PTF3 */
    GPIO_PTF4,                  /*!< GPIO Pin PTF4 */
    GPIO_PTF5,                  /*!< GPIO Pin PTF5 */
    GPIO_PTF6,                  /*!< GPIO Pin PTF6 */
    GPIO_PTF7,                  /*!< GPIO Pin PTF7 */
    GPIO_PTG0,                  /*!< GPIO Pin PTG0 */
    GPIO_PTG1,                  /*!< GPIO Pin PTG1 */
    GPIO_PTG2,                  /*!< GPIO Pin PTG2 */
    GPIO_PTG3,                  /*!< GPIO Pin PTG3 */
    GPIO_PTG4,                  /*!< GPIO Pin PTG4 */
    GPIO_PTG5,                  /*!< GPIO Pin PTG5 */
    GPIO_PTG6,                  /*!< GPIO Pin PTG6 */
    GPIO_PTG7,                  /*!< GPIO Pin PTG7 */
    GPIO_PTH0,                  /*!< GPIO Pin PTH0 */
    GPIO_PTH1,                  /*!< GPIO Pin PTH1 */
    GPIO_PTH2,                  /*!< GPIO Pin PTH2 */
    GPIO_PTH3,                  /*!< GPIO Pin PTH3 */
    GPIO_PTH4,                  /*!< GPIO Pin PTH4 */
    GPIO_PTH5,                  /*!< GPIO Pin PTH5 */
    GPIO_PTH6,                  /*!< GPIO Pin PTH6 */
    GPIO_PTH7,                  /*!< GPIO Pin PTH7 */
    /* the following pins are not in KE02 */
    GPIO_PTI0,                  /*!< GPIO Pin PTI0 */
    GPIO_PTI1,                  /*!< GPIO Pin PTI1 */
    GPIO_PTI2,                  /*!< GPIO Pin PTI2 */
    GPIO_PTI3,                  /*!< GPIO Pin PTI3 */
    GPIO_PTI4,                  /*!< GPIO Pin PTI4 */
    GPIO_PTI5,                  /*!< GPIO Pin PTI5 */
    GPIO_PTI6,                  /*!< GPIO Pin PTI6 */
    GPIO_PTI7,                  /*!< GPIO Pin PTI7 */
    GPIO_PIN_MAX,
} GPIO_PinType;
/*! @} End of gpio_pin_name_list    */

/******************************************************************************
*define gpio pin mask
*******************************************************************************/
typedef enum
{
    /* in GPIOA register */
    GPIO_PTA0_MASK = (1U<<0),    /*!< GPIO Pin PTA0 bit mask */       
    GPIO_PTA1_MASK = (1U<<1),    /*!< GPIO Pin PTA1 bit mask */
    GPIO_PTA2_MASK = (1U<<2),    /*!< GPIO Pin PTA2 bit mask */
    GPIO_PTA3_MASK = (1U<<3),    /*!< GPIO Pin PTA3 bit mask */
    GPIO_PTA4_MASK = (1U<<4),    /*!< GPIO Pin PTA4 bit mask */
    GPIO_PTA5_MASK = (1U<<5),    /*!< GPIO Pin PTA5 bit mask */
    GPIO_PTA6_MASK = (1U<<6),    /*!< GPIO Pin PTA6 bit mask */
    GPIO_PTA7_MASK = (1U<<7),    /*!< GPIO Pin PTA7 bit mask */
    GPIO_PTB0_MASK = (1U<<8),    /*!< GPIO Pin PTB0 bit mask */
    GPIO_PTB1_MASK = (1U<<9),    /*!< GPIO Pin PTB1 bit mask */
    GPIO_PTB2_MASK = (1U<<10),   /*!< GPIO Pin PTB2 bit mask */
    GPIO_PTB3_MASK = (1U<<11),   /*!< GPIO Pin PTB3 bit mask */
    GPIO_PTB4_MASK = (1U<<12),   /*!< GPIO Pin PTB4 bit mask */
    GPIO_PTB5_MASK = (1U<<13),   /*!< GPIO Pin PTB5 bit mask */
    GPIO_PTB6_MASK = (1U<<14),   /*!< GPIO Pin PTB6 bit mask */
    GPIO_PTB7_MASK = (1U<<15),   /*!< GPIO Pin PTB7 bit mask */
    GPIO_PTC0_MASK = (1U<<16),   /*!< GPIO Pin PTC0 bit mask */
    GPIO_PTC1_MASK = (1U<<17),   /*!< GPIO Pin PTC1 bit mask */
    GPIO_PTC2_MASK = (1U<<18),   /*!< GPIO Pin PTC2 bit mask */
    GPIO_PTC3_MASK = (1U<<19),   /*!< GPIO Pin PTC3 bit mask */
    GPIO_PTC4_MASK = (1U<<20),   /*!< GPIO Pin PTC4 bit mask */
    GPIO_PTC5_MASK = (1U<<21),   /*!< GPIO Pin PTC5 bit mask */
    GPIO_PTC6_MASK = (1U<<22),   /*!< GPIO Pin PTC6 bit mask */
    GPIO_PTC7_MASK = (1U<<23),   /*!< GPIO Pin PTC7 bit mask */
    GPIO_PTD0_MASK = (1U<<24),   /*!< GPIO Pin PTD0 bit mask */
    GPIO_PTD1_MASK = (1U<<25),   /*!< GPIO Pin PTD1 bit mask */
    GPIO_PTD2_MASK = (1U<<26),   /*!< GPIO Pin PTD2 bit mask */
    GPIO_PTD3_MASK = (1U<<27),   /*!< GPIO Pin PTD3 bit mask */
    GPIO_PTD4_MASK = (1U<<28),   /*!< GPIO Pin PTD4 bit mask */
    GPIO_PTD5_MASK = (1U<<29),   /*!< GPIO Pin PTD5 bit mask */
    GPIO_PTD6_MASK = (1U<<30),   /*!< GPIO Pin PTD6 bit mask */
//    GPIO_PTD7_MASK = (1U<<31),   /*!< GPIO Pin PTD7 bit mask */
    GPIO_PTD7_MASK = (~0x7fffffff),   /*!< GPIO Pin PTD7 bit mask 1U<<31 avoid warning */

    /* in GPIOB register */
    GPIO_PTE0_MASK = (1U<<0),    /*!< GPIO Pin PTE0 bit mask */
    GPIO_PTE1_MASK = (1U<<1),    /*!< GPIO Pin PTE1 bit mask */
    GPIO_PTE2_MASK = (1U<<2),    /*!< GPIO Pin PTE2 bit mask */
    GPIO_PTE3_MASK = (1U<<3),    /*!< GPIO Pin PTE3 bit mask */
    GPIO_PTE4_MASK = (1U<<4),    /*!< GPIO Pin PTE4 bit mask */
    GPIO_PTE5_MASK = (1U<<5),    /*!< GPIO Pin PTE5 bit mask */
    GPIO_PTE6_MASK = (1U<<6),    /*!< GPIO Pin PTE6 bit mask */
    GPIO_PTE7_MASK = (1U<<7),    /*!< GPIO Pin PTE7 bit mask */
    GPIO_PTF0_MASK = (1U<<8),    /*!< GPIO Pin PTF0 bit mask */
    GPIO_PTF1_MASK = (1U<<9),    /*!< GPIO Pin PTF1 bit mask */
    GPIO_PTF2_MASK = (1U<<10),   /*!< GPIO Pin PTF2 bit mask */
    GPIO_PTF3_MASK = (1U<<11),   /*!< GPIO Pin PTF3 bit mask */
    GPIO_PTF4_MASK = (1U<<12),   /*!< GPIO Pin PTF4 bit mask */
    GPIO_PTF5_MASK = (1U<<13),   /*!< GPIO Pin PTF5 bit mask */
    GPIO_PTF6_MASK = (1U<<14),   /*!< GPIO Pin PTF6 bit mask */
    GPIO_PTF7_MASK = (1U<<15),   /*!< GPIO Pin PTF7 bit mask */
    GPIO_PTG0_MASK = (1U<<16),   /*!< GPIO Pin PTG0 bit mask */
    GPIO_PTG1_MASK = (1U<<17),   /*!< GPIO Pin PTG1 bit mask */
    GPIO_PTG2_MASK = (1U<<18),   /*!< GPIO Pin PTG2 bit mask */
    GPIO_PTG3_MASK = (1U<<19),   /*!< GPIO Pin PTG3 bit mask */
    GPIO_PTG4_MASK = (1U<<20),   /*!< GPIO Pin PTG4 bit mask */
    GPIO_PTG5_MASK = (1U<<21),   /*!< GPIO Pin PTG5 bit mask */
    GPIO_PTG6_MASK = (1U<<22),   /*!< GPIO Pin PTG6 bit mask */
    GPIO_PTG7_MASK = (1U<<23),   /*!< GPIO Pin PTG7 bit mask */
    GPIO_PTH0_MASK = (1U<<24),   /*!< GPIO Pin PTH0 bit mask */
    GPIO_PTH1_MASK = (1U<<25),   /*!< GPIO Pin PTH1 bit mask */
    GPIO_PTH2_MASK = (1U<<26),   /*!< GPIO Pin PTH2 bit mask */
    GPIO_PTH3_MASK = (1U<<27),   /*!< GPIO Pin PTH3 bit mask */
    GPIO_PTH4_MASK = (1U<<28),   /*!< GPIO Pin PTH4 bit mask */
    GPIO_PTH5_MASK = (1U<<29),   /*!< GPIO Pin PTH5 bit mask */
    GPIO_PTH6_MASK = (1U<<30),   /*!< GPIO Pin PTH6 bit mask */
//    GPIO_PTH7_MASK = (1U<<31),   /*!< GPIO Pin PTH7 bit mask */
    GPIO_PTH7_MASK = (~0x7fffffff),   /*!< GPIO Pin PTH7 bit mask 1U<<31 avoid warning */
      
    /* in GPIOC register */
    GPIO_PTI0_MASK = (1U<<0),    /*!< GPIO Pin PTI0 bit mask */
    GPIO_PTI1_MASK = (1U<<1),    /*!< GPIO Pin PTI1 bit mask */
    GPIO_PTI2_MASK = (1U<<2),    /*!< GPIO Pin PTI2 bit mask */
    GPIO_PTI3_MASK = (1U<<3),    /*!< GPIO Pin PTI3 bit mask */
    GPIO_PTI4_MASK = (1U<<4),    /*!< GPIO Pin PTI4 bit mask */
    GPIO_PTI5_MASK = (1U<<5),    /*!< GPIO Pin PTI5 bit mask */
    GPIO_PTI6_MASK = (1U<<6),    /*!< GPIO Pin PTI6 bit mask */
    GPIO_PTI7_MASK = (1U<<7),    /*!< GPIO Pin PTI7 bit mask */
} GPIO_PinMaskType;
/*! @} End of gpio_pin_mask_list    */


/******************************************************************************
*define gpio pin config type
*******************************************************************************/
/*
*   . Internal pullup is disabled if the pin is configured as an output
*   . High-current drive function is disabled, if the pin is configured as an input
*       Only PTH1/0, PTE1/0, PTD1/0, PTB5/4 support Hight-current Drive.
*/
typedef enum
{
    GPIO_PinOutput = 0,                 /*!< set pin as outout */
    GPIO_PinInput,                      /*!< set pin as input */
    GPIO_PinInput_InternalPullup,       /*!< set internal pullup for input pin */
    GPIO_PinOutput_HighCurrent,         /*!< set high drive for output pin */
} GPIO_PinConfigType;


void FGPIO_Toggle(FGPIO_Type *pFGPIO, uint32_t u32PinMask);
uint32_t FGPIO_Read(FGPIO_Type *pFGPIO);
void FGPIO_Write(FGPIO_Type *pFGPIO, uint32_t u32Value);
void GPIO_DeInit(GPIO_Type *pGPIO);
void GPIO_Init(GPIO_Type *pGPIO, uint32_t u32PinMask, GPIO_PinConfigType sGpioType);
void GPIO_Toggle(GPIO_Type *pGPIO, uint32_t u32PinMask);
uint32_t GPIO_Read(GPIO_Type *pGPIO);
void GPIO_Write(GPIO_Type *pGPIO, uint32_t u32Value);
void GPIO_PinInit(GPIO_PinType GPIO_Pin, GPIO_PinConfigType GPIO_PinConfig);
void GPIO_PinToggle(GPIO_PinType GPIO_Pin);
void GPIO_PinSet(GPIO_PinType GPIO_Pin);
void GPIO_PinClear(GPIO_PinType GPIO_Pin);
   
#endif /* #ifndef _GPIO_H_ */


V glavnem programu sledi še sprememba, da uporabimo naš "novi driver":
Koda: Izberi vse
#include "MKE04Z4.h"                    // Device header
#include "RTE_Components.h"             // Component selection
#include "gpio.h"

volatile uint32_t msTicks;                            /* counts 1ms timeTicks */

#define GPIOPORT   1UL<<8

__INLINE static void Delay (uint32_t dlyTicks) {
  uint32_t curTicks;

  curTicks = msTicks;
  while ((msTicks - curTicks) < dlyTicks);
}


void SysTick_Handler(void) {
  msTicks++;                        /* increment counter necessary in Delay() */
}


int main(void)
{
   SysTick_Config(SystemCoreClock/1000);         /* Generate interrupt each 1 ms    */
   
   /*
   PTA->PDDR |= (GPIOPORT);   // port = output
   PTA->PDOR |= (GPIOPORT);     // port = on
   */
   GPIO_PinInit(GPIO_PTB3, GPIO_PinOutput);
   
   while(1)
   {
    GPIO_PinToggle(GPIO_PTB3);
      Delay(500);
   }      
}



Po prevajanju in natankanju v flash mora desni spodnji pin utripat v eno sekundnem taktu.
Always going the extra mile.
https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 14710
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 2183 krat
Prejel zahvalo: 6096 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Kinetis MKE04Z4 - GPIO primer

OdgovorNapisal/-a s54mtb » 14 Okt 2015, 23:25

Pa še videu:
Always going the extra mile.
https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 14710
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 2183 krat
Prejel zahvalo: 6096 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Kinetis MKE04Z4 - GPIO primer

OdgovorNapisal/-a s54mtb » 14 Okt 2015, 23:32

Uporaba takega "driverja" je pootem sila preprosta. Pin inicializira

Koda: Izberi vse
void GPIO_PinInit(GPIO_PinType GPIO_Pin, GPIO_PinConfigType GPIO_PinConfig);


pri tem je

Koda: Izberi vse
    GPIO_PTA0 = 0,              /*!< GPIO Pin PTA0 */
    GPIO_PTA1,                  /*!< GPIO Pin PTA1 */
    GPIO_PTA2,                  /*!< GPIO Pin PTA2 */
    GPIO_PTA3,                  /*!< GPIO Pin PTA3 */
    GPIO_PTA4,                  /*!< GPIO Pin PTA4 */
...

itd

...


tip pa:

Koda: Izberi vse
    GPIO_PinOutput = 0,                 /*!< set pin as outout */
    GPIO_PinInput,                      /*!< set pin as input */
    GPIO_PinInput_InternalPullup,       /*!< set internal pullup for input pin */
    GPIO_PinOutput_HighCurrent,         /*!< set high drive for output pin */


Koda: Izberi vse
GPIO_Toggle
zamenja stanje pina, za kar uporabimo iste identifikatorje koot za iniacilizacijo.

če je vhod ga z
Koda: Izberi vse
GPIO_Read
preberemo

funkciji
Koda: Izberi vse
GPIO_PinSet()
GPIO_PinClear()

pa niti ne rabita razlage.
Always going the extra mile.
https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 14710
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 2183 krat
Prejel zahvalo: 6096 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255


Vrni se na C in sorodni jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost