MC3172 Entwicklungsboard-Programmierung

Inhaltsverzeichnis

MC3172_Development_Board

MC3172 Einführung

MC3172 ist ein 32-Bit-RISC-Parallel-Multithread-Echtzeitprozessor, der von GXchip in China entwickelt wurde. Er verwendet einen neuen CPU-Arbeitsmodus und Softwareentwicklungsmodus. Im Gegensatz zum Single-Thread-Programmiermodus laufen die verschiedenen Threads des Parallel-Multithreading synchron, ohne sich gegenseitig zu beeinträchtigen, und es gibt kein Prioritätskonzept.

MC3172 Microcontroller

MC3172 Pinbelegung

MC3172 Pinout

MC3172 Funktionen

Dieser Mikrocontroller MC3172 hat viele Gemeinsamkeiten mit den gängigen Mikrocontrollern, die wir verwenden, wie GPIO, UART, SPI, USB, CAN und anderen gängigen Peripheriegeräten.

Er verfügt jedoch über eine ganz besondere Eigenschaft: Es handelt sich um einen parallelen Multithread-Echtzeitprozessor, der auf dem RISC-V RV32IMC-Befehlssatz basiert.

Mit anderen Worten: Er verfügt über RTOS-Multithreading-Fähigkeiten, reagiert jedoch anstelle der regulären RTOS-Softwareplanung in Echtzeit auf Hardwareebene ohne Interrupt-Service-Routinen.

  • Unterstützt RV32IMC-Befehlssatzkombination, Single-Cycle-Multiplikation
  • 64 parallel laufende Threads ohne Interrupt-Service
  • Thread-Ressourcen können nach Bedarf konfiguriert werden, und es ist kein Echtzeit-Betriebssystem erforderlich
  • 100 % Single-Cycle-Befehle, keine Verzweigungsvorhersage
  • Unterstützt USART, SPI-Schnittstelle, USB2.0-Host-/Geräteschnittstelle, CAN2.0B
  • Bis zu 4 Kanäle für Eingangsabtastung/Ausgangsvergleich/PWM/Impulszählung
  • Systemzeittimer: 32-Bit-Selbstinkrementierzähler

MC3172 Spezifikation

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 Entwicklungsboard-Programmierhandbuch

Bevor wir den Mikrocontroller MC3172 programmieren können, müssen wir das Entwicklungstool MounRiver Studio und das MC3172 Project Pack herunterladen.

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

MounRiver Studio herunterladen und installieren

Die Entwicklungssoftware für den MC3172 ist MounRiver Studio, die Download-Adresse lautet:

http://www.mounriver.com/download

MounRiver_Studio Download URL
MounRiver_Studio Download URL

Nach der Installation von MounRiver Studio sieht der Startbildschirm wie folgt aus:

MounRiver-Studio-Install
MounRiver-Studio-Install

Klicken Sie auf „Projekt/Lösung laden“ und wählen Sie unser MC3172-Projekt aus. Diese Projektdatei befindet sich in der Datei „MC3172_Template_v1.21“ in der soeben heruntergeladenen MC3172-Datensammlung.

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

Alle auf der offiziellen Website bereitgestellten Demoprogramme befinden sich in der Datei „GPIO_GPCOM_TIMER_Example.c”. Wir werden uns für unsere Portierung ebenfalls auf diesen Teil beziehen.

Öffnen Sie das Thread-Konfigurationstool.

In der soeben heruntergeladenen MC3172-Datenerfassungsdatei befindet sich auch ein Chip-Konfigurationssoftware-Thread-Konfigurationstool_V1.exe. Es befindet sich im Verzeichnis MC3172-Datenerfassung_V1.03 \ MC3172_Template \ MC3172.

Der entsprechende Code für diese Software ist Open Source, Open-Source-Adresse: https://gitee.com/gxchip.

Configuration code genration tool
Configuration code genration tool

Öffnen Sie die Programm-Download-Software.

In der Datei MC3172_V1.03, die von der offiziellen Website heruntergeladen wurde, befindet sich eine Chip-Programm-Download-Software im Verzeichnis MC3172_V1.03\MC3172_Template\Release.

MC3172 program download software
MC3172 program download software

MC3172 Programmierung – LED blinkt

Mit den oben genannten Schritten haben wir die MC3172-Entwicklungsumgebung vorbereitet und werden nun das grundlegendste LED-Beleuchtungsprogramm entwerfen.

Konfigurieren von MCU-Ressourcen

Öffnen Sie die Software „Thread Configuration Tool_V1.exe“ und stellen Sie die Parameter wie folgt ein:

Setting Thread Configuration Tool
Setting Thread Configuration Tool

Klicken Sie auf „Code generieren“. Wenn Sie die SRAM-Zuweisung festlegen, wird die Projektdatei MC3172.lds automatisch aktualisiert. Wenn Sie die Thread-Zuweisung festlegen, wird thread_config.h automatisch aktualisiert. Hinweis: Beachten Sie die Auswahl der Taktquelle. Die interne RC-Taktquelle mit 200 MHz ist standardmäßig aktiviert. Wenn keine Taktkonfiguration oder kein Reset erfolgt, wird der interne 200-MHz-RC-Oszillator als Standard-CPU-Takt verwendet. Sie können zusätzlich einen externen 4- bis 40-MHz-Quarz (das Evaluierungsboard ist mit einem passiven 48-MHz-Quarz bestückt) zum Antrieb auswählen. einen 8-MHz-RC-Oszillator oder einen externen Direkt-Eingangstakt als Kernel-Takt verwenden. Das bedeutet, dass die hier vorgenommene Einstellung später direkt als Kernel-Takt verwendet wird.

Das Programm schreiben

Wenn wir das Projekt mit dem ide-Tool (MounRiver Studio) öffnen, können wir zunächst den Programmcode in der Datei GPIO_GPCOM_TIMER_Example.c aufrufen:

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

				
			

Schreiben Sie anschließend ein Programm in void thread0_main(void) in main.c wie folgt:

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

				
			

Laden Sie das Programm auf den MC3172 herunter.

Verbinden Sie zunächst die Entwicklungsplatine mit dem Computer und öffnen Sie dann die Software zum Herunterladen des Programms für die Entwicklungsplatine. Nun wird ein Gerät erkannt. Klicken Sie auf „Gerät verbinden“, wählen Sie die Firmware „MC3172.hex“ aus und klicken Sie auf „Firmware brennen“. Wenn der Fortschrittsbalken 100 % erreicht hat, ist der Download abgeschlossen.

Burning the program to MC3172 microcontroller

Überprüfen Sie das Programm

Um die Programmierung des LED-Blinkens zu überprüfen, können wir folgende Schritte ausführen:

  1. Überprüfen Sie den Code: Vergewissern Sie sich, dass der Programmiercode korrekt ist und die richtige Syntax für Ihre Programmiersprache aufweist.
  2. Schließen Sie die LED an: Schließen Sie die LED an den Pin an, den Sie in Ihrem Programmiercode definiert haben.
  3. Beobachten Sie die LED: Wenn alles korrekt ist, sollte die LED gemäß dem Programmiercode zu blinken beginnen.
  4. Debuggen: Wenn die LED nicht wie erwartet blinkt, überprüfen Sie Ihren Code erneut und stellen Sie sicher, dass alles korrekt angeschlossen ist.

MC3172 Multithreaded Parallel Execution Test

Wir schreiben zwei Threads, Threads für dieselbe Konfiguration, zwei Threads für jede der beiden umzuschaltenden IOs, Testcode wie zum Beispiel:

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

				
			

Brennen Sie das Programm und verwenden Sie einen Logikanalysator, um die Änderungen des Pin-Pegels von GPIOA_PIN0 und GPIOA_PIN1 wie folgt zu erfassen:

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

Wie in der Abbildung zu sehen ist, sind die beiden Wellenformen vollständig synchronisiert, und die CPU führt zwei Aufgaben gleichzeitig aus, wodurch derselbe Effekt wie beim Multithreading eines Echtzeitbetriebssystems erzielt wird.

MC3172-Programmierung vs. RTOS-Programmierung

Wie oben erwähnt, ist die einzigartige Funktion des Mikrocontrollers MC3172 ein paralleler Multithread-Echtzeitprozessor. Er löst Probleme wie den zugrunde liegenden umständlichen Portierungsprozess, zeitaufwändige Zeitplanung usw., die bei der RTOS-Entwicklung auftreten. Durch die zugrunde liegende Echtzeitreaktion auf Hardwareebene kann er einen echten „Echtzeitbetrieb” erreichen.

Hier ist ein Code-Beispiel für die parallele Multithread-Programmierung des Mikrocontrollers 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)

------
				
			

Wir alle wissen, dass die dem RTOS zugrunde liegenden Scheduling-Threads mehrere us (unterschiedlicher Prozessorzeitverbrauch) benötigen, aber der MC3172-Prozessor hat einen Zeitverbrauch von fast 0. Das bedeutet, dass die MC3172-Threads parallel mit ihrer eigenen stabilen Frequenz laufen, ohne Switching-Overhead oder Jitter.

Außerdem sind die Peripherie-Antwortdaten des MC3172-Prozessors zeitnaher. Beispiel: UART-Seriellport zum Empfang externer Daten, mehrere Threads können die seriellen Daten parallel empfangen und darauf reagieren. (Gewöhnliche Mikrocontroller haben in der Regel Interrupt-Priorität, „pausieren“, um auf serielle Daten mit niedriger Priorität zu reagieren, blockieren den Fall, verlieren aber auch Daten.

Fazit

Der Mikrocontroller MC3172 ist ein einzigartiger Prozessor, den ich in China kennengelernt habe. Er löst einige der Probleme, die bei RTOS auftreten, und verbessert die Effizienz der Chip-Programmierung.

Wenn Sie also RTOS-Entwicklung einsetzen und Probleme wie Verzögerungen bei der Ablaufplanung zwischen Threads haben, können Sie den Mikrocontroller MC3172 ausprobieren.

Abonnieren

Tragen Sie sich in unsere Abonnentenliste ein, um monatliche Blog-Updates, Technologie-News und Fallstudien zu erhalten. Wir versenden niemals Spam, und Sie können sich jederzeit wieder abmelden.

Nach oben scrollen

Instant Quote