CMSIS : Common Microcontroller Software Interface Standard.
“Bare metal” : program yang bisa jalan tanpa OS di perangkat keras. Misal buat script “blink led” di Arduino. Jika buat program “blink led” di Raspberry Pi yang sudah Ada OS nya, maka ini tidak masuk kategori “bare metal”.
Tapi ada definisi “bare metal” lainnya. Jika di chip STM32 Anda mengabaikan HAL & LL atau firmware lainnya seperti libopencm3, dan SPL maka Anda melakukan pemrograman ala “bare metal”. Tanpa library apapun. Mulai dari nol! (Tapi tidak mungkin tanpa kopi wkwkwk).
Lha kalau pakai CMSIS termasuk mana? Ada yang menyebut masuk “bare metal” Ada yang menyebut masuk “chocolate bar” lol. Bercanda!

Jika rancang bangun dengan mikrokontroler STM32 ingin langsung berurusan dengan register, maka lebih baik pakai framework CMSIS.
Daripada memberi nama sendiri tiap register, pakai standard CMSIS saja agar mudah diterima di mana-mana. Apalagi Anda ingin terlihat sebagai pemain PRO!



Beberapa contoh terkait CMSIS :
Semisal ingin konfigurasi GPIOA pin PA3 sebagai output. Maka bagian MODER3[1:0] bernilai 0 1.

Tiga baris program di bawah ini sama semua fungsinya. Pilih satu saja. Intinya melakukan set bit ke-6 dari MODER.
GPIOA->MODER |= (1<<6);
GPIOA->MODER |= (1<<(3<<1));
GPIOA->MODER |= GPIO_MODER_MODER3_0;
Terus bagaimana dengan baris ke-3 GPIO_MODER_MODER3_0? Apakah sudah didefinisikan?
Jika melihat isi header file CMSIS, maka GPIO_MODER_MODER3_0 sama dengan (1<<6). Konfigurasi ini sudah didefinisikan di CMSIS. Mau dipakai atau tidak terserah.

Nama GPIOA, MODER, GPIO_MODER3_0 adalah penamaan standar di CMSIS. Silahkan cek di file CMSIS.
Contoh lain : Jika ingin PA3 sebagai input analog, maka nilai MODER3[1 0]>adalah 1 1.
GPIOA->MODER |= (3<<6);
Atau boleh juga seperti di bawah :
GPIOA->MODER |= (3<<(3<<1));
Jika diurutkan, (3<<1) bernilai 6. Maka (3<<(3<<1)) sama dengan (3<<6).
Atau seperti di bawah oke juga :
GPIOA->MODER |= GPIO_MODER_MODER3;
Pada file header CMSIS, GPIO_MODER_MODER3 kalau diruntut ya sama dengan set bit (3<<6). Jika kurang kerjaan, boleh juga seperti di bawah :
GPIOA->MODER |= GPIO_MODER_MODER3_1;
GPIOA->MODER |= GPIO_MODER_MODER3_0;
Boleh juga :
GPIOA->MODER |= GPIO_MODER_MODER3_1|GPIO_MODER_MODER3_0;
Intinya semua sama.. Nilai MODER3[1 0] adalah 1 1 agar PA3 berfungsi sebagai input analog.
Jika nama seperti GPIOA diganti PORTA, MODER diganti MODERAINA_CANTIK, jika tidak didefinisikan ulang sesuai CMSIS, maka aturan main dilanggar. Jika ingin, definisikan ulang sesuai CMSIS. #define PORTA GPIOA, #define MODERAINA_CANTIK MODER.
Baiklah, semoga ada gambaran mengenai CMSIS dan penamaan register.
Melihat data sheet, reference manual, dan CMSIS ibarat makan Mie pakai sumpit atau garpu. Seirama! (kalau pakai sendok agak susah). Nama register tiap peripheral akan sama satu sama lain.
Jika Anda menggunakan HAL dan masih kangen mainan register langsung, maka otak akan 2x kerja mencocokkan apa yang dilakukan oleh HAL terkait register. HAL punya penamaan sendiri untuk library. Dan fungsi HAL agar persoalan register semakin dilupakan. Beda filosofi.
Saat melakukan debug, penggunaan CMSIS juga “to the point” tidak muter kemana-mana.
Pertanyaan akhir… Apakah CMSIS termasuk “bare metal”? Silahkan jawab sendiri :).