Сбоеустойчивый контроллер архитектуры 8051

Тема создана для общения и вопросов касательно микроконтроллера 5400ТР105-003.
Подразделы: Общая тема,, Программное обеспечение , Отладочный комплект.

Состав

  • Микроконтроллерное ядро архитектуры 8051
  • 12 разрядный ЦАП;
  • 12 разрядный АЦП;
  • Источник опорного напряжения с масштабирующим ОУ;
  • RC-генератор;
  • Супервизор питания;
  • Блок ФАПЧ;
  • Встроенные регуляторы напряжения.
  • 24 универсальных портов ввода/вывода (GPIO);
  • 2 интерфейса SPI;
  • 2 интерфейса UART;
  • Интерфейс 1-Wire;
  • Интерфейс I2C;
  • Интерфейс JTAG;
  • Три 24-разрядных таймера/счетчика
  • Сторожевой таймер

Полная документация на микроконтроллер доступна в электронном виде на Wiki или в текстовом варианте на cайте компании.

Отладочный комплект

Для демонстрации функциональных возможностей и программирования микросхемы разработан отладочный комплект.
Состав отладочного комплекта:
• Отладочная плата КФЦС.441461.196;
• USB-кабель для подключения отладочной платы к ПК;
• Блок питания;
• Программатор;
• ПО DCSProg6 для программирования микросхемы.

Программное обеспечение

Среда разработки – IDE Keil MVision C51

2 месяца спустя

Вопрос не о совершении невозможного, а о поиске механизма обхода этого технологического ограничения с применением внешних запоминающих устройств

Наличие однократно-программируемой памяти МК, даже на фоне многократно-программируемой отладочной ОЗУ в объеме, повторяющем ПЗУ - это, как ни крути, довольно скверная ситуация в перспективе долговременной поддержке изделия.
Предлагается обсудить варианты решения этой проблемы, находящейся на стыке программного и аппаратного уровней.
Для начала попробуем ответить на вопрос: а для чего?.. при каких обстоятельствах вообще может понадобиться перепрограммируемость именно ПЗУ? Точно ли НЕ хватает механизма отладки из ОЗУ?

Попытаюсь уменьшить объем текста: варианты решения административными способами будут спрятаны под спойлерами. Но помним, что предмет вопроса - это технические решения, а не бумажные.

1) Отладка агрегата до начала каких-либо испытаний. Хотелось бы, чтобы каждое включения питания (или перезагрузку питания) агрегата НЕ сопровождалось обрядом прошивки ОЗУ всех МК в агрегате (а МК часто будет не 1 и не 2, и расположены они будут [9 из 10] в довольно труднодоступных местах) - в общем просто неудобно, хотя и не смертельно. Но может возникнуть ситуация, когда захочется посмотреть поведение агрегата именно сразу после включения, а условная 5ти минутная прошивка ОЗУ по определению не даст это сделать.
2) Внесение изменений на этапе предъявительских или заводских испытаний. Вылез ли косяк во время сдачи или же появилось какое-то субъективное требование заказчика, так или иначе, нужно перепрошивать.
Вариант административного решения:

Как правило агрегат на этих этапах еще находятся на территории родного завода и проблему можно решить административными способами - протащить в ТУ на агрегат указания, не допускающие прожигание ПЗУ МК до конца или до определенной стадии испытания агрегата. Т.е. дождаться того момента, когда все согласятся, что агрегат работает именно так, как того требует ТЗ и только после этого прожигать. Звучит тоже пока еще сносно, но держим в голове, что к моменту завершению заводских испытаний все МК в агрегате уже абсолютно точно должны быть прозжены.

3) Внесение изменений на этапе автономных и более серьезных испытаний. Тут уже всё (имеем что имеем), а если мы имеем прозженный МК, то это только замена. Откуда же взять новый МК, не грабить же ЗИП?
Вариант административного решения:

В ГОСТ на ведомость покупных изделий (ВП) есть разъяснение назначения графы “на регулирование”. Из этого разъяснения следует, что туда вписываются (и приобретаются) покупные изделия (в частности наши МК), которые могут (и должны быть) быть амортизированы (израсходованы) на этапе испытаний. Т.е. можно закупить МК больше на число микросхем в агрегате, помноженное на число этапов испытаний, следующих за заводскими. Звучит очень переразмеренно, но ГОСТ явно регламентирует такую графу расходов. Насколько рентабельно закупать в 2-4 раза больше микросхем, чем требуется в агрегате, при том, что они могут и не понадобиться? А, с другой стороны, насколько дорого сорвать этап контракта на 9 месяцев, затянув испытания, пока изготавливают и поставляют новые МК и во сколько денег можно оценить нервотрепку или даже свободу ответственных за исполнение контракта лиц? Последние 2 вопроса следует соотносить между собой, но суть такова, что существует механизм заблаговременного приобретения запасных МК для замены прозженных с новой программой на любом этапе испытаний.

4) Доработка серийного изделия. По результатам эксплуатации может возникнуть потребность изменить ПО в МК, в том числе в тех МК, которые сейчас находятся в эксплуатации в составе изделий.
Вариант административного решения:

Ну тут довольно просто - ТЗ на доработку, в рамках которых закупят изготовят, испытают и установят составную часть с новым МК и новым ПО. Как правило, когда дело доходит до ТЗ на доработку, у людей есть понимание, что дело это не быстрое. 9 месяцев - значит 9 месяцев

В сухом остатке имеем, что административными методами выкрутиться можно, но стоит попытаться не доводить до крайностей.

На ум приходит 4 базовых концепции, которые будут помещены под спойлер

Концепция 1, конфигурационная:
Самая простая в реализации и компромиссная по гибкости концепция, когда основной код по-прежнему прожигается в ПЗУ МК, но часть параметров выносится на внешнюю микросхему памяти (например по SPI), например:
начальная инициализация периферии, скорость работы интерфейсов, адреса на шинах данных и т.д. в зависимости от специфики конкретного применения. Т.о. можно заложить определенный запас гибкости, хоть и не на все случаи жизни.
Концепция 2, самозагрузка:
В этой концепции вся память программы (полезная прошивка) исходно хранится на внешней(их) микросхеме(ах) памяти и существует единственный МК. При подаче питания из прозженной ПЗУ МК запускает программа бутлодера, которая в свою очередь считывает полезную прошивку из внешней памяти в область отладочной ОЗУ. Затем с помощью некоторой внешней схемотехники переключается режим работы из хард в софт и обеспечивается аппаратный ресет без отключения питания. Тот факт, что аппаратный ресет без отключения питания не очищает ОЗУ, дает принципиальную возможность такой смены режима, но это вроде как не гарантированно, так что в начале полезной прошивки обязательно должна быть верификация ПО и в случае не прохождения ее - возврат в режим хард для повторной загрузки. Лично мне кажется этот способ крутым, принципиально возможным, но не гарантированным/безопасным, а значит не перспективным 🙁
Концепция 3, загрузка другим МК:
В этой концепции вся память программы (полезная прошивка) также исходно хранится на внешней(их) микросхеме(ах) памяти, но существует основной МК и МК-бутлодер. Тут вроде очевидно из названия - прозженный МК-бутлодер при включении питания по jtag прошивает в отладочную ОЗУ основного МК полезную прошивку и запускает его в режиме софт. Вроде всё красиво, но нужно х2 микроконтроллеров.
Концепция 4, исполнение команд:
Это java-подобный концепт, при котором на внешней памяти хранится некоторый алгоритм в специфическом бинарном коде, а на МК в режиме хард из прозженной ПЗУ запущено ПО, которое поэтапно берет команды из внешней памяти и исполняет их по подготовленным сценариям выполнения этих команд. Степень вложенности и витиеватости полезного ПО будет зависеть от сложности/хитрости реализации хранения алгоритма. Лично для меня эта концепция звучит довольно интригующе, но с учетом не слишком высокой производительности МК снизить эту производительность еще в разы за счет обращения к памяти и разбора команды звучит уже не так перспективно. Хотя может какие-то простые и небыстрые задачи этот концепт для себя найдет.

И самый главный вопрос: кто-нибудь пробовал реализовать какой-то механизм добавления внешней памяти этому МК для реализации многократной программируемости ПЗУ?

P.S. В рамках своего освоения этого МК мы (автор и его команда) начнем с концепции выноса на внешнюю ПЗУ конфигурационных параметров (концепция 1)

2 месяца спустя

Чисто в порядке бреда: подключить внешнюю флешку на SPI, в ПЗУ код загрузки из флешки самой программы в ОЗУ с последующим стартом оной?

PS: нигде не увидел цен изделий, хотя бы конкретно даже этого. Не могу понять почему Российские производители электронных компонентов делают из этого какой то секрет…

21 день спустя

Существует ли возможность на стороне ведомого устройства удерживать линию SCL на время обработки данных для сигнализацию ведущему устройству о неготовности к ответу?

    6 дней спустя

    Daniil
    В качестве ведущего или ведомого будет 5400ТР105-003?
    Если в качестве ведомого, то нет.

    3 месяца спустя

    Здравствуйте, покажите, пожалуйста, рабочий пример по работе с uart0 по прерыванию в Keil (на языке С). Я пробую в регистре IE установить биты EA и EX1 и в регистре UART0_MSK1 установить RBNE, и ничего не происходит. Приёмник и передатчик работают вне прерывания, а через само прерывание не получается

      VladFel

      #include "regs_map_C.h"
      #include "reg51.h"
      
      sbit gpioa_7 = 0x87;
      volatile int i;
      	
      /*void main(void) //Receiver
      {
      	IE = 0x84;
      	WriteReg(GPIOA_DIR_SET, 0x80);
      	gpioa_7 = 1;
      	WriteReg(GPIOA_ALTF1, 0x05); 
      	WriteReg(UART0_BDR0, 0x1A); //Less significant byte of baudrate 
      	WriteReg(UART0_BDR1, 0x00); //Most significant byte of baudrate (final baudrate is 9600)
      	WriteReg(UART0_MSK1, 0x01); //RBNE
      	WriteReg(UART0_CTRL, 0x20); //Reciever
      	while (1);
      }
      
      void int1_handler (void) interrupt 2 //Interrupt on receinving data
      {
      	gpioa_7 ^= 1;
      	ReadReg(UART0_RX0);
      	WriteReg(INT_FIX_CLR1, 0x04);
      }*/
      
      void Delay(int tick);
      
      void main(void) //Transmitter
      {
      	IE = 0x84;
      	WriteReg(GPIOA_DIR_SET, 0x80);
      	gpioa_7 = 1;
      	WriteReg(GPIOA_ALTF1, 0x05); 
      	WriteReg(UART0_BDR0, 0x1A); //Less significant byte of baudrate 
      	WriteReg(UART0_BDR1, 0x00); //Most significant byte of baudrate (final baudrate is 9600)
      	WriteReg(UART0_MSK1, 0x02); //TI
      	WriteReg(UART0_CTRL, 0x10); //Transmitter
      	while (1)
      	{
      		WriteReg(UART0_TX, 0x34);
      		Delay(30000);
      	}
      }
      
      void Delay(int tick)
      {
      	i=0;
      	while(i<tick)
      		i++;
      }
      
      void int1_handler (void) interrupt 2
      {
      	gpioa_7 ^= 1;
      	WriteReg(INT_FIX_CLR1, 0x04);
      }
      19 дней спустя

      В описании на контроллер приведена среда разработки программного обеспечения keil uvision. Допускается разработка прошивки в другой среде, например, codemaster ( установлена на рабочем ПК)? Или keil uvision обязательное условие и без него ничего не получится?

        Ivan_Samara
        Вы можете использовать любое ПО, которое при компиляции проекта создает Intel HEX-файл.

        месяц спустя
        • Изменено

        Здравствуйте, нигде не могу найти ПО DCSProg-5 для ОК 5400ТР105-003, ревизия чипа 2246

          2 месяца спустя

          Здравствуйте!
          Имею на столе отладочный комплект последней версии. Работаю в Keil_5.
          Можно ли посмотреть в отладчике состояние регистров периферийных устройств, например
          GPIOA?

          Ещё вопрос: загрузила прилагаемый проект Exampl (мигание 4 светодиодов).
          На выводе GPIOB_1 (RC_CLOCKOUT) вижу меандр 3 МГц. Кварцевый резонатор на плате 4 МГц.
          Регистры конфигурации я не меняла, при включении они равны 0.
          Откуда берётся частота на выводе, который я не конфигурировала?
          Спасибо

            Elena
            Состояние регистров периферийных устройств можно посмотреть по нажатию «View» –> «Watch Windows» –> «Watch 1» (Руководство пользователя Приложение А, стр.16, пункт “Просмотр состояния переменных”)

            Вывод GPIOB_1 (RC_CLOCKOUT) при TM=1 (режим отладки в Keil) работает как выход внутреннего RC-генератора. При этом частота по умолчанию не настроена. Для настройки необходимо записать биты в регистры ANALOG_O_RC_R и ANALOG_O_RC.
            При TM=0 вывод работает как GPIOB_1.

            5 дней спустя

            Как настроить отладчик, чтобы увидеть регистры ANALOG_CFG?
            Как изменить частоту внутреннего RC?
            В проект ANALOG_CFG добавила переменные analog_o_rc = ReadReg(ANALOG_O_RC) и
            analog_o_rc_r = ReadReg(ANALOG_O_RC_R)
            Записывала максимальные и минимальные значения в регистры ANALOG_O_RC и ANALOG_O_RC_R.
            Переменные analog_o_rc, analog_o_rc_r в окне Watch1 всегда равны 0,
            частота на выводе GPIOB_1 не изменяется.
            Я не могу понять, в чем дело. Помогите пожалуйста разобраться.

            Выяснила, что запись
            WriteReg(ANALOG_O_RC, 0×7F) и
            WriteReg(ANALOG_O_RC_R, 0×00)
            устанавливает минимальную частоту внутреннего RC генератора ( 34.6 кГц ),
            а последующее чтение регистров
            analog_o_rc = ReadReg(ANALOG_O_RC) и
            analog_o_rc_r = ReadReg(ANALOG_O_RC_R)
            меняет ( 333,33 кГц )

              Elena

              Здравствуйте!
              Данные регистры доступны только для записи (см. спецификацию 105-003 - регистры модуля ANALOG_CFG - Доступ “W”, т.е. write). Имеет смысл считывать статусные регистры при отладке, например, value = ReadReg(UART0_ST0); В вашем случае при попытке чтения регистров происходит сброс записанных значений и устанавливаются значения по умолчанию (0) и частота RC также устанавливается по умолчанию. Для настройки необходимо просто записать значения в регистры и контролировать частоту на выходе GPIOB_1 (чтение не производить).

              Здравствуйте!
              Правильно я понимаю, линии GPIOC_0 и GPIOC_1, к которым подключены эти кнопки,
              в тестовом режиме ( SOFT ) заняты JTAG?
              Т.е. использовать их в режиме SOFT нет возможности?
              Спасибо

              • ArtemS ответили на это сообщение.

                Elena Здравствуйте!
                Все верно.
                Их можно использовать при программировании через приложение DCSProg-6.exe (Микросхема -> Прошить ОЗУ). После программирования таким способом вывод “ТМ” микросхемы опускается в лог. “0”, и выводы JTAG (GPIOC_0, GPIOC_1, GPIOC_2, GPIOC_3) и выводы GPIOB_0, GPIOB_1 становятся портами входа/выхода.

                В тестовом проекте Sleep_ex при переключении системной частоты с внешней HTAL на внутренний RC
                в регистр управления CMM_CTRL последовательно записываются константы 0х6, 0х7, ожидание сброса бита SWITCH в регистре статуса CMM_ST и запись в CMM_CTRL константы 0х5. Это не соответствует спецификации (версия 1.5, стр. 43). Как правильно переключать частоту?