STM32MP1 - kernel + Linux = mikrokontroler sempurna

Berdasarkan sifat aktivitas saya, saya terlibat dalam pengembangan berbagai perangkat: mengukur, mengendalikan, mengendalikan, dll. Sebagian besar perangkat dibagi menjadi 2 bagian:

  1. Mikrokontroler sumber daya tinggi dan tidak memerlukan antarmuka pengguna grafis waktu nyata (GUI) yang sulit.
  2. Mengkonsumsi beberapa sumber daya dan bekerja dalam perangkat keras real-time yang keras pada perangkat.

Dan sebagai aturan, transisi ke seri mikrokontroler baru ditentukan oleh peningkatan GUI: lebih banyak warna, resolusi lebih tinggi, elemen desain yang lebih kompleks. Pada suatu waktu, idenya adalah menggunakan semacam papan Raspberry sebagai antarmuka grafis.

Tetapi dengan munculnya jalur baru STM dari mikrokontroler STM32MP1, siksaan saya berakhir dan itulah yang terjadi sejauh ini.

Kontroler sempurna


Kontroler yang ideal bagi saya harus memiliki karakteristik sebagai berikut:

  • memiliki kemampuan grafis yang layak, seperti dukungan sederhana untuk berbagai format grafik, dukungan untuk font vektor
  • memori dalam jumlah besar untuk grafis
  • Dukungan keyboard dan mouse USB
  • Dukungan ethernet
  • sejumlah besar pengatur waktu perangkat keras
  • Generasi PWM
  • sejumlah besar GPIO
  • 16 bit ADC

Persyaratan inilah yang diperlukan untuk membangun berbagai perangkat dengan antarmuka pengguna grafis yang layak.

Jadi saya sangat senang melihat seri baru dari STM: STM32MP1.

Pertemuan pertama


Untuk membiasakan dengan chip baru, papan STM32MP157C-DK2 dibeli. Ini salah satunya (foto dari Internet):



Papan demo dibuat menggunakan chip STM32MP157CAC, yang meliputi:

  • 2 core A7, masing-masing 650 MHz
  • 1 inti M4, 208 MHz

Penyimpanan


Perbedaan pertama yang menarik perhatian Anda adalah kurangnya memori flash pada chip. Untuk inti A7, yang pada dasarnya adalah mikroprosesor, ini adalah situasi normal dan kode selalu dijalankan dari DRAM. Mikrokontroler berbasis M4 biasanya menyertakan memori flash di mana kode yang dapat dieksekusi disimpan.

Dalam kristal ini, kernel M4 hanya memiliki RAM dan kode dijalankan darinya (dari datasheet):

708 Kbytes SRAM internal: 256 Kbytes
AXI SYSRAM + 384 Kbytes AHB SRAM +
64 Kbytes AHB SRAM dalam domain Cadangan
dan 4 Kbytes SRAM dalam domain Cadangan

Inti A7 memiliki pengontrol DDR internal (dari lembar data):
Perangkat STM32MP157C / F menanamkan pengontrol untuk SDRAM eksternal yang mendukung
perangkat berikut:

  • Data LPDDR2 atau LPDDR3, 16- atau 32-bit, hingga 1 Gbyte, hingga 533 MHz clock.
  • DDR3 atau DDR3L, data 16- atau 32-bit, hingga 1 Gbyte, hingga 533 MHz clock.

Di satu sisi, memori kernel M4 tampaknya kurang dari versi di memori flash, tetapi di sisi lain, memori RAM berjalan pada frekuensi inti. Memori flash tidak dapat melakukan ini, dan di sana Anda harus menggunakan pembagi frekuensi.

Organisasi tempat kerja


Karena Linux diperlukan untuk bekerja dengan board, saya harus menginstal hard drive tambahan di komputer saya dan menggunakan Ubuntu 16,04 di atasnya. OS ini direkomendasikan oleh STM.

Mode Rekayasa & Produksi


Papan dapat mulai dalam salah satu dari dua mode (ditentukan oleh saklar dip). Dalam mode Teknik, inti M4 bekerja secara terpisah. Dalam mode Produksi, inti M4 berjalan di bawah kendali inti A7. Saya tidak menggunakan mode Teknik, saya hanya bekerja dalam mode Produksi. Dalam mode ini, Anda tidak perlu khawatir tentang menyetel jam inti. Pengaturan waktu dikonfigurasikan selama proses boot pada nilai maksimum. Saya memeriksa beberapa register di debugger, menyimpulkan beberapa frekuensi pada MCO dan melihat osiloskop. A7 beroperasi pada frekuensi 650 MHz, M4 pada frekuensi 208 MHz.

Kernel M4. Unduh dan jalankan program


Karena inti M4 menjalankan A7, itu berarti menjalankan OpenSTLinux. Linux remoteproc framework (RPROC) digunakan untuk mengendalikan inti M4. Kerangka kerja ini memungkinkan Anda untuk mengaktifkan dan menonaktifkan perangkat lunak kernel, unduh dan debug (file ELF).

Untuk memuat program ke dalam kernel M4, gunakan perintah berikut:

echo -n <firmware_name.elf >> / sys / class / remoteproc / remoteproc0 / firmware

Untuk memulai program:

mulai gema> / sys / class / remoteproc / remoteproc0 / state

Untuk berhenti:

gema berhenti> / sys / class / remoteproc / remoteprocX / state

Kernel M4. SW4STM32


Perintah yang disebutkan di atas telah dicoba, semuanya berfungsi :) Tetapi untuk bekerja, Anda memerlukan semacam IDE normal. STM merekomendasikan penggunaan perangkat lunak AC6 SW4STM32 untuk ini. Pada saat yang sama, situs web OpenSTM32 memiliki judul yang sangat keren:
Dengan System Workbench untuk Linux, Embedded Linux pada keluarga STM32MP1 MPU dari ST tidak pernah semudah ini untuk membangun dan memelihara, bahkan untuk pendatang baru di dunia Linux.
Dan, jika Anda menginstal System Workbench untuk Linux di System Workbench untuk STM32, Anda dapat mengembangkan dan men-debug aplikasi asimetris yang berjalan sebagian di Linux, sebagian di Cortex-M4.
Artinya, Anda dapat menulis kode untuk inti m4 dan A7. Tetapi ini adalah versi berbayar. Dan yang gratis, yang tersedia untuk diunduh, memungkinkan Anda untuk menulis dan men-debug kode hanya untuk inti M4.

IDE SW4STM32 telah diunduh, diinstal dan dicoba. Semuanya berfungsi, proses penulisan dan kompilasi tidak berbeda dengan versi di Windows.
Satu-satunya perbedaan adalah pemuatan kode dan debugging, karena koneksi Ethenet dan SSH digunakan untuk menulis perangkat lunak. Untuk debugging dan berhenti berdasarkan poin, papan ST LINK bawaan digunakan.

Kernel A7. Kompiler silang


Untuk mengkompilasi program pada PC, STM menawarkan cross-compiler. Proses memuat dan menjalankan skrip lintas-kompiler dijelaskan secara rinci dalam wiki STM32MP1, tautan di bawah ini. Semuanya dilakukan sesuai dengan instruksi, semuanya berfungsi sebagaimana mestinya. :)

Menjalankan cross-compiler untuk ekosistem v1.1.0:

sumber SDK / environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_weston-linux-gnueabi dengan
baik, maka
perintah make
dan kode sumber, menurut makefile, akan dikompilasi menjadi kode ARM :)

Kernel A7. Unduh dan jalankan program


Untuk memuat program ke dalam papan demo, gunakan perintah:

scp gtk_hello_world root@192.168.1.18: / usr / local

Perintah ini mengunduh file gtk_hello_world ke bagian / usr / lokal, yang terletak di papan dengan alamat IP: 192.168.1.18. Root - kata sandi yang ada di papan tulis secara default.

Pertukaran data antar-inti


Sebagian besar waktu dihabiskan untuk memahami mekanisme pertukaran data antara inti. Dalam contoh yang disediakan oleh STM, ada beberapa opsi untuk menerapkan pertukaran semacam itu. Anda dapat bekerja secara langsung dengan driver dari OpenSTLinux atau menggunakan mekanisme UART virtual. Saya memutuskan untuk menjadikan berbagi melalui port virtual sebagai lebih sederhana.

Di sisi Linux, tampilannya seperti ini:

Buka perangkat:

fd = open ("/ dev / ttyRPMSG0", O_RDWR);

Kemudian kami menulis atau membaca:

write (fd, "LED_Toggle \ r \ 0", 10);
len = baca (fd, buf, sizeof (buf));

Semuanya cukup sederhana, tetapi ada sedikit nuansa. Agar perangkat ttyRPMSG0 muncul, Anda memerlukan inti M4 untuk mengakses inti A7 dalam formulir ini:

ini adalah baris kode untuk inti M4:

VIRT_UART_Init(&huart0); //  
VIRT_UART_RegisterCallback(&huart0, VIRT_UART_RXCPLT_CB_ID, VIRT_UART0_RxCpltCallback) //      .

Penerimaan data dari port virtual oleh inti M4:

if (VirtUart0RxMsg)
{
      //     VirtUart0ChannelBuffRx
     
      VirtUart0RxMsg = 0;
}

Menulis data ke port virtual:

VIRT_UART_Transmit(&huart0, TxArray, TXCounter);

Semuanya berfungsi, tetapi ada sedikit nuansa yang belum bisa saya pahami. Penerimaan data oleh inti A7, yang ditransmisikan oleh inti M4, tidak dimulai kecuali inti A7 sebelumnya menulis data apa pun ke port.

Seluruh mekanisme ini diimplementasikan oleh satu set pustaka OpenAMP pihak ketiga. Pustaka ini harus dimasukkan dalam proyek kernel M4 dan diinisialisasi sesuai dengan itu.

Rencana masa depan


Instal dan konfigurasikan Eclipse untuk menulis dan men-debug kode untuk A7.
Tulis demo grafis normal, seperti osiloskop dari M4 ADC.
Dan akhirnya, buat papan pengontrol Anda berdasarkan chip ini. :) Wiki

Tautan Berguna

STM32MP1
OpenSTM32
ST Community
AC6

All Articles