# Utilizando o CMSIS nas aplicações

Considere o exemplo apresentado no tópico anterior em que as funções realizavam o acionamento do LED vermelho. No [CMSIS](http://www.keil.com/pack/doc/CMSIS/Core/html/using_CMSIS.html), o arquivo do dispositivo apresenta todas as definições necessárias para acessar os periféricos.

```c
#include <stdint.h>
#include "MKL25Z4.h"

#define LED_PIN 18
#define RED_MASK (1 << (LED_PIN))


void redon(void){
	//ativar o bit 18 do registrador PCOR.
	//GPIOB->PCOR = (RED_MASK);
	
	//ou desativar somente o bit 18 do registrador PDOR
	GPIOB->PDOR = GPIOB->PDOR & ~(RED_MASK);
}

void redoff(void){
	//ativar o bit 18 do registrador PSOR.
	//GPIOB->PSOR = (RED_MASK);
	
	//ou ativar somente o bit 18 do registrador PDOR
	GPIOB->PDOR = GPIOB->PDOR | (RED_MASK);
}

void init_gpio(void){
	//ativar somente o bit 10 do registrador SCGC5.
	SIM->SCGC5 = SIM->SCGC5 | (SIM_SCGC5_PORTB_MASK);
	
	//ativar o bit 8 do registrador PORTB_PCR18
	PORTB->PCR[LED_PIN] = PORT_PCR_MUX(1);
	
	//ativar o bit 18 do registrador PDDR
	GPIOB->PDDR = (RED_MASK);
}


int main()
{
	//configurações iniciais
	init_gpio();
	
	while(1){
		//programa em loop infinito
		redon();
		redoff();
	}
	
	return 0;
}
```

Além das definições de periféricos do fabricante, o [CMSIS](http://www.keil.com/pack/doc/CMSIS/Core/html/using_CMSIS.html) apresenta funções para configuração de recursos do núcleo ARM. Por exemplo, do módulo temporizador _**Systick**_.

```c
#include <stdint.h>
#include "MKL25Z4.h"

#define LED_PIN 18
#define RED_MASK (1 << (LED_PIN))


void redon(void){
	//ativar o bit 18 do registrador PCOR.
	//GPIOB->PCOR = (RED_MASK);
	
	//ou desativar somente o bit 18 do registrador PDOR
	GPIOB->PDOR = GPIOB->PDOR & ~(RED_MASK);
}

void redoff(void){
	//ativar o bit 18 do registrador PSOR.
	//GPIOB->PSOR = (RED_MASK);
	
	//ou ativar somente o bit 18 do registrador PDOR
	GPIOB->PDOR = GPIOB->PDOR | (RED_MASK);
}

void init_gpio(void){
	//ativar somente o bit 10 do registrador SCGC5.
	SIM->SCGC5 = SIM->SCGC5 | (SIM_SCGC5_PORTB_MASK);
	
	//ativar o bit 8 do registrador PORTB_PCR18
	PORTB->PCR[LED_PIN] = PORT_PCR_MUX(1);
	
	//ativar o bit 18 do registrador PDDR
	GPIOB->PDDR = (RED_MASK);
}



uint32_t volatile msTicks;                       // Counter for millisecond Interval
 
void SysTick_Handler (void) {                    // SysTick Interrupt Handler
  msTicks++;                                     // Increment Counter
}
 
void WaitFor(uint32_t tick_n)  {
  uint32_t curTicks;
 
  curTicks = msTicks;                            // Save Current SysTick Value
  while ((msTicks - curTicks) < tick_n)  {       // Wait for next SysTick Interrupt
    __WFE ();                                    // Power-Down until next Event/Interrupt
  }
}


int main()
{
	//configurações iniciais
	init_gpio();
	
	//atualiza variável SystemCoreClock
	SystemCoreClockUpdate();
	
	//tenta configurar Systick para 1 mSec
	if (SysTick_Config(SystemCoreClock / 1000)) { // SysTick 1mSec
       // Handle Error 
  }
	
	while(1){
		//programa em loop infinito
		redon();
		WaitFor(100);
		redoff();
		WaitFor(100);
	}
	
	return 0;
}
```
