Programmation de la carte de développement MC3172

Table des Matières

MC3172_Development_Board

MC3172 Introduction

Le MC3172 est un processeur temps réel multithread parallèle RISC 32 bits développé par GXchip en Chine. Il utilise un nouveau mode de fonctionnement du processeur et un nouveau mode de développement logiciel. Contrairement au mode de programmation monothread, les différents threads du multithreading parallèle s'exécutent de manière synchrone sans s'interférer les uns les autres, et il n'y a pas de concept de priorité.

MC3172 Microcontroller

MC3172 Brochage

MC3172 Pinout

Caractéristiques du MC3172

Ce microcontrôleur MC3172 présente de nombreuses similitudes avec les microcontrôleurs courants que nous utilisons, tels que GPIO, UART, SPI, USB, CAN et d'autres périphériques courants.

Mais il possède une caractéristique très unique : il s'agit d'un processeur temps réel multithread parallèle basé sur le jeu d'instructions RISC-V RV32IMC.

En d'autres termes, il dispose d'une capacité multithread RTOS, mais au lieu d'un ordonnancement logiciel RTOS classique, il répond en temps réel au niveau matériel sans routines de service d'interruption.

  • Prise en charge de la combinaison du jeu d'instructions RV32IMC, multiplication en un seul cycle
  • 64 threads fonctionnant en parallèle sans service d'interruption
  • Les ressources des threads peuvent être configurées à la demande et aucun système d'exploitation en temps réel n'est nécessaire
  • 100 % d'instructions à cycle unique, pas de prédiction de branche
  • Prise en charge des interfaces USART, SPI, USB 2.0 hôte/périphérique, CAN 2.0B
  • Jusqu'à 4 canaux pour la capture d'entrée/comparaison de sortie/PWM/comptage d'impulsions
  • Temporisateur système : compteur auto-incrémentiel 32 bits

Spécifications 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

Tutoriel de programmation de la carte de développement MC3172

Avant de programmer le microcontrôleur MC3172, nous devons télécharger l'outil de développement MounRiver Studio et le pack de projet MC3172.

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

Télécharger et installer MounRiver Studio

Le logiciel de développement du MC3172 est MounRiver Studio, dont l'adresse de téléchargement est :

http://www.mounriver.com/download

MounRiver_Studio Download URL
MounRiver_Studio Download URL

Après avoir installé MounRiver Studio, l'écran de démarrage se présente comme suit :

MounRiver-Studio-Install
MounRiver-Studio-Install

Cliquez sur « Charger le projet/la solution » et sélectionnez notre projet MC3172. Ce fichier de projet se trouve dans le fichier MC3172_Template_v1.21 de la collecte de données MC3172 que nous venons de télécharger.

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

Tous les programmes de démonstration fournis par le site officiel se trouvent dans le fichier « GPIO_GPCOM_TIMER_Example.c ». Nous nous référerons également à cette partie pour notre portage.

Ouvrez l'outil de configuration du fil.

Dans le fichier de collecte de données MC3172 que vous venez de télécharger, vous trouverez également un outil de configuration de thread pour le logiciel de configuration de puce_V1.exe. Il se trouve dans le répertoire MC3172 data collection_V1.03 \ MC3172_Template \ MC3172.

Le code correspondant à ce logiciel est open source, adresse open source : https://gitee.com/gxchip.

Configuration code genration tool
Configuration code genration tool

Ouvrez le logiciel de téléchargement du programme.

Le fichier MC3172_V1.03 téléchargé depuis le site officiel contient un logiciel de téléchargement de programme pour puce, situé dans le répertoire MC3172_V1.03\MC3172_Template\Release.

MC3172 program download software
MC3172 program download software

Programmation MC3172 - Clignotement des LED

Les étapes ci-dessus nous ont permis de préparer l'environnement de développement MC3172. Nous allons maintenant concevoir le programme d'éclairage LED le plus basique.

Configuration des ressources mcu

Ouvrez le logiciel Thread Configuration Tool_V1.exe et réglez les paramètres comme suit :

Setting Thread Configuration Tool
Setting Thread Configuration Tool

Cliquez sur « Générer le code ». Lorsque vous définissez l'allocation SRAM, le fichier de projet MC3172.lds sera automatiquement mis à jour. Lorsque vous définissez l'allocation de threads, le fichier thread_config.h sera automatiquement mis à jour. Remarque : la sélection de la source d'horloge doit être notée. La source d'horloge système interne RC 200 MHz est activée par défaut. Après aucune configuration d'horloge ou réinitialisation, l'oscillateur RC interne 200 MHz est utilisé comme horloge CPU par défaut. Vous pouvez ensuite choisir en plus un cristal externe 4~40 MHz (la carte d'évaluation est équipée d'un cristal passif 48 m) pour piloter oscillateur RC 8 MHz ou horloge à entrée directe externe comme horloge du noyau. Cela signifie que le paramètre défini ici sera directement utilisé comme horloge du noyau ultérieurement.

Écrire le programme

En ouvrant le projet avec l'outil ide (MounRiver Studio), nous pouvons d'abord nous référer au code du programme dans le fichier 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().
        }
    }
}

				
			

Suite à ce qui précède, écrivez un programme dans void thread0_main(void) dans main.c comme suit :

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

				
			

Téléchargez le programme sur le MC3172.

Connectez d'abord la carte de développement à l'ordinateur, puis ouvrez le logiciel de téléchargement du programme de la carte de développement. À ce moment-là, un périphérique sera reconnu. Cliquez sur « Connect Device » (Connecter le périphérique), sélectionnez le micrologiciel MC3172.hex, puis cliquez sur « Burn Firmware » (Graver le micrologiciel). Lorsque la barre de progression atteint 100 %, le téléchargement est terminé.

Burning the program to MC3172 microcontroller

Vérifier le programme

Pour vérifier la programmation du clignotement des LED, nous pouvons suivre les étapes suivantes :

  1. Vérifiez le code : assurez-vous que le code de programmation est correct et qu'il respecte la syntaxe de votre langage de programmation.
  2. Connectez la LED : connectez la LED à la broche que vous avez définie dans votre code de programmation.
  3. Observez la LED : si tout est correct, la LED devrait commencer à clignoter conformément au code de programmation.
  4. Déboguer : si la LED ne clignote pas comme prévu, vérifiez à nouveau votre code et assurez-vous que tout est correctement connecté.

Test d'exécution parallèle multithread MC3172

Nous écrivons deux threads, des threads pour la même configuration, deux threads pour chacune des deux E/S à inverser, un code de test tel que :

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

				
			

Gravez le programme et utilisez un analyseur logique pour capturer les changements de niveau des broches GPIOA_PIN0 et GPIOA_PIN1 comme suit :

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

Comme le montre la figure, les deux formes d'onde sont entièrement synchronisées et le CPU effectue deux tâches simultanément, obtenant ainsi le même effet que le multithreading RTOS.

Programmation MC3172 vs programmation RTOS

Comme mentionné ci-dessus, la caractéristique unique du microcontrôleur MC3172 est un processeur temps réel multithread parallèle. Il résout les problèmes tels que le processus de portage fastidieux, la planification chronophage, etc., qui surviennent lors du développement d'un RTOS. Grâce à la réponse temps réel au niveau matériel, il peut atteindre un véritable « fonctionnement en temps réel ».

Voici un exemple de code de programmation multithread parallèle du microcontrôleur 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)

------
				
			

Nous savons tous que les threads de planification sous-jacents au RTOS prendront plusieurs us (consommation de temps processeur différente), mais le processeur MC3172 est presque proche d'une consommation de temps nulle. Cela signifie que les threads MC3172 s'exécutent en parallèle à leur propre fréquence stable, sans surcharge de commutation ni gigue.

De plus, les données de réponse périphérique du processeur MC3172 sont plus en temps réel. Par exemple : le port série UART pour recevoir des données externes, plusieurs threads peuvent recevoir et répondre aux données série en parallèle. (Les microcontrôleurs ordinaires ont généralement une priorité d'interruption, ils « pausent » pour répondre aux données série à faible priorité, bloquant ainsi le cas, mais perdant également des données).

Conclusion

Le microcontrôleur MC3172 est un processeur unique en son genre que j'ai découvert en Chine. Il résout certains des problèmes liés aux RTOS et améliore l'efficacité de la programmation des puces.

Si vous utilisez le développement RTOS et rencontrez des problèmes tels que des retards de planification entre les threads, vous pouvez essayer le microcontrôleur MC3172.

Abonnez-vous

Rejoignez notre liste d’abonnés pour obtenir mensuel blog des mises à jour, des nouvelles technologies, des études de cas. Nous n’enverrons jamais de spam, et vous pouvez vous désinscrire à tout moment.

Retour en haut

Instant Quote