Кто может помочь симулировать в Proteus проект max7219 и MATRIX-8x8 вместе с STM32F103C6T6 ?
Ответили мне на одном из форумов так
Добрый вечер.
Причина почти наверняка в несовершенстве модели SPI для STM32F103C6 в вашей версии Proteus (8.8 SP1) и в том, как эта модель обрабатывает быстрые команды.
Вот основные причины, почему симуляция с STM32 не работает, в то время как с Arduino Nano и в реальном железе все отлично.
1. Главный подозреваемый: Проблемы с моделью SPI в Proteus
Это самая вероятная причина. Моделирование сложных периферийных модулей, таких как SPI, в Proteus — это всегда компромисс между скоростью симуляции и точностью . Вы сталкиваетесь с его ограничениями:
Неполная эмуляция SPI: Модель SPI в вашей версии Proteus может просто "не успевать" или некорректно обрабатывать биты данных, которые посылает ваш STM32, особенно если частота SPI высокая . В результате MAX7219 получает "мусор" и не зажигает нужные светодиоды.
Скорость работы: Proteus эмулирует работу микроконтроллера значительно медленнее, чем он работает в реальности . Ваши 1-секундные задержки в симуляции могут превратиться в 5-10 секунд, а передача данных по SPI может идти с таймингами, которые не распознает модель MAX7219.
2. Разные уровни моделей: Arduino vs. STM32
Arduino Nano: Модель ATmega328P (сердце Arduino Nano) в Proteus очень зрелая и хорошо отлаженная, так как существует уже много лет. Ее цифровые выводы и SPI работают в симуляции предсказуемо.
STM32F103C6: Модель этого контроллера в Proteus — это тоже "актер", который имитирует работу, но не всегда делает это идеально, особенно для таких задач, как быстрая передача данных по SPI . Ваша версия 8.8 SP1 может иметь баги в модели SPI для STM32F1, которые были исправлены в более новых версиях.
3. Критическая уязвимость: Ток GPIO в симуляции
В Proteus есть известная особенность: выходной ток на симулируемых пинах STM32 очень мал . Если вы подключаете выводы STM32 напрямую ко входам MAX7219, модель может "видеть" логический 0, а не логическую 1, потому что у MAX7219 в симуляции другое входное сопротивление. На реальной плате все работает, так как реальный ток достаточен.
4. Конфигурация тактирования и "Опция байты"
Хотя вы говорите, что на реальном железе все работает, для STM32F103C6 есть нюансы, которые часто "убивают" симуляцию:
Частота: Убедитесь, что в настройках проекта (в Arduino IDE) и в свойствах самого микроконтроллера в Proteus (двойной клик по нему) установлена одинаковая частота, например, 8 МГц от внешнего кварца .
Flash-память: STM32F103C6 имеет 32 КБ Flash, а не 64, как C8. Ошибки в "Option Bytes" (защита памяти) на реальном чипе могут мешать, но в симуляции это может проявляться как полный отказ программы стартовать
PS
Пока та и не смог решить вопрос - симулировать в Proteus проект max7219 и MATRIX-8x8 вместе с STM32F103C6T6.
Код для STM32CubeMX касающийся max7219
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define DECODE_MODE_REG 0x09
#define INTENSITY_REG 0x0A
#define SCAN_LIMIT_REG 0x0B
#define SHUTDOWN_REG 0x0C
#define DISPLAY_TEST_REG 0x0F
/* USER CODE END PD */
................
static void write_reg(uint8_t reg, uint8_t value) {
uint8_t tx_data[2] = { reg, value };
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, tx_data, 2, 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
static void set_row(uint8_t row_index) {
write_reg(row_index + 1, 0xFF);
}
static void set_col(uint8_t col_index) {
for (int i = 0; i < 8; i++) {
write_reg(i + 1, 0x01 << col_index);
}
}
static void clear(void) {
for (int i = 0; i < 8; i++) {
write_reg(i + 1, 0x00);
}
}
static void max7219_init() {
write_reg(DISPLAY_TEST_REG, 0);
write_reg(SCAN_LIMIT_REG, 7);
write_reg(DECODE_MODE_REG, 0);
write_reg(SHUTDOWN_REG, 1);
clear();
}
/* USER CODE END 0 */
Хотя я использую IAR EW for Arm 9.30.1.