Considere o exemplo apresentado no tópico anterior em que as funções realizavam o acionamento do LED vermelho. No CMSIS, o arquivo do dispositivo apresenta todas as definições necessárias para acessar os periféricos.
#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 apresenta funções para configuração de recursos do núcleo ARM. Por exemplo, do módulo temporizador Systick.
#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;
}