Il senso di questi Hardware è l'ambiente di sviluppo: scrivi tre cazzate, e hai un software funzionante.
Tutte le piattaforme menzionate, TUTTE, hanno un'intefaccia Arduino Like, Linguaggio compreso. Salvo qualche piccola variante poco significativa, il C di questi oggetti è BaBBEo-level, ovvero il punto di forza cui facevamo riferimento prima.
Quindi il ChipKit è identico ad Arduino come programmazione, pur disponendo di circa 8-10 volte la potenza di calcolo, molta più Flash, molta più RAM, e di periferiche molto più performanti.
Nel momento che vuoi uscire dall'ambiente "domestico" dell'IDE, entri nelle nebbie, nel pantano della vera programmazione, non esiste una via di mezzo.
E poi con queste piattaforme particolarmente evolute (Freescale, STM, Microchip) si possono fare cose da turchi, pur senza conoscere gli aspetti complessi di questi oggetti. Non vedo il senso di andarsi ad impelagare in situazioni extra-IDE.
Per i PIC, non è poi così vero che sono difficili da programmare, anzi. ma alla fine nemmeno gli STM32. Bisogna solo mettersi dietro e studiare.
Ora faccio un esempio "tangibile"...
Con una Ambiente Arduinesco (qualsiasi) grosso modo un Hello world sarà così:
/*
int led = 13;
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
Per far lampeggiare un Led con un STM32 in maniera "grezza":
#include "stm32f10x.h"
void delay(uint32_t cnt) {
while (cnt) {
cnt--;
}
}
void clock_init(void) {
RCC->CR |= RCC_CR_HSEON;
while (!(RCC->CR & RCC_CR_HSERDY));
RCC->CFGR |= RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLXTPRE_HSE | RCC_CFGR_PLLSRC_HSE;
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY));
RCC->CFGR |= RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_PPRE2_DIV1;
FLASH->ACR |= FLASH_ACR_LATENCY_2;
RCC->CFGR |= RCC_CFGR_SW_PLL;
while (!(RCC->CFGR & RCC_CFGR_SWS_PLL ));
}
int main(void) {
clock_init();
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPEEN;
GPIOC->CRL = (0x03 << (7 * 4)) | (0x03 << (6 * 4));
GPIOE->CRL = (0x04 << (5 * 4)) | (0x04 << (4 * 4));
while (1) {
if((GPIOE->IDR & (1 << 4)) == 0) {
GPIOC->BSRR |= GPIO_BSRR_BR7 | GPIO_BSRR_BS6;
delay(0xFFFFF);
GPIOC->BSRR |= GPIO_BSRR_BR6 | GPIO_BSRR_BS7;
}
delay(0xFFFFF);
}
return 0;
}
I due programmi sono perfettamente equivalenti, fanno le stesse cose, ma nel caso del secondo listato, Immagino che qualcuno, alla fine della 3a riga, abbia già lanciato dalla finestra la scheda STM32...
Eppure, sapendo cosa sono quelle righe (volendo possiamo anche vedere il significato insieme), non è affatto difficile scrivere del codice. ma ovviamente lo sforzo e il tempo saranno diversi.