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

MC3172 Распиновка

Особенности MC3172
Этот микроконтроллер MC3172 имеет много общего с обычными микроконтроллерами, которые мы используем, такими как GPIO, UART, SPI, USB, CAN и другими распространенными периферийными устройствами.
Но у него есть одна уникальная особенность: это параллельный многопоточный процессор реального времени, основанный на наборе инструкций RISC-V RV32IMC.
Другими словами, он имеет многопоточность RTOS, но вместо обычного планирования программного обеспечения RTOS он реагирует в режиме реального времени на аппаратном уровне без подпрограмм обслуживания прерываний.
- Поддержка комбинации набора инструкций RV32IMC, одноцикловое умножение
- 64 потока, работающих параллельно без обслуживания прерываний
- Ресурсы потоков могут быть настроены по требованию, и не требуется операционная система реального времени
- 100% одноцикловые инструкции, без прогнозирования ветвлений
- Поддержка USART, интерфейса SPI, интерфейса хоста/устройства USB2.0, CAN2.0B
- До 4 каналов для захвата ввода/сравнения вывода/ШИМ/подсчета импульсов
- Таймер системного времени: 32-разрядный самоинкрементирующийся счетчик
MC3172 Технические характеристики
| Attributes | Value |
|---|---|
| Frequency | up to 200MHz |
| SRAM | 128KB |
| Core voltage | 1.62V to 1.98V |
| GPIO voltage | 1.8V ~ 3.3V |
| RC oscillator | 8MHz, 200MHz |
| External oscillator | 4MHz~40MHz |
| Input clock | 133MHz max. |
| Counters | 8 |
| I/O ports | up to 64 |
| Communication interface | 12 |
| Package | LQFP100 |
Учебник по программированию платы разработчика MC3172
Перед программированием микроконтроллера MC3172 необходимо загрузить инструмент разработки — MounRiver Studio — и пакет проектов MC3172.
Скачайте и установите MounRiver Studio
Программным обеспечением для разработки MC3172 является MounRiver Studio, адрес для скачивания:

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

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

Все демонстрационные программы, предоставленные официальным сайтом, находятся в файле «GPIO_GPCOM_TIMER_Example.c». Мы также будем ссылаться на эту часть при портировании.
Откройте инструмент настройки потока
В только что загруженном файле сбора данных MC3172 также имеется инструмент настройки конфигурации микросхемы tool_V1.exe. Он находится в каталоге MC3172 data collection_V1.03 \ MC3172_Template \ MC3172.
Соответствующий код для этого программного обеспечения является открытым, адрес открытого исходного кода: https://gitee.com/gxchip.

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

Программирование MC3172 — мигание светодиода
Выполнив вышеуказанные шаги, мы подготовили среду разработки MC3172 и приступим к разработке самой простой программы светодиодной подсветки.
Настройка ресурсов микроконтроллера
Откройте программу Thread Configuration Tool_V1.exe и установите следующие параметры:

Нажмите «Создать код». При настройке распределения 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%, загрузка будет завершена.

Проверить программу
Чтобы проверить программирование мигания светодиода, можно выполнить следующие действия:
- Проверьте код: убедитесь, что программный код правильный и имеет правильный синтаксис для вашего языка программирования.
- Подключите светодиод: подключите светодиод к выводу, который вы определили в программном коде.
- Наблюдайте за светодиодом: если все правильно, светодиод должен начать мигать в соответствии с программным кодом.
- Отладка: если светодиод не мигает как ожидалось, проверьте код еще раз и убедитесь, что все подключено правильно.
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 следующим образом:

Как видно на рисунке, две волновые формы полностью синхронизированы, и ЦП выполняет две операции одновременно, достигая того же эффекта, что и многопоточность 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.




