Программирование платы разработчика MC3172

Содержание

MC3172_Development_Board

MC3172 Введение

MC3172 — это 32-разрядный RISC-процессор с параллельным многопоточным режимом работы в реальном времени, разработанный компанией GXchip в Китае. Он использует новый режим работы ЦП и режим разработки программного обеспечения. В отличие от однопоточного режима программирования, различные потоки параллельного многопоточного режима работают синхронно, не мешая друг другу, и не существует понятия приоритета.

MC3172 Microcontroller

MC3172 Распиновка

MC3172 Pinout

Особенности MC3172

Этот микроконтроллер MC3172 имеет много общего с обычными микроконтроллерами, которые мы используем, такими как GPIO, UART, SPI, USB, CAN и другими распространенными периферийными устройствами.

Но у него есть одна уникальная особенность: это параллельный многопоточный процессор реального времени, основанный на наборе инструкций RISC-V RV32IMC.

Другими словами, он имеет многопоточность RTOS, но вместо обычного планирования программного обеспечения RTOS он реагирует в режиме реального времени на аппаратном уровне без подпрограмм обслуживания прерываний.

  • Поддержка комбинации набора инструкций RV32IMC, одноцикловое умножение
  • 64 потока, работающих параллельно без обслуживания прерываний
  • Ресурсы потоков могут быть настроены по требованию, и не требуется операционная система реального времени
  • 100% одноцикловые инструкции, без прогнозирования ветвлений
  • Поддержка USART, интерфейса SPI, интерфейса хоста/устройства USB2.0, CAN2.0B
  • До 4 каналов для захвата ввода/сравнения вывода/ШИМ/подсчета импульсов
  • Таймер системного времени: 32-разрядный самоинкрементирующийся счетчик

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

Учебник по программированию платы разработчика MC3172

Перед программированием микроконтроллера MC3172 необходимо загрузить инструмент разработки — MounRiver Studio — и пакет проектов MC3172.

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

Скачайте и установите MounRiver Studio

Программным обеспечением для разработки MC3172 является MounRiver Studio, адрес для скачивания:

http://www.mounriver.com/download

MounRiver_Studio Download URL
MounRiver_Studio Download URL

После установки MounRiver Studio экран запуска выглядит следующим образом:

MounRiver-Studio-Install
MounRiver-Studio-Install

Нажмите «Загрузить проект/решение» и выберите наш проект MC3172. Этот файл проекта находится в файле MC3172_Template_v1.21 в наборе данных MC3172, который мы только что загрузили.

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

Все демонстрационные программы, предоставленные официальным сайтом, находятся в файле «GPIO_GPCOM_TIMER_Example.c». Мы также будем ссылаться на эту часть при портировании.

Откройте инструмент настройки потока

В только что загруженном файле сбора данных MC3172 также имеется инструмент настройки конфигурации микросхемы tool_V1.exe. Он находится в каталоге MC3172 data collection_V1.03 \ MC3172_Template \ MC3172.

Соответствующий код для этого программного обеспечения является открытым, адрес открытого исходного кода: https://gitee.com/gxchip.

Configuration code genration tool
Configuration code genration tool

Откройте программу для загрузки программного обеспечения

Программа для загрузки чипа находится в файле MC3172_V1.03, загруженном с официального сайта, в каталоге MC3172_V1.03\MC3172_Template\Release.

MC3172 program download software
MC3172 program download software

Программирование MC3172 — мигание светодиода

Выполнив вышеуказанные шаги, мы подготовили среду разработки MC3172 и приступим к разработке самой простой программы светодиодной подсветки.

Настройка ресурсов микроконтроллера

Откройте программу Thread Configuration Tool_V1.exe и установите следующие параметры:

Setting Thread Configuration Tool
Setting Thread Configuration Tool

Нажмите «Создать код». При настройке распределения SRAM файл проекта MC3172.lds будет обновлен автоматически, при настройке распределения потоков файл thread_config.h будет обновлен автоматически. Примечание: следует обратить внимание на выбор источника тактовой частоты. По умолчанию включен внутренний RC-генератор 200 МГц. Если не выполняется настройка тактовой частоты или сброс, внутренний RC-генератор 200 МГц используется в качестве тактовой частоты процессора по умолчанию. Затем можно дополнительно выбрать внешний кварцевый генератор 4–40 МГц (оценочная плата оснащена пассивным кварцевым генератором 48 МГц) для управления 8-МГц RC-генератор или внешний тактовый генератор с прямым входом в качестве тактового генератора ядра. Это означает, что настройка, сделанная здесь, будет впоследствии использоваться непосредственно в качестве тактового генератора ядра.

Написание программы

Открыв проект с помощью инструмента ide (MounRiver Studio), мы можем сначала обратиться к программному коду в файле 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().
        }
    }
}

				
			

Следуя вышеизложенному, напишите программу в void thread0_main(void) в main.c следующим образом:

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

				
			

Загрузите программу на MC3172

Сначала подключите плату разработчика к компьютеру, а затем откройте программу для загрузки программного обеспечения на плату разработчика. На этот раз устройство будет распознано, нажмите «Подключить устройство», выберите прошивку MC3172.hex и нажмите «Записать прошивку». Когда индикатор прогресса достигнет 100%, загрузка будет завершена.

Burning the program to MC3172 microcontroller

Проверить программу

Чтобы проверить программирование мигания светодиода, можно выполнить следующие действия:

  1. Проверьте код: убедитесь, что программный код правильный и имеет правильный синтаксис для вашего языка программирования.
  2. Подключите светодиод: подключите светодиод к выводу, который вы определили в программном коде.
  3. Наблюдайте за светодиодом: если все правильно, светодиод должен начать мигать в соответствии с программным кодом.
  4. Отладка: если светодиод не мигает как ожидалось, проверьте код еще раз и убедитесь, что все подключено правильно.

MC3172 Тест многопоточного параллельного выполнения

Мы пишем два потока, потоки для одной и той же конфигурации, два потока для каждого из двух переключаемых входов-выходов, тестовый код, например:

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

				
			

Запишите программу и используйте логический анализатор для регистрации изменений уровня сигналов на выводах GPIOA_PIN0 и GPIOA_PIN1 следующим образом:

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

Как видно на рисунке, две волновые формы полностью синхронизированы, и ЦП выполняет две операции одновременно, достигая того же эффекта, что и многопоточность RTOS.

Программирование MC3172 против программирования RTOS

Как упоминалось выше, уникальной особенностью микроконтроллера MC3172 является параллельный многопоточный процессор реального времени. Он решает такие проблемы, как сложный процесс переноса, трудоемкое планирование и т. д., которые возникают при разработке RTOS. Благодаря аппаратному уровню реагирования в реальном времени он может обеспечить истинную «работу в реальном времени».

Ниже приведен пример кода параллельного многопоточного программирования микроконтроллера 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)

------
				
			

Все мы знаем, что RTOS, лежащая в основе планирования потоков, займет несколько мс (разное потребление процессорного времени), но процессор MC3172 потребляет почти 0 времени. Это означает, что потоки MC3172 работают параллельно на своей собственной стабильной частоте, без переключения и джиттера.

Кроме того, данные периферийных устройств процессора MC3172 более актуальны в режиме реального времени. Например: последовательный порт UART для приема внешних данных, несколько потоков могут параллельно принимать и отвечать на последовательные данные. (Обычный микроконтроллер, как правило, имеет приоритет прерываний, «приостанавливается», чтобы ответить на последовательные данные с низким приоритетом, блокируя случай, но также теряя данные).

Заключение

Микроконтроллер MC3172 — это уникальный процессор, который я видел в Китае. Он решает некоторые проблемы, существующие в RTOS, и повышает эффективность программирования микросхем.

Таким образом, если вы используете RTOS для разработки и сталкиваетесь с такими проблемами, как задержки в планировании между потоками, вы можете попробовать микроконтроллер MC3172.

Подписаться

Присоединяйтесь к нашему списку подписчиков, чтобы получать ежемесячные обновления блога, новости о технологиях, практические примеры. Мы никогда не будем рассылать спам, и вы можете отказаться от подписки в любое время.

Об авторе

Picture of Aidan Taylor
Aidan Taylor

I am Aidan Taylor and I have over 10 years of experience in the field of PCB Reverse Engineering, PCB design and IC Unlock.

Поделиться

Рекомендуемый пост

Tags

Нужна помощь?

Прокрутить вверх

Instant Quote