Доброго времени суток, написал небольшую прогу, но работает както не правильно. может кто подскажет в чём ошибка.
Код:
unsigned short *Flash_ptr = (unsigned short *)0x8000;// Начальный адрес флэш-памяти
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
FCTL3 = FWKEY; // Снимаем блокирующий бит
FCTL1 = FWKEY + ERASE; // Разрешаем стирание
*Flash_ptr = 0; // Фиктивная запись для стирания флеш-сегмента
FCTL1 = FWKEY + WRT; // Установить бит WRT для операции записи
*Flash_ptr = 0x4303;// Записываем значение flash_data во флеш память с адресом Flash_ptr (nop)
*Flash_ptr++;
*Flash_ptr = 0x1300;// Записываем значение flash_data во флеш память с адресом Flash_ptr (reti)
FCTL1 = FWKEY; // Сбросить бит записи
FCTL3 = FWKEY + LOCK; // Устанавливаем бит блокировки
//__asm (" MOV.W #0x8000,R15 ");
//__asm (" CALL &R15");
$0x8000:
((void(*)() )0x8000)(); // Переход по адресу 0х8000
__no_operation();
__no_operation();
__no_operation();
__no_operation();
__no_operation();
goto $0x8000;
Во флеш записывает всё правильно (в 8000 адрес пишет команду nop, в адрес 8002 - reti), но после ((void(*)() )0x8000)() переходит на адрес 0х0000, и благополучно там висит... Что не так?
Добавлено after 46 minutes 25 seconds:Нашёл в чём дело. Выполняя команду выхода из адреса 0х8002, происходит переход на адрес 0х0000. Вобщем в адрес 0х8003 нужно записать куда переходить.
Добавлено after 33 minutes 36 seconds:Нужно было вместо команды RETI (0x1300), ввести команду RETA (0x0110). Тогда выход происходит сразу после выполнения ((void(*)() )0x8000)();