Обхожусь без трамплина (лень). Потому, естественно, без прерываний
в загрузчике (радио, uart). Вот такая вот кривоватая, но
действенная конструкция (заточено под G2553). Ну и за все время не
было никаких проблем (> 10 тыс. девайсов). void clr_flash(void)
{
char n;
unsigned char *ptrnum;
__disable_interrupt(); // на всякий пожарный...
IFG1=0; /* clear interrupt flag1 */
FCTL2=0x0A542; /* select MCLK/3 for flash timing */
ptrnum=(unsigned char *) 0xD000; // адрес прикладной области
FCTL3 = 0x0A500; /* Lock = 0 * //блокировка flash OFF */
for(n=0;n < 24;n++) // размер прикладной области 12 kb = 24 сегмента по 512 байт
{
FCTL1 = 0x0A502; /* ERASE = 1 //команда стирания */
*ptrnum=0; /* erase Flash segment */
__no_operation();
ptrnum+=0x200; // следующий 512 байт сегмент
}
ptrnum=(unsigned char *) 0x0FFFE; // запишем вектор сброса (переход на загрузчик 0xC000 )
FCTL1 = 0x0A540; /* WRT = 1 //команда записи */
*(ptrnum++)=0x00;
__no_operation();
*(ptrnum)=0xc0;
__no_operation();
FCTL3 = 0x0A518; /* Lock = 1 * //Блокировка flash ON */
}
Загрузчик находится в младших адресах flash. В этой функции стираю прикладную область flash посекторно, включая последний сектор с векторами. Сразу после этого пишу в вектор сброса адрес загрузчика. Критичная операция занимает очень малое количество времени (стирание последней страницы и запись вектора) А при загрузке пишу побайтно что угодно, включая вектора, но кроме последних 2 байт flash (вектор сброса). При окончании загрузки (и при старте в дальнейшем) проверяю КС прикладной области...
Тут же в коде тебе и "вспоминалка", как работать с flash MSP ;)