Pemrograman Papan Pengembangan MC3172

MC3172 Pengantar

MC3172 adalah prosesor real-time paralel multithreaded 32-bit berbasis RISC yang dikembangkan oleh GXchip di Tiongkok. Prosesor ini menggunakan mode kerja CPU dan mode pengembangan perangkat lunak yang baru. Berbeda dengan mode pemrograman single-threaded, berbagai thread dalam sistem multithreading paralel berjalan secara sinkron tanpa saling mengganggu, dan tidak ada konsep prioritas.

MC3172 Microcontroller

Konfigurasi Pin MC3172

MC3172 Pinout

Fitur MC3172

Mikrokontroler MC3172 ini memiliki banyak kesamaan dengan mikrokontroler umum yang kita gunakan, seperti GPIO, UART, SPI, USB, CAN, dan periferal umum lainnya.

Namun, ia memiliki fitur yang sangat unik: ia merupakan prosesor real-time multi-threaded paralel yang didasarkan pada set instruksi RISC-V RV32IMC.

Dengan kata lain, mikrokontroler ini memiliki kemampuan multi-threading RTOS, tetapi alih-alih penjadwalan perangkat lunak RTOS biasa, mikrokontroler ini merespons secara real-time pada tingkat perangkat keras tanpa rutin layanan interupsi.

  • Mendukung kombinasi set instruksi RV32IMC, perkalian siklus tunggal
  • 64 thread berjalan secara paralel tanpa layanan interupsi
  • Sumber daya thread dapat dikonfigurasi sesuai permintaan dan tidak memerlukan sistem operasi real-time
  • 100% instruksi siklus tunggal, tanpa prediksi percabangan
  • Mendukung antarmuka USART, SPI, antarmuka host/perangkat USB 2.0, dan CAN 2.0B
  • Hingga 4 saluran untuk penangkapan masukan/perbandingan keluaran/PWM/penghitungan pulsa
  • Timer waktu sistem: penghitung 32-bit yang bertambah sendiri

Spesifikasi MC3172

AttributesValue
Frequencyup to 200MHz
SRAM128KB
Core voltage1.62V to 1.98V
GPIO voltage1.8V ~ 3.3V
RC oscillator8MHz, 200MHz
External oscillator4MHz~40MHz
Input clock133MHz max.
Counters8
I/O portsup to 64
Communication interface12
PackageLQFP100

Panduan Pemrograman Papan Pengembangan MC3172

Sebelum memprogram mikrokontroler MC3172, kita perlu mengunduh perangkat lunak pengembangan – MounRiver Studio, serta Paket Proyek MC3172.

http://www.gxchip.cn/down/show-70.html

Unduh dan Instal MounRiver Studio

Perangkat lunak pengembangan untuk MC3172 adalah MounRiver Studio, alamat unduhannya:

http://www.mounriver.com/download

MounRiver_Studio Download URL
MounRiver_Studio Download URL

Setelah menginstal MounRiver Studio, layar awal akan terlihat seperti berikut:

MounRiver-Studio-Install
MounRiver-Studio-Install

Klik "Load Project/Solution", lalu pilih proyek MC3172 kita. Berkas proyek ini terdapat di dalam folder MC3172_Template_v1.21 pada kumpulan data MC3172 yang baru saja kita unduh.

Open the MC3172 Project on MounRiver Studio
Open the MC3172 Project on MounRiver Studio

Semua program contoh yang disediakan oleh situs web resmi terdapat dalam berkas “GPIO_GPCOM_TIMER_Example.c”. Kami juga akan merujuk pada bagian ini untuk proses porting kami.

Buka alat konfigurasi utas

Dalam berkas pengumpulan data MC3172 yang baru saja diunduh, terdapat pula alat konfigurasi perangkat lunak chip bernama configuration_tool_V1.exe. Alat ini terletak di direktori MC3172 data collection_V1.03 \ MC3172_Template \ MC3172.

Kode sumber untuk perangkat lunak ini telah dirilis sebagai open source, alamat open source: https://gitee.com/gxchip.

Configuration code genration tool
Configuration code genration tool

Buka program pengunduh perangkat lunak

Terdapat perangkat lunak pengunduh program chip dalam berkas MC3172_V1.03 yang diunduh dari situs web resmi, yang terletak di direktori MC3172_V1.03\MC3172_Template\Release.

MC3172 program download software
MC3172 program download software

Pemrograman MC3172 - LED Berkedip

Dengan langkah-langkah di atas, kita telah menyiapkan lingkungan pengembangan MC3172, dan kita akan merancang program pencahayaan LED yang paling dasar.

Mengonfigurasi sumber daya MCU

Buka perangkat lunak Thread Configuration Tool_V1.exe dan atur parameternya sebagai berikut:

Setting Thread Configuration Tool
Setting Thread Configuration Tool

Klik "Generate Code"; saat Anda mengatur alokasi SRAM, berkas proyek MC3172.lds akan diperbarui secara otomatis; saat Anda mengatur alokasi thread, berkas thread_config.h akan diperbarui secara otomatis. Catatan: Perlu diperhatikan pemilihan sumber clock; sumber clock sistem internal RC 200 MHz diaktifkan secara default. Jika tidak ada konfigurasi clock atau reset, osilator RC internal 200 MHz akan digunakan sebagai clock CPU default. Anda juga dapat memilih kristal eksternal 4–40 MHz (papan evaluasi dilengkapi dengan kristal pasif 48 MHz) untuk digunakan, osilator RC 8 MHz, atau jam masukan langsung eksternal sebagai jam kernel. Ini berarti pengaturan di sini akan digunakan langsung sebagai jam kernel nantinya.

Menulis program

Setelah membuka proyek menggunakan alat IDE (MounRiver Studio), kita dapat terlebih dahulu melihat kode program dalam berkas GPIO_GPCOM_TIMER_Example.c:

				
					//when main.c
GPIO_EXAMPLE(GPIOA_BASE_ADDR).

//GPIO_GPCOM_TIMER_Example.c
void GPIO_EXAMPLE(u32 gpio_sel)
{
    //enables the GPIOA clock (run|thread group|peripheral clock division setting)
    INTDEV_SET_CLK_RST(gpio_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2)).
    //PA0-PA7 configured as output
    GPIO_SET_OUTPUT_EN_VALUE(gpio_sel,(GPIO_PIN_7_0),GPIO_SET_ENABLE).
    //PA8-PA15 configured as input
    GPIO_SET_INPUT_EN_VALUE(gpio_sel,(GPIO_PIN_15_8),GPIO_SET_ENABLE).
    //set output high
    GPIO_SET_OUTPUT_PIN_TO_1(gpio_sel,(GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3)).
    //set output low
    GPIO_SET_OUTPUT_PIN_TO_0(gpio_sel,(GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7)).
    while(1){
        //Invert the pin level
        GPIO_SET_OUTPUT_PIN_INV(gpio_sel,(GPIO_PIN0|GPIO_PIN2)).
        u16 rx_data.
        //Get the full level of GPIOA
        rx_data=GPIO_GET_INPUT_VALUE_SAFE(gpio_sel).
        //set the value of gpio
        GPIO_SET_OUTPUT_PIN_VALUE(gpio_sel,(GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7),(rx_data>>4)).

        for (u32 var = 0; var < 5000; ++var) {
            NOP().
        }
    }
}

				
			

Berdasarkan penjelasan di atas, buatlah program dalam fungsi `void thread0_main(void)` di berkas `main.c` sebagai berikut:

				
					void thread0_main(void)
{
    // Enables the clock of GPIOA
    INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2)).
    // Set PA0 to output mode
    GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,(GPIO_PIN0),GPIO_SET_ENABLE).
    // Configure the default output to be high
    GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN0).
    while(1) {
        //Invert the pins
        GPIO_SET_OUTPUT_PIN_INV(GPIOA_BASE_ADDR,GPIO_PIN0).
        //Delay
        for (u32 var = 0; var < 5000; ++var) {
            NOP().
        }
    }
    thread_end().
}

				
			

Unduh program tersebut ke MC3172

Pertama-tama, sambungkan papan pengembangan ke komputer, lalu buka perangkat lunak pengunduh program papan pengembangan. Kali ini perangkat akan terdeteksi; klik "Connect Device", pilih firmware MC3172.hex, lalu klik "Burn Firmware". Ketika bilah kemajuan mencapai 100%, proses pengunduhan selesai.

Burning the program to MC3172 microcontroller

Periksa Programnya

Untuk memverifikasi pemrograman kedipan LED, kita dapat mengikuti langkah-langkah berikut:

  1. Periksa kode: Pastikan kode pemrograman sudah benar, dan sintaksnya sesuai dengan bahasa pemrograman yang Anda gunakan.
  2. Hubungkan LED: Hubungkan LED ke pin yang telah Anda tentukan dalam kode pemrograman Anda.
  3. Perhatikan LED: Jika semuanya benar, LED seharusnya mulai berkedip sesuai dengan kode pemrograman.
  4. Debug: Jika LED tidak berkedip seperti yang diharapkan, periksa kode Anda lagi, dan pastikan semuanya terhubung dengan benar.

Uji Eksekusi Paralel Multithread MC3172

Kami menulis dua utas, masing-masing untuk konfigurasi yang sama, dua utas untuk masing-masing dari dua IO yang akan dibalik, kode pengujian seperti:

				
					voidLED0_GPIOA_PIN0_TEST(void)
{
//Start GPIOA and set privilege group and clock frequency
INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2)).

//Enable the GPIOAPIN0 pin
GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN0,GPIO_SET_ENABLE).

while(1)
{
//GPIOAPIN0 output 1
GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN0).

//Delay
for(u32var=0;var< 5000;++var)
{
NOP().
}

//GPIOAPIN0 output 0
GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN0).

//Delay
for(u32var=0;var< 5000;++var)
{
NOP().
}
}
}

voidLED1_GPIOA_PIN1_TEST(void)
{
//Start GPIOA and set privilege group and clock frequency
INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2)).

//Enable the GPIOAPIN1 pin
GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN1,GPIO_SET_ENABLE).

while(1)
{
//GPIOAPIN1 output 1
GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN1).

//delay
for(u32var=0;var< 5000;++var)
{
NOP().
}

//GPIOAPIN1 output 0
GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN1).

//Delay
for(u32var=0;var< 5000;++var)
{
NOP().
}
}
}

////////////////////////////////////////////////////////////


voidthread_end(void)
{
while(1).
}

////////////////////////////////////////////////////////////

voidthread0_main(void)
{
while(1){
//usercodesection
}
thread_end().
}

////////////////////////////////////////////////////////////

voidthread1_main(void)
{
while(1){
//usercodesection
LED0_GPIOA_PIN0_TEST().
}
thread_end().
}

////////////////////////////////////////////////////////////

voidthread2_main(void)
{
while(1){
//usercodesection
LED1_GPIOA_PIN1_TEST().
}
thread_end().
}

				
			

Tulis program tersebut ke dalam mikrokontroler dan gunakan alat analisis logika untuk merekam perubahan level sinyal pada pin GPIOA_PIN0 dan GPIOA_PIN1 sebagai berikut:

Analyzing the pin level changes of MC3172 microcontroller using a logic analyzer
Analyzing the pin level changes of MC3172 microcontroller using a logic analyzer

Seperti yang terlihat pada gambar, kedua bentuk gelombang tersebut sepenuhnya tersinkronisasi dan CPU sedang melakukan dua hal secara bersamaan, sehingga menghasilkan efek yang sama seperti multithreading pada RTOS.

Pemrograman MC3172 vs Pemrograman RTOS

Seperti yang telah disebutkan di atas, fitur unik mikrokontroler MC3172 adalah prosesor real-time multi-threaded paralel. Fitur ini mengatasi berbagai masalah yang muncul selama pengembangan RTOS, seperti proses porting yang rumit dan penjadwalan yang memakan waktu. Melalui respons real-time pada tingkat perangkat keras, mikrokontroler ini mampu mewujudkan "operasi real-time" yang sesungguhnya.

Berikut adalah contoh kode pemrograman multi-threaded paralel mikrokontroler MC3172:

				
					void thread0_main(void)
{
    while(1)
    {
      /// Application code
    }
}

void thread1_main(void)
{
    while(1)
    {
      /// Application code
    }
}

void thread2_main(void)

void thread3_main(void)

------
				
			

Kita semua tahu bahwa penjadwalan thread pada RTOS biasanya membutuhkan waktu yang bervariasi (konsumsi waktu prosesor yang berbeda-beda), tetapi prosesor MC3172 hampir tidak memerlukan waktu sama sekali. Ini berarti thread pada MC3172 berjalan secara paralel pada frekuensi stabil masing-masing, tanpa beban peralihan atau jitter.

Selain itu, data respons periferal prosesor MC3172 lebih real-time. Contohnya: port serial UART untuk menerima data eksternal, beberapa thread dapat menerima dan merespons data serial secara paralel. (Mikrokontroler biasa umumnya menggunakan prioritas interupsi, akan "berhenti sejenak" untuk merespons data serial prioritas rendah, yang menyebabkan pemblokiran, namun juga kehilangan data)

Kesimpulan

Mikrokontroler MC3172 adalah prosesor yang sangat unik yang pernah saya temui di Tiongkok. Mikrokontroler ini mengatasi beberapa masalah yang ada pada RTOS, serta meningkatkan efisiensi pemrograman chip.

Jadi, jika Anda sedang mengembangkan sistem dengan RTOS dan menghadapi masalah seperti keterlambatan penjadwalan antar-thread, Anda dapat mencoba mikrokontroler MC3172.

Bagikan ke:

Scroll to Top

Instant Quote