MC3172 Geliştirme Kartı Programlama

MC3172 Giriş

MC3172, Çinli GXchip şirketi tarafından geliştirilen 32 bitlik bir RISC paralel çok iş parçacıklı gerçek zamanlı işlemcidir. Yeni bir CPU çalışma modu ve yazılım geliştirme modu kullanır. Tek iş parçacıklı programlama modundan farklı olarak, paralel çok iş parçacıklı sistemdeki çeşitli iş parçacıkları birbirlerini etkilemeden eşzamanlı olarak çalışır ve öncelik kavramı yoktur.

MC3172 Microcontroller

MC3172 Pin Dizilişi

MC3172 Pinout

MC3172 Özellikleri

Bu MC3172 mikrodenetleyici, GPIO, UART, SPI, USB, CAN ve diğer yaygın çevre birimleri gibi, kullandığımız yaygın mikrodenetleyicilerle pek çok ortak özelliğe sahiptir.

Ancak çok benzersiz bir özelliğe sahiptir: RISC-V RV32IMC komut setine dayalı paralel çok iş parçacıklı bir gerçek zamanlı işlemcidir.

Diğer bir deyişle, RTOS çoklu iş parçacığı özelliğine sahiptir, ancak normal RTOS yazılım zamanlamasının yerine, kesme hizmet rutinleri olmadan donanım düzeyinde gerçek zamanlı olarak yanıt verir.

  • RV32IMC komut seti kombinasyonunu, tek döngülü çarpma işlemini destekler
  • Kesme hizmeti olmadan paralel çalışan 64 iş parçacığı
  • İş parçacığı kaynakları isteğe göre yapılandırılabilir ve gerçek zamanlı işletim sistemi gerekmez
  • %100 tek döngü komutları, dallanma tahmini yok
  • USART, SPI arabirimi, USB2.0 ana bilgisayar/cihaz arabirimi, CAN2.0B desteği
  • Giriş yakalama/çıkış karşılaştırma/PWM/darbe sayımı için 4 kanala kadar
  • Sistem zamanlayıcı: 32 bit kendinden artan sayaç

MC3172 Teknik Özellikleri

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

MC3172 Geliştirme Kartı Programlama Kılavuzu

MC3172 mikrodenetleyicisini programlamadan önce, geliştirme aracı olan MounRiver Studio'yu ve MC3172 Proje Paketini yüklememiz gerekiyor.

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

MounRiver Studio'yu indirin ve kurun

MC3172'nin geliştirme yazılımı MounRiver Studio'dur; indirme adresi:

http://www.mounriver.com/download

MounRiver_Studio Download URL
MounRiver_Studio Download URL

MounRiver Studio'yu yükledikten sonra açılış ekranı şu şekildedir:

MounRiver-Studio-Install
MounRiver-Studio-Install

"Projeyi/Çözümü Yükle" seçeneğine tıklayın ve MC3172 projemizi seçin. Bu proje dosyası, az önce indirdiğimiz MC3172 veri koleksiyonundaki MC3172_Template_v1.21 klasörünün içindedir.

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

Resmi web sitesinde sunulan tüm demo programları “GPIO_GPCOM_TIMER_Example.c” dosyasında yer almaktadır. Biz de uyarlama çalışmamızda bu dosyaya başvuracağız.

Konfigürasyon aracını açın

Az önce indirilen MC3172 veri toplama dosyasında, chip configuration software thread configuration tool_V1.exe adlı bir dosya da bulunmaktadır. Bu dosya, MC3172 data collection_V1.03 \ MC3172_Template \ MC3172 dizininde yer almaktadır.

Bu yazılımın ilgili kodu açık kaynaklıdır, açık kaynak adresi: https://gitee.com/gxchip.

Configuration code genration tool
Configuration code genration tool

Programı açın, yazılımı indirin

Resmi web sitesinden indirilen MC3172_V1.03 dosyasında, MC3172_V1.03\MC3172_Template\Release dizininde bir yonga programı indirme yazılımı bulunmaktadır.

MC3172 program download software
MC3172 program download software

MC3172 Programlama - LED'in Yanıp Sönmesi

Yukarıdaki adımlarla MC3172 geliştirme ortamını hazırladık ve şimdi en temel LED aydınlatma programını tasarlayacağız.

MCU kaynaklarını yapılandırma

Thread Configuration Tool_V1.exe yazılımını açın ve parametreleri aşağıdaki gibi ayarlayın:

Setting Thread Configuration Tool
Setting Thread Configuration Tool

"Kod Oluştur" düğmesine tıklayın; SRAM tahsisini ayarladığınızda MC3172.lds proje dosyası otomatik olarak güncellenecek, iş parçacığı tahsisini ayarladığınızda ise thread_config.h dosyası otomatik olarak güncellenecektir. Not: Saat kaynağı seçimi dikkate alınmalıdır; sistem saat kaynağı dahili RC 200 MHz varsayılan olarak açıktır; saat yapılandırması veya sıfırlama yapılmadığında, dahili 200 MHz RC osilatörü varsayılan CPU saati olarak kullanılır; ardından, sürücü olarak harici 4~40 MHz kristal (değerlendirme kartında 48 MHz pasif kristal takılıdır) seçebilirsiniz. 8 MHz RC osilatörü veya harici doğrudan giriş saatini çekirdek saati olarak seçebilirsiniz. Bu, buradaki ayarın daha sonra doğrudan çekirdek saati olarak kullanılacağı anlamına gelir.

Programın yazılması

Projeyi IDE aracıyla (MounRiver Studio) açtığımızda, öncelikle GPIO_GPCOM_TIMER_Example.c dosyasındaki program koduna bakabiliriz:

				
					//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().
        }
    }
}

				
			

Yukarıdakileri dikkate alarak, main.c dosyasındaki void thread0_main(void) işlevine aşağıdaki gibi bir program yazın:

				
					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().
}

				
			

Programı MC3172'ye indirin

Öncelikle geliştirme kartını bilgisayara bağlayın, ardından geliştirme kartı program yükleme yazılımını açın. Bu aşamada bir aygıt algılanacaktır; "Aygıtı Bağla" seçeneğine tıklayın, MC3172.hex bellenimini seçin ve "Bellenimi Yaz" seçeneğine tıklayın. İlerleme çubuğu %100'e ulaştığında yükleme işlemi tamamlanmış olur.

Burning the program to MC3172 microcontroller

Programı Doğrula

LED'in yanıp sönme programlamasını doğrulamak için şu adımları uygulayabiliriz:

  1. Kodu kontrol edin: Programlama kodunun doğru olduğundan ve programlama diliniz için doğru sözdizimine sahip olduğundan emin olun.
  2. LED'i bağlayın: LED'i programlama kodunuzda tanımladığınız pime bağlayın.
  3. LED'i gözlemleyin: Her şey doğruysa, LED programlama koduna göre yanıp sönmeye başlamalıdır.
  4. Hata ayıklama: LED beklendiği gibi yanıp sönmüyorsa, kodunuzu tekrar kontrol edin ve her şeyin doğru şekilde bağlandığından emin olun.

MC3172 Çok İş Parçacıklı Paralel Yürütme Testi

Aynı yapılandırmaya ait iki iş parçacığı yazıyoruz; değiştirilecek iki giriş/çıkış (IO) için her birine birer iş parçacığı. Test kodu şunun gibi:

				
					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().
}

				
			

Programı yazın ve bir mantık analizörü kullanarak GPIOA_PIN0 ve GPIOA_PIN1 pin seviyelerindeki değişiklikleri aşağıdaki şekilde kaydedin:

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

Şekilde görüldüğü gibi, iki dalga formu tamamen senkronize durumdadır ve CPU aynı anda iki işlevi yerine getirerek RTOS çoklu iş parçacığı ile aynı etkiyi sağlamaktadır.

MC3172 Programlama ve RTOS Programlama

Yukarıda belirtildiği gibi, MC3172 mikrodenetleyicinin en önemli özelliği, paralel çok iş parçacıklı gerçek zamanlı işlemcisidir. Bu özellik, RTOS geliştirme sürecinde ortaya çıkan, altta yatan zahmetli taşıma süreci, zaman alıcı zamanlama gibi sorunları ortadan kaldırır. Altta yatan donanım düzeyindeki gerçek zamanlı tepki sayesinde, gerçek anlamda "gerçek zamanlı çalışma" sağlayabilir.

İşte MC3172 mikrodenetleyicinin paralel çok iş parçacıklı programlamasına ilişkin bir kod örneği:

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

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

void thread2_main(void)

void thread3_main(void)

------
				
			

Hepimiz biliyoruz ki, zamanlama iş parçacıklarının temelini oluşturan RTOS, birkaç mikrosaniye (farklı işlemci zamanı tüketimi) sürer; ancak MC3172 işlemcisinin zaman tüketimi neredeyse 0'a yakındır. Bu, MC3172 iş parçacıklarının, geçiş yükü veya dalgalanma olmaksızın kendi sabit frekanslarında paralel olarak çalıştığı anlamına gelir.

Ayrıca, MC3172 işlemcisinin çevresel yanıt verileri daha gerçek zamanlıdır. Örneğin: Harici verileri almak için UART seri bağlantı noktası, birden fazla iş parçacığı seri verileri paralel olarak alabilir ve yanıt verebilir. (Sıradan mikrodenetleyiciler genellikle kesme önceliğine sahiptir, düşük öncelikli seri verilere yanıt vermek için "duraklatılır", bu da durumu engeller, ancak verilerin kaybolmasına da neden olur)

Sonuç

MC3172 mikrodenetleyici, Çin'de gördüğüm çok özel bir işlemcidir. RTOS ile ilgili bazı sorunları çözmekte ve yonga programlamasının verimliliğini artırmaktadır.

Dolayısıyla, RTOS geliştirme kullanıyorsanız ve iş parçacıkları arasındaki zamanlama gecikmeleri gibi sorunlarla karşılaşıyorsanız, MC3172 mikrodenetleyiciyi deneyebilirsiniz.

Paylaş:

Scroll to Top

Anında Fiyat Teklifi

Instant Quote