Jump to content

    
Sign in to follow this  
ELEKTROS

Непонятка с прошивкой TMS320f28335

Recommended Posts

1) При построении проекта в CCS поставил генерацию *.hex файла прошивки.

2) До какого то момента (пока проект не стал большим) *.hex файл прошивал сторонним загрузчиком C2Prog.

3) После того как проект стал больше (насколько незнаю не уловил этот момент) *.hex файл зашивается в контроллер, но контроллер после сброса запускать программу отказывается. (пробывал отмечать все 8-мь секторов памяти в ручную для прошивки)

4) Запуская прошивальшик UniFlash подсовывая ему файл прошивки но в формате *.out всё прошивается и контроллер нормально запускается после сброса.

 

Кто нибудь сталкивался с такой проблемой? Может в C2prog есть ограничение в бесплатной версии на размер прошиваемого файла или hex в CCS не всегда корректно компилируетcя?

Share this post


Link to post
Share on other sites
2) До какого то момента (пока проект не стал большим) *.hex файл прошивал сторонним загрузчиком C2Prog.

А сколько раз? ЧТо там с количеством перезаписей FLASH?

upd: посмотрел - теперь десятки тысяч циклов... не оно.

Edited by Genadi Zawidowski

Share this post


Link to post
Share on other sites

Flash не затёрта если вы об этом. Вопрос в другом совсем: C2prog что то не дошивает, либо hex неправильно скомпиленный, хотя hex нормально компилиться с меньших проектов и зашивается. Проблема чисто програмная, но вот в каком месте?

Edited by ELEKTROS

Share this post


Link to post
Share on other sites
1) При построении проекта в CCS поставил генерацию *.hex файла прошивки.

2) До какого то момента (пока проект не стал большим) *.hex файл прошивал сторонним загрузчиком C2Prog.

3) После того как проект стал больше (насколько незнаю не уловил этот момент) *.hex файл зашивается в контроллер, но контроллер после сброса запускать программу отказывается. (пробывал отмечать все 8-мь секторов памяти в ручную для прошивки)

4) Запуская прошивальшик UniFlash подсовывая ему файл прошивки но в формате *.out всё прошивается и контроллер нормально запускается после сброса.

 

Кто нибудь сталкивался с такой проблемой? Может в C2prog есть ограничение в бесплатной версии на размер прошиваемого файла или hex в CCS не всегда корректно компилируетcя?

Аоходе что у вас явно не корректно сгенерёный хекс.

 

Попробуйте в настройках проекта указать, в секции C2000 Hex Utility -> Output format options - установите выдавать бинарик, и его заливайте в камень

 

Более того, через hex2000.exe вы можете сконвертить свой *.out вручную во что угодно, что-то подобное обсуждалось в моей теме: http://electronix.ru/forum/index.php?showt...p;#entry1255227

там всё просто - чтото вроде

hex2000.exe -boot -b -can8 -pllcr=10 -divsel=2 ../Debug/28335_test.out

 

В принципе формат бинарика и хекса очень простые, можно спокойно написать свой конвертер bin-to-hex. Но есть уже готовый в составе CCS, так что попробуйте использовать готовый.

Share this post


Link to post
Share on other sites

PrSt, т.е. вы считаете что CCS неправильно генерирует hex файл, правильно я понял? Зачем мне bin to hex, если я получаю сразу hex при соответствующей настройке проекта?

Бинарник я залить с помощью C2prog не могу, там только hex.

Share this post


Link to post
Share on other sites
PrSt, т.е. вы считаете что CCS неправильно генерирует hex файл, правильно я понял? Зачем мне bin to hex, если я получаю сразу hex при соответствующей настройке проекта?

Бинарник я залить с помощью C2prog не могу, там только hex.

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

Я предложил альтернативный метод, а уж пробовать его или нет, это вы сами вольны. )

 

А почему вы не прошиваете при помощи CCS?

Share this post


Link to post
Share on other sites

Да дело в том что там всего один комбобокс выбрать надо чтобы hex генерился, вот и думаю может есть еще какие настройки, которых я не вижу в CCS v5 (если проблема в этой части конечно).

 

Прошить могу и с помощью Uniflash, который кстати встроен в CCS, но допустим я хочу чтобы какой нибудь техник-программист мог прошивать контроллеры без моего участия или обновлять софт при необходимости, не разворачивать же ему на ноуте всю среду с проектами чтобы это делать, а C2prog проще некуда, чтобы ему это сделать. Конечно в этом случае самый оптимальный вариант написать свой загрузчик по какому нибудь интерфейсу, но особого времени на это нету, да и проблема остро не стоит, а готового нету тоже (такого чтобы можно было прикрутить к своему проекту без особого гемороя).

Share this post


Link to post
Share on other sites

Вот два файла *.out и *.hex. Сгенерированные из одного проекта, но hex толи не так зашивается, толи неправильно сгенерирован. Кто проверит может соответствие.

pack.zip

 

Share this post


Link to post
Share on other sites

выяснил наконец-то, что hex генерируется неправильно, но почему понять не могу, там настроек то и нету для этого, чтобы что то было не так.

Share this post


Link to post
Share on other sites

Ошибаетесь, настроек там очень и очень много.

 

Описание формата можно прочесть в файлике spru513 (TMS320C28x Assembly Language Tools) раздел Hex Conversion Utility Description.

 

Настроить лучше всего через *.cmd файл, например так:

qrfkW.png hm5jN.png

 

Примеры можно глянуть в controlSUITE для контроллеров с USB, f2806x например, проект bl_app.

 

 

А в CCS6 появился отдельный раздел в меню, для генерации этого Hex файла, те же ключи и адреса, только в другом оформлении:

 

WxHOG.png

Share this post


Link to post
Share on other sites

Ну так combobox как на первой картинке (Create flash image: Intel-HEX) выбираю и всё остальное пишеться автоматом.

 

В частности в командная строка заполняется:

"${CG_TOOL_HEX}" -i "${BuildArtifactFileName}" -o "${BuildArtifactFileBaseName}.hex" -order MS -romwidth 16

 

А в вашем cmd смотрю есть еще какие границы во flash использовать. Как вариант возможно используется где-то cmd по умолчанию и в нём эти границы прописаны не все (это подтвердило бы почему на некоторых проектах не сильно больших hex генерируется правильно у меня).

 

Спасибо за наводку, теперь хоть есть направление куда копать.

Share this post


Link to post
Share on other sites

Turnaev Sergey, если у меня линкер почти стандартный допустим:

 

MEMORY
{
PAGE 0 :   /* Program Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
   RAML0       : origin = 0x008000, length = 0x000800     /* on-chip RAM block L0 */
   RAML1       : origin = 0x008800, length = 0x000400     /* on-chip RAM block L1 */
   OTP         : origin = 0x3D7800, length = 0x000400     /* on-chip OTP */

   FLASHH      : origin = 0x3D8000, length = 0x004000     /* on-chip FLASH */
   FLASHG      : origin = 0x3DC000, length = 0x004000     /* on-chip FLASH */
   FLASHF      : origin = 0x3E0000, length = 0x004000     /* on-chip FLASH */
   FLASHE      : origin = 0x3E4000, length = 0x004000     /* on-chip FLASH */   
   FLASHD      : origin = 0x3E8000, length = 0x004000     /* on-chip FLASH */
   FLASHC      : origin = 0x3EC000, length = 0x004000     /* on-chip FLASH */
   FLASHA      : origin = 0x3F4000, length = 0x003F80     /* on-chip FLASH */
   CSM_RSVD    : origin = 0x3F7F80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */
   BEGIN       : origin = 0x3F7FF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */
   CSM_PWL_P0  : origin = 0x3F7FF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */

   FPUTABLES   : origin = 0x3FD860, length = 0x0006A0      /* FPU Tables in Boot ROM */
   IQTABLES    : origin = 0x3FDF00, length = 0x000B50     /* IQ Math Tables in Boot ROM */
   IQTABLES2   : origin = 0x3FEA50, length = 0x00008C     /* IQ Math Tables in Boot ROM */
   IQTABLES3   : origin = 0x3FEADC, length = 0x0000AA      /* IQ Math Tables in Boot ROM */

   ROM         : origin = 0x3FF3B0, length = 0x000C10     /* Boot ROM */
   RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */
   VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */

PAGE 1 :   /* Data Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
           /* Registers remain on PAGE1                                                  */

   BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */
   RAMM0       : origin = 0x000050, length = 0x0003B0     /* on-chip RAM block M0 */
   RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
   RAML2       : origin = 0x008C00, length = 0x000400     /* on-chip RAM block L2 */
   RAML3       : origin = 0x009000, length = 0x001000      /* on-chip RAM block L3 */
   RAML4       : origin = 0x00A000, length = 0x002000     /* on-chip RAM block L4 */
   RAML5       : origin = 0x00C000, length = 0x002000     /* on-chip RAM block L5 */
   RAML6       : origin = 0x00E000, length = 0x002000     /* on-chip RAM block L6 */
   RAML7       : origin = 0x010000, length = 0x002000     /* on-chip RAM block L7 */
   RAML8       : origin = 0x012000, length = 0x002000     /* on-chip RAM block L8 */
   USB_RAM     : origin = 0x040000, length = 0x000800     /* USB RAM          */   
   FLASHB      : origin = 0x3F0000, length = 0x004000     /* on-chip FLASH */     
}

SECTIONS
{

   /* Allocate program areas: */
   .cinit              : > FLASHA,     PAGE = 0
   .pinit              : > FLASHA,     PAGE = 0
   .text               : > FLASHB,     PAGE = 1
   codestart           : > BEGIN,      PAGE = 0
................................................................................

}

Конфигурация командного файла для генерации hex:

card.out
--intel
--image
--map=card.mxp
--order=MS
--romwidth=16
--memwidth=16
--fill=0xFFFF

ROMS
{
    APP_FLASH1 : origin = 0x300000, length = 0x40000, files = { card_new.hex }
}

И при компиляции hex секция .text:

warning: section card.out(.text) at "адрес секции" falls in unconfigured

memory (skipped), т.е. секция пропущена,

а если перенести FLASHB в PAGE0 или назначить секцию .text в разделе FLASH объявленном в PAGE0, то всё нормально компилисься без предупреждений при генерации hex.

Сталкивались с таким?

 

Share this post


Link to post
Share on other sites

.text это область размещения исполняемого кода и констант, она должна быть размещена в PAGE 0. PAGE 1 - это память данных.

 

FLASHB из PAGE 1 используется например для хранения перезаписываемых данных. В качестве этой памяти может быть любая другая секция, а может и вовсе отсутствовать.

 

С варнингами такими сталкивался, для их устранения надо объявить что-нибудь в этой области памяти, у меня например обычно такой варнинг висит:

warning: section _MyProject.out(csm_rsvd) at 03f7f80h falls in unconfigured memory (skipped)

Говорит о том что в памяти для защитного ключа ничего не объявлено, поэтому там будут 0xFFFF, что меня пока устраивает.

 

APP_FLASH1 в вашем случае должно быть именем секции FLASHA.

 

У меня эти два файла сделаны следующим образом:

 

/*
* TMS320F28069U
* Файл распределения памяти
*/


/* Объявляем требуемую для компилятора CLA память и точки входа */
CLA_SCRATCHPAD_SIZE = 0x100;
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start


MEMORY
{
PAGE 0 :   /* Program Memory */
OTP		 : origin = 0x3D7800, length = 0x000400	 /* on-chip OTP */

RAMFUNCS	: origin = 0x00A000, length = 0x004000	 /* Память программ в ОЗУ L4-L5 */

CLAPROG	 : origin = 0x009000, length = 0x001000	  /* Память программ CLA L3 */

BL_FH	 	: origin = 0x3D8000, length = 0x004000	 /* Память для бутлоадера FLASHH */

FLASHG	  : origin = 0x3DC000, length = 0x004000	 /* можно использовать. используется бутлоадером в безопасном режиме FLASH */

PROGFLASH   : origin = 0x3E4000, length = 0x013F80	 /* ПЗУ программ FLASHA-E */

CSM_RSVD	: origin = 0x3F7F80, length = 0x000076	 /* Program with all 0x0000 when CSM is in use. */
BEGIN	   : origin = 0x3F7FF6, length = 0x000002	 /* Used for "boot to Flash" bootloader mode. */
CSM_PWL	 : origin = 0x3F7FF8, length = 0x000008	 /* CSM password locations in FLASH */

FPUTABLES   : origin = 0x3FD860, length = 0x0006A0	 /* FPU Tables in Boot ROM */
IQTABLES	: origin = 0x3FDF00, length = 0x000B50	 /* IQ Math Tables in Boot ROM */
IQTABLES2   : origin = 0x3FEA50, length = 0x00008C	 /* IQ Math Tables in Boot ROM */
IQTABLES3   : origin = 0x3FEADC, length = 0x0000AA	   /* IQ Math Tables in Boot ROM */

ROM		 : origin = 0x3FF3B0, length = 0x000C10	 /* Boot ROM */
RESET	   : origin = 0x3FFFC0, length = 0x000002	 /* part of boot ROM  */
VECTORS	 : origin = 0x3FFFC2, length = 0x00003E	 /* part of boot ROM  */

PAGE 1 :   /* Data Memory */

M01SARAM	: origin = 0x000000, length = 0x000800	 /* Память стека M0, M1 */
CLADATA	 : origin = 0x008000, length = 0x001000	 /* Память данных CLA L0, L1, L2 */
RAMDATADMA  : origin = 0x00E000, length = 0x006000	 /* Общая память данных, адресуемая через DMA L6-L8 */
PIEVECT	 : origin = 0x000D00, length = 0x000100

FLASH_DATA  : origin = 0x3E0000, length = 0x004000	 /* Память данных для хранения настроек FLASHF */

CLA_CPU_MSGRAM  : origin = 0x001480, length = 0x000080 /* CLA-R/W, CPU-R message RAM */
CPU_CLA_MSGRAM  : origin = 0x001500, length = 0x000080 /* CPU-R/W, CLA-R message RAM */
USB_RAM	 : origin = 0x040000, length = 0x000800	 /* USB RAM		  */
}

/*
*  Allocate sections to memory blocks.
*  Note:
*	  codestart   user defined section in DSP28_CodeStartBranch.asm
*				  used to redirect code execution when booting to flash
*
*	  ramfuncs	user defined section to store functions that will be
*				  copied from Flash into RAM
*/ 

SECTIONS
{
  bl_table			: > 0x3D8000,   PAGE = 0, type = DSECT
  app_table		   : > 0x3F4000,   PAGE = 0

  ramfuncs			: LOAD = PROGFLASH,
					 RUN = RAMFUNCS,
					 LOAD_START(_RamfuncsLoadStart),
					 LOAD_SIZE(_RamfuncsLoadSize),
					 LOAD_END(_RamfuncsLoadEnd),
					 RUN_START(_RamfuncsRunStart),
					 crc_table(_CRCTestVector),
					 PAGE = 0
					 {
					 	-l rts2800_fpu32_fast_supplement.lib(.text)
					 	-l c28x_vcu0_library_fpu32.lib(.text)
					 	-l c28x_fpu_dsp_library.lib(.text)
					 	-l DLC.lib<DLC_runPI.obj>(.text) /* Библиотека содержит функции для CLA, если они нужны, то надо её линковать по объектам */
					 }



  /* Allocate program areas: */
  GROUP			   : > PROGFLASH,	 PAGE = 0, crc_table(_CRCTestVector)
  {
   .cinit
   .pinit
   codestart
   .text
   /* Initalized sections to go in Flash */
   /* For SDFlash to program these, they must be allocated to page 0 */
   .econst
   .switch
  }

  DataFlash		 : > FLASH_DATA  PAGE = 1

  .TI.crctab		 : > PROGFLASH

csmpasswds		  : > CSM_PWL	 PAGE = 0
csm_rsvd			: > CSM_RSVD	PAGE = 0

/* Allocate uninitalized data sections: */
.stack			  : > M01SARAM		PAGE = 1
.ebss			   : > RAMDATADMA	  PAGE = 1
.esysmem			: > RAMDATADMA	  PAGE = 1
.cio				: > RAMDATADMA	  PAGE = 1

/* Initalized sections go in Flash */
/* For SDFlash to program these, they must be allocated to page 0 */
.args			   : > PROGFLASH	   PAGE = 0


  CLAmathTables		: > CLADATA,		PAGE = 1
  CLA1mathTables		: > CLADATA,		PAGE = 1

  Cla1Prog			  :  LOAD = PROGFLASH,
					 RUN = CLAPROG,
					 LOAD_START(_Cla1funcsLoadStart),
					 LOAD_END(_Cla1funcsLoadEnd),
					 RUN_START(_Cla1funcsRunStart),
					 PAGE = 0
					 {
					 	-l cla0_math_library_fpu32.lib(.text)
					 	-l DLC.lib<DLC_runPIc.obj>(.text) 
				 	 }

  ClaToCpuMsgRAM	 	: > CLA_CPU_MSGRAM, PAGE = 1
  CpuToClaMsgRAM	 	: > CPU_CLA_MSGRAM, PAGE = 1
  ClaDataRam		   	: > CLADATA,		PAGE = 1

  .bss_cla			 : > CLADATA,		PAGE = 1
  .const_cla		   : > PROGFLASH,	  PAGE = 0

  CLAmathTables:		 LOAD = PROGFLASH,
					 RUN = CLADATA,
					 LOAD_START(_Cla1mathTablesLoadStart),
					 LOAD_END(_Cla1mathTablesLoadEnd),
					 RUN_START(_Cla1mathTablesRunStart),
					 LOAD_SIZE(_Cla1mathTablesLoadSize),
					 PAGE = 1

  CLAscratch		  :
					 { *.obj(CLAscratch)
					 . += CLA_SCRATCHPAD_SIZE;
					 *.obj(CLAscratch_end) } > CLADATA,
					 PAGE = 1

/* Allocate IQ math areas: */
IQmath			  : > PROGFLASH   PAGE = 0			/* Math Code */
IQmathTables		: > IQTABLES	PAGE = 0, TYPE = NOLOAD

/* Allocate FPU math areas: */
FPUmathTables	   : > FPUTABLES   PAGE = 0, TYPE = NOLOAD
}

 

Файл настройки создания HEX файла:

_MyProject.out
--intel
--image
--order=MS
--romwidth=16
--memwidth=16
--fill=0xFFFF



ROMS
{
    PROGFLASH : origin = 0x3E4000, length = 0x13F80, files = { _MyProject.hex }

}

 

Использование секции ПЗУ данных в коде выглядит примерно так:

#pragma DATA_SECTION(SettingsInFlash,"DataFlash");
s_SettingsInFlash SettingsInFlash;

Share this post


Link to post
Share on other sites

У меня есть своя секция, она с константами, обьявлена на PAGE0 во FLASHH, при трансляции в hex всё нормально, теперь переношу FLASHH на PAGE1 и всё, пишет такое же предупреждение, но она же не пустая, может нужно что то дополнительно прописать в командном файле для трансляции в hex c PAGE1? А APP_FLASH1 задал специально большой, чтобы покрыло все сектора FLASH, потому что используется А, B, D, E, H, и чтобы не писать несколько строк вообщем-то.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this