реклама на сайте
подробности

 
 
> Программирование сегмента данных F5xxx
varvar
сообщение Mar 24 2013, 08:22
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811



Не подскажете, в чем разница программирования сегментов данных F5xx и F1xx? В F1xx, как помнится, было ограничение по тактовой частоте и минимальному напряжению.
В F5xx таких ограничений не увидел, тем не менее код, по сути дела скопированный из примеров, ничего во флеш не записывает.
Частота 8 мгц (уменьшение до 1 не помогло), питание 3.3V.

Код
void BurnEeprom(void)
{
  char *Flash_ptrC;
  Flash_ptrC = (char *) 0x1880;             // Initialize info segment C ptr  
  __disable_interrupt();                    // 5xx Workaround: Disable global

  FCTL3 = FWKEY;                           // unlock info  
  FCTL1 = FWKEY+ERASE;                     // Set Erase bit  
  *Flash_ptrC = 0;                         // Dummy write to erase info seg С
  
// на всякий случай - 32ms
  for (volatile int i=0; i<10000; i++)
  {
    __no_operation();
    __no_operation();    
    __no_operation();        
  }
  
  FCTL1 = FWKEY+WRT;                       // Byte write
  for (int i=0; i<27; i++) *Flash_ptrC++ = EEPROM.RegMap[i];  
  FCTL1 = FWKEY;                            // Clear WRT bit
  FCTL3 = FWKEY+LOCK;                     //  lock info  

  __enable_interrupt();                    // 5xx Workaround
}


Где опять собака могла порыться?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Mar 24 2013, 13:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Вот фрагмент функции программирования Flash-памяти MSP430F5438A, выполняющейся из Flash. Естественно, что сегмент предварительно стирается. В функции реализована попытка ускорения записи. Вначале идет запись байтами, потом словами и завершается вновь байтовой записью потому, что запись может быть с любого адреса во Flash (в т.ч. с нечетного). Пробовал еще ускорять записью 4-байтовыми блоками, но где-то ошибся с выравниванием на границу 32бита, в виду малого лимита времени плюнул и ограничился пословной записью.
Код
  pDst = (unsigned char *)addrDst; pSrc = (unsigned char *)addrSrc;
  WDreg = WDTCTL;
  WDTCTL = WDTPW | (WDreg & 0x00FF) | WDTHOLD; //останов WDT
  SRreg = __get_interrupt_state();
  __disable_interrupt(); //запрет прерываний
  if (type == IFLSH_SECT_INFO)
  { if ((addrD >= MSP430_FLASH_INFO_A_ADDR_START)&&
        (addrD <= MSP430_FLASH_INFO_A_ADDR_END)
       )
    { if ((FCTL3 & LOCKA) != 0) FCTL3 = FWPW | LOCKA; //clear LOCKA
    }
    FCTL3 = FWPW; //clear LOCK
    FCTL4 = FWPW; //clear LOCKINFO
  }
  else
  { FCTL3 = FWPW; //clear LOCK
    FCTL4 = FWPW | LOCKINFO; //set LOCKINFO
  }
  idxD = 0; idxS = 0; cntr = size;
  //вначале выровняем запись на четный адрес
  pDst = (unsigned char *)addrDst;
  pDstW = (unsigned short *)(addrDst & (~1UL));
  FCTL1 = FWPW | WRT; //запись батовая или словом
  if ((addrDst & (~1UL)) != addrDst) //нечетный адрес?
  { pDst[idxS] = pSrc[idxS];
    idxS += 1; idxD += 1; cntr -= 1;
  }
  //теперь можно писать по 16и битному слову за раз
  while (cntr > 2)
  { type = (unsigned short)(pSrc[idxS]);
    idxS +=1;
    type |= ((unsigned short)(pSrc[idxS]))<<8;
    idxS +=1;
    pDstW[idxD] = type; //запись слова
    idxD += 1; cntr -= 2;
  }
  //завершаем запись побайтно
//  FCTL1 = FWPW | WRT;
  while (cntr > 0)
  { pDst[idxS] = pSrc[idxS];
    idxS += 1; cntr -= 1;
  }
  FCTL1 = FWPW;
  if ((FCTL3 & LOCKA) != 0) FCTL3 = FWPW | LOCK;
  else                      FCTL3 = FWPW | LOCK | LOCKA;
  FCTL4 = FWPW | LOCKINFO;
  __set_interrupt_state(SRreg);  //востановим разрещение прерываний
  WDTCTL = WDTPW | (WDreg & 0x00FF) | WDTCNTCL; //восстановим работу WDTimer

Инициализация FTG, выполняемая после включения питания.
Код
  FCTL1 = FWPW;
  if ((FCTL3 & LOCKA) != 0)
    FCTL3 = FWPW | LOCK;
  else
    FCTL3 = FWPW | LOCK | LOCKA;
  FCTL4 = FWPW | LOCKINFO;
  SFRIE1 &= ~ACCVIE;
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th August 2025 - 20:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016