Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-июн-23 19:17

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Информационная память и JTAG.
СообщениеДобавлено: 2016-янв-18 11:06 
Не в сети

Зарегистрирован: 2014-дек-22 11:21
Сообщения: 12
Здравствуйте уважаемые форумчане.
Облазил форум, но так и не нашел ответа на вопрос, имеется ли возможность программировать информационную FLASH память микроконтроллера (1986ВЕ94Т) напрямую из keil-a (программатор ULINK2) по средствам JTAG-a?
Необходимо зашивать некоторые данные, которые лежали бы отдельно от основной прошивки. Написание внутренней функции в прошивке не очень приветствуется, так как получится модифицируемое пользователем ПО, что не есть гуд. Или только с помощью программы milprog и адаптера Olimex ARM-USB-Tiny?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память и JTAG.
СообщениеДобавлено: 2016-янв-18 13:31 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 476
Штатных средств нет. ИМХО, есть вариант приделать, взяв за образец прошивальщик собственно (не-info) flash (исходники есть в каталоге Кейла), но тут встаёт вопрос "как сформировать и рассказать ему, что шить". Короче, довесок с info для milprog был не от хорошей жизни приписан :(.
Кстати, шить info умеет ещё "фитоновский" ChipРrog.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память и JTAG.
СообщениеДобавлено: 2016-янв-18 14:48 
Не в сети

Зарегистрирован: 2014-дек-22 11:21
Сообщения: 12
Спасибо за ответ, видимо так и нужно действовать, а информацию о передаче в info область можно попробовать закодировать адресом обращения,выделив под эти нужды первые 4 кБ, ведь два из них все равно аппаратно прошиты.
Пока исходник и протокол не смотрел, но в будущем видимо буду ковырять.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память и JTAG.
СообщениеДобавлено: 2016-янв-18 20:32 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 251
Цитата:
Необходимо зашивать некоторые данные, которые лежали бы отдельно от основной прошивки

Цитата:
имеется ли возможность программировать информационную FLASH память микроконтроллера (1986ВЕ94Т) напрямую из keil-a (программатор ULINK2) по средствам JTAG-a?

Так можно просто сначала зашить проект, который прошьёт инфо-память массивом данных, а потом зашить нормальный проект...

Цитата:
Написание внутренней функции в прошивке не очень приветствуется, так как получится модифицируемое пользователем ПО, что не есть гуд

Это вы ещё не калибровали АЦП в законченном устройстве, а ограничить доступ можно, просто написав функции, которые работают только с инфо-памятью (чтобы бит IFREN в регистре MDR_EEPROM->CMD всегда был равен 1). Процессор стартует всё равно с нормальной флеш, так что лазеек нет.

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память и JTAG.
СообщениеДобавлено: 2016-янв-18 21:21 
Не в сети

Зарегистрирован: 2014-дек-22 11:21
Сообщения: 12
Как раз это и планируется, калибровка узлов устройства с записью в микроконтроллер, чтобы потом военпред не смог придраться. Отдельно прошивка, отдельно настоечный файл, который он может проверить или сам сгенерировать. И никакой магии, оставив им излюбленные темы, как отпечатки на краске и подобное.

И оставлять подобные функции не желательно...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память и JTAG.
СообщениеДобавлено: 2016-янв-18 23:51 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 251
Волшебный файлик для Keil для прошивки InfoPage c помощью Keil ULink2, Segger J-Link :wink:


Вложения:
1986BE9xINFO.zip [3.93 КБ]
Скачиваний: 164

_________________
Hack the Planet!
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память и JTAG.
СообщениеДобавлено: 2016-янв-19 00:14 
Не в сети

Зарегистрирован: 2014-дек-22 11:21
Сообщения: 12
R Max, огромное спасибо !!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память и JTAG.
СообщениеДобавлено: 2016-янв-19 00:15 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 251
Это алгоритм прошивки InfoPage, который необходимо подкидывать в настройках проекта.
Открыть
Вложение:
Flash.jpg
Flash.jpg [ 71.89 КБ | Просмотров: 3150 ]
Закрыть

Оригинал для основной флеш, который я менял, лежит в установленном Keil ver 4.74 в папке C:\Keil\ARM\Flash\MDR32F9x\ и содержит два файла:
FlashDev.c - определение флеш
Открыть
Код:
/***********************************************************************/
/* This file is part of the uVision/ARM development tools              */
/* Copyright (c) 2006-2011 Keil Software. All rights reserved.         */
/***********************************************************************/
/*                                                                     */
/* FlashDev.c: Device Description for                                  */
/*             Milandr MDR32F9x Flash using Flash Boot Loader with IAP */
/*                                                                     */
/***********************************************************************/

#include "..\FlashOS.H"        // FlashOS Structures


#ifdef MDR32F9x_128                                                                    <- удалил
struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,             // Driver Version, do not modify!
   "MDR32F9x 128kB Flash",     // Device Name                                  <- меняем на 1986BE IAP 4 kB Info Flash (любое название)
   ONCHIP,                     // Device Type
   0x08000000,                 // Device Start Address
   0x00020000,                 // Device Size without Boot Loader (128kB)  <- меняем на 0x00001000 (4 kB)
   1024,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0xff,                       // Initial Content of Erased Memory
   10000,                      // Program Page Timeout 10 Sec
   30000,                      // Erase Sector Timeout 30 Sec

// Specify Size and Address of Sectors
   0x001000, 0x000000,        // Sector Size  4kB (4 Sectors)
   SECTOR_END
};
#endif                                                                                        <- удалил
Закрыть

и
FlashPrg.c - функции флеширования для программаторов ULink2, Segger J-Link, которые загружаются ими в ОЗУ микроконтроллера RAM for Algorithm (адрес 0x20000000) - описаны в разделе Контроллер Flash-памяти программ MDR_EEPROM (страница 43) спецификации
Открыть
Код:
/***********************************************************************/
/* This file is part of the uVision/ARM development tools              */
/* Copyright (c) 2006-2011 Keil Software. All rights reserved.         */
/***********************************************************************/
/*                                                                     */
/* FlashPrg.c: Flash Programming Functions adapted for                 */
/*             Milandr MDR32F9x Flash using Flash Boot Loader with IAP */
/*                                                                     */
/***********************************************************************/

#include "..\FlashOS.H"                      // FlashOS Structures

typedef volatile unsigned long    vu32;
typedef          unsigned long     u32;

#define M32(adr) (*((vu32 *) (adr)))

// Peripheral Memory Map
#define FMC_BASE            (0x40018000)     // EEPROM Control
#define CLK_BASE            (0x40020000)     // Reset and clock control
#define BKP_BASE            (0x400D8000)     // Backup control

#define FMC                 ((EEPROM_TypeDef  *) FMC_BASE)
#define CLK                 ((RST_CLK_TypeDef *) CLK_BASE)
#define BKP                 ((BKP_TypeDef     *) BKP_BASE)

#define ICER0               (*((vu32 *) 0xE000E180))

// MDR_EEPROM_TypeDef structure */
typedef struct
{
  vu32 CMD;
  vu32 ADR;
  vu32 DI;
  vu32 DO;
  vu32 KEY;
} EEPROM_TypeDef;


// MDR_RST_CLK_TypeDef structure
typedef struct
{
  vu32 CLOCK_STATUS;
  vu32 PLL_CONTROL;
  vu32 HS_CONTROL;
  vu32 CPU_CLOCK;
  vu32 USB_CLOCK;
  vu32 ADC_MCO_CLOCK;
  vu32 RTC_CLOCK;
  vu32 PER_CLOCK;
  vu32 CAN_CLOCK;
  vu32 TIM_CLOCK;
  vu32 UART_CLOCK;
  vu32 SSP_CLOCK;
} RST_CLK_TypeDef;


// MDR_BKP_TypeDef structure
typedef struct {
  vu32 REG[16];                              // REG[15] controls oscillators
  vu32 RTC_CNT;
  vu32 RTC_DIV;
  vu32 RTC_PRL;
  vu32 RTC_ALRM;
  vu32 RTC_CS;
} BKP_TypeDef;

// BKP REG_0F Register definitions
#define BKP_HSI_ON       (1UL << 22)        // HSI_CONTROL
#define BKP_HSI_RDY      (1UL << 23)        // HSI_STATUS

// Flash Key Register definitions
#define FL_KEY            0x8AAA5551

// Flash Control Register definitions
#define FL_CON            0x00000001
#define FL_WR             0x00000002
#define FL_RD             0x00000004
#define FL_DELAY0         0x00000008
#define FL_DELAY1         0x00000010
#define FL_DELAY2         0x00000020
#define FL_XE             0x00000040
#define FL_YE             0x00000080
#define FL_SE             0x00000100
#define FL_IFREN          0x00000200
#define FL_ERASE          0x00000400
#define FL_MAS1           0x00000800
#define FL_PROG           0x00001000
#define FL_NVSTR          0x00002000

#define STACK_SIZE         64                // Stack Size

/*
*  Program delay.
*    Parameter:      num: Number of the loops.
*    Return Value:   None.
*/
 
static void Delay(unsigned long num) {
  volatile unsigned long i = num*8;

  for (; i > 0; i--) __nop();
}


/*
*  Initialize Flash Programming Functions
*    Parameter:      adr:  Device Base Address
*                    clk:  Clock Frequency (Hz)
*                    fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)
*    Return Value:   0 - OK,  1 - Failed
*/

int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {

  CLK->PER_CLOCK = 0xFFFFFFFF;                   /* Enable all              */
  ICER0          = 0xFFFFFFFF;                   /* Disable all interrupts  */

  BKP->REG[15]  = BKP_HSI_ON;
  while (!(BKP->REG[15] & BKP_HSI_RDY)) {}       /* Wait Ready from HSI     */

  CLK->CPU_CLOCK = 0x00000000;                   /* CPU_CLOCK from HSI      */
  Delay(10);
                                                                        <- вставил сюда FMC->CMD |=  (FL_IFREN); // переключение с основной флеш на информационную
  return (0);                                    /* Finished without Errors */
}


/*
*  De-Initialize Flash Programming Functions
*    Parameter:      fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)
*    Return Value:   0 - OK,  1 - Failed
*/

int UnInit (unsigned long fnc) {

  CLK->PER_CLOCK = 0xFFFFFFFF;
  FMC->CMD       = 0x0;

  return (0);                                    /* Finished without Errors */
}


/*
*  Erase complete Flash Memory
*    Return Value:   0 - OK,  1 - Failed
*/

int EraseChip (void) {
  int i;

  FMC->CMD |=  (FL_CON);
  FMC->KEY  =  (FL_KEY);

  for (i = 0; i < 4; i++) {
    FMC->ADR = i*4;
    FMC->DI  = 0;

    FMC->CMD |=  (FL_WR);
    FMC->CMD &= ~(FL_WR);
    FMC->CMD |=  (FL_XE | FL_MAS1 | FL_ERASE); 
    Delay(5);                                    /* Wait for   5 us         */
    FMC->CMD |=  (FL_NVSTR);
    Delay(40000);                                /* Wait for  40 ms         */
    FMC->CMD &= ~(FL_ERASE);
    Delay(100);                                  /* Wait for 100 us         */
    FMC->CMD &= ~(FL_NVSTR | FL_XE | FL_MAS1);
  }

  FMC->CMD &= ~(FL_CON);
  FMC->KEY  =   0;   
  Delay(1);                                      /* Wait for 1 us */ 

  return (0);                                    /* Finished without Errors */
}


/*
*  Erase Sector in Flash Memory
*    Parameter:      adr:  Sector Address
*    Return Value:   0 - OK,  1 - Failed
*/

int EraseSector (unsigned long adr) {
  int i;

  FMC->CMD |=  (FL_CON);
  FMC->KEY  =  (FL_KEY);
  FMC->DI   =   0;

  for (i = 0; i < 4; i++) {
    FMC->ADR = adr + i*4;

    FMC->CMD |=  (FL_XE | FL_ERASE);
    Delay(5);                                    /* Wait for   5 us         */
    FMC->CMD |=  (FL_NVSTR);
    Delay(200);                                  /* Wait for 200 us         */
    FMC->CMD &= ~(FL_ERASE);
    Delay(100);                                  /* Wait for 100 us         */
    FMC->CMD &= ~(FL_NVSTR | FL_XE );
  }

  FMC->CMD &= ~(FL_CON);
  FMC->KEY  =   0;   
  Delay(1);                                      /* Wait for 1 us */ 

  return (0);                                    /* Finished without Errors */
}


/*
*  Program Page in Flash Memory
*    Parameter:      adr:  Page Start Address
*                    sz:   Page Size
*                    buf:  Page Data
*    Return Value:   0 - OK,  1 - Failed
*/

int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

  sz = (sz + 3) & ~3;                            /* Adjust size for Words   */

  FMC->KEY  =  (FL_KEY);
  FMC->CMD |=  (FL_CON);

  while (sz) {
    FMC->ADR  = adr;
    Delay(10);                                   /* Wait for  10 us         */
    FMC->CMD |=  (FL_PROG | FL_XE);
    Delay(5);                                    /* Wait for   5 us         */
    FMC->CMD |=  (FL_NVSTR);
    FMC->DI   =  *((u32 *)buf);
    FMC->CMD |=  (FL_WR);
    FMC->CMD &= ~(FL_WR);
    Delay(15);                                   /* Wait for  15 us         */
    FMC->CMD |=  (FL_YE);
    Delay(50);                                   /* Wait for  50 us         */
    FMC->CMD &= ~(FL_YE);
    FMC->CMD &= ~(FL_PROG);
    Delay(5);                                    /* Wait for   5 us         */
    FMC->CMD &= ~(FL_NVSTR | FL_XE);
    Delay(5);                                    /* Wait for   5 us         */

    adr += 4;                                    /* Go to next Word         */
    buf += 4;
    sz  -= 4;
  }

  FMC->CMD &= ~(FL_CON);
  FMC->KEY  =   0;
  Delay(1);                                      /* Wait for 1 us */ 

  return (0);                                    /* Finished without Errors */
}
Закрыть


здесь не хватает Verify, поэтому верификация пока не работает.

Но это всё ерунда, потому что основная проблема это флеширование проекта с помощью .hex файла данных http://www.keil.com/support/man/docs/uv ... wnload.htm.

Сырые данные (.bin-файлы с кодами/данными) программаторы не понимают, так как им нужны адреса загрузки объектных модулей, которые указываются в HEX-последовательностях http://www.keil.com/support/docs/1584/ иначе получите ошибку 59 http://www.keil.com/support/docs/3692.htm
Another possible reason: µVision can't load .BIN files. Only ELF, AXF or HEX files.

Всё это уже проходили... писал в своё время патчер, который подшивал данные калибровки из текстового файла в определённую область .hex-файла основной прошивки по зарезервированному адресу основной флеш (информационную можно и не трогать в принципе) с пересчётом контрольной суммы (CRC) HEX-строки, а модифицированная прошивка зашивалась в микроконтроллер.

Если хочется развлекухи :mrgreen: :roll: :wink: , то можно написать СRC-калькулятор и HEX-генератор загрузочного кода (по сути мини-компилятор), создаваемого по массиву калибровочных данных и шить полученный код в инфо флеш, задействовать закладки пользовательских программ http://www.keil.com/support/man/docs/uv ... g_user.htm.

Но практический вариант заключается в следующем:

есть некоторое автоматизированное устройство/компьютер, подающее эталонные напряжения на микроконтроллер и дающее команды на запись актуальных значений напряжений, при этом флеш-функции лежат в основной прошивке и шьют только инфо-флеш, причём защита от дурака содержится в самом же этом коде - ну не может он прошить другие области памяти (тем более в Cortex M3 можно задействовать MPU-блок). Плюс данного решения также в ускорении и автоматизации процедуры калибровки.

ВП можете показать сей опус! :D :mrgreen:

P.S.
Цитата:
И никакой магии, оставив им излюбленные темы, как отпечатки на краске и подобное.


Магии нет, есть только Искусство схемотехники, тьфу и программирования тоже... :mrgreen: :mrgreen: :mrgreen: а также https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B3 и не забудьте фичу - FullChipErase для инфо-флеш стирает также полностью основную флеш...

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память и JTAG.
СообщениеДобавлено: 2016-янв-19 09:09 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 476
Цитата:
Но практический вариант заключается в следующем:
есть некоторое автоматизированное устройство/компьютер, подающее эталонные напряжения на микроконтроллер и дающее команды на запись актуальных значений напряжений, при этом флеш-функции лежат в основной прошивке и шьют только инфо-флеш, причём защита от дурака содержится в самом же этом коде - ну не может он прошить другие области памяти (тем более в Cortex M3 можно задействовать MPU-блок). Плюс данного решения также в ускорении и автоматизации процедуры калибровки.

Согласен на все 100500, собственно сами так и делаем. На прибор при настройке ставится калибровочная заглушка и он сам себя калибрует. При сдаче проверяются точностные параметры.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память и JTAG.
СообщениеДобавлено: 2016-фев-07 00:53 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 251
Ещё читал вот такую весчь в документике http://www.keil.com/product/brochures/rl-arm_gs.pdf - 3 абзац - типо два .hex в своих регионах - MAC-адрес контроллера прожигается отдельно от основной флеш. Пример к статье (Split hex files) здесь http://www.keil.com/download/docs/403.asp

Открыть
Вложение:
rl-arm_gs_Страница_108.jpg
rl-arm_gs_Страница_108.jpg [ 404.17 КБ | Просмотров: 3054 ]
Закрыть

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память и JTAG.
СообщениеДобавлено: 2016-фев-07 01:40 
Не в сети

Зарегистрирован: 2014-дек-22 11:21
Сообщения: 12
Спасибо Всем за материал и подсказки, сейчас дела обстоят на уровне проработки функциональной структуры устройства. До тестов на железе руки не дошли, если будет решение, то сообщу.

К сожалению военпреду все равно на все слова и доводы, кроме тех, что записаны на бумаге,а при условии узости их кругозора становится вообще все печально (если будешь не той рукой на кнопку жать, то банан тебе в зачетку). Требования предъявляются конкретные, наша задача их исполнить.

Как вариант рассматривается возможность загрузки/просмотра данных по средствам CAN интерфейса. Но тут есть свои не технические нюансы.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB