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"#defineLED_PIN18#defineRED_MASK (1<< (LED_PIN))voidredon(void){//ativar o bit 18 do registrador PCOR.//GPIOB->PCOR = (RED_MASK);//ou desativar somente o bit 18 do registrador PDORGPIOB->PDOR =GPIOB->PDOR &~(RED_MASK);}voidredoff(void){//ativar o bit 18 do registrador PSOR.//GPIOB->PSOR = (RED_MASK);//ou ativar somente o bit 18 do registrador PDORGPIOB->PDOR =GPIOB->PDOR | (RED_MASK);}voidinit_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_PCR18PORTB->PCR[LED_PIN] =PORT_PCR_MUX(1);//ativar o bit 18 do registrador PDDRGPIOB->PDDR = (RED_MASK);}intmain(){//configurações iniciaisinit_gpio();while(1){//programa em loop infinitoredon();redoff(); }return0;}
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"#defineLED_PIN18#defineRED_MASK (1<< (LED_PIN))voidredon(void){//ativar o bit 18 do registrador PCOR.//GPIOB->PCOR = (RED_MASK);//ou desativar somente o bit 18 do registrador PDORGPIOB->PDOR =GPIOB->PDOR &~(RED_MASK);}voidredoff(void){//ativar o bit 18 do registrador PSOR.//GPIOB->PSOR = (RED_MASK);//ou ativar somente o bit 18 do registrador PDORGPIOB->PDOR =GPIOB->PDOR | (RED_MASK);}voidinit_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_PCR18PORTB->PCR[LED_PIN] =PORT_PCR_MUX(1);//ativar o bit 18 do registrador PDDRGPIOB->PDDR = (RED_MASK);}uint32_tvolatile msTicks; // Counter for millisecond IntervalvoidSysTick_Handler (void) { // SysTick Interrupt Handler msTicks++; // Increment Counter}voidWaitFor(uint32_t tick_n) {uint32_t curTicks; curTicks = msTicks; // Save Current SysTick Valuewhile ((msTicks - curTicks) < tick_n) { // Wait for next SysTick Interrupt__WFE (); // Power-Down until next Event/Interrupt }}intmain(){//configurações iniciaisinit_gpio();//atualiza variável SystemCoreClockSystemCoreClockUpdate();//tenta configurar Systick para 1 mSecif (SysTick_Config(SystemCoreClock /1000)) { // SysTick 1mSec// Handle Error }while(1){//programa em loop infinitoredon();WaitFor(100);redoff();WaitFor(100); }return0;}