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

 
 
> MSP430F5438A запись в INFO-D без стирания, Возможна ли запись байта без стирания сегмента
k155la3
сообщение Jun 7 2017, 13:37
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



MSP430F5438A
Работа с INFO-D флеш сегментом.
Задача - в заполненном иноформацией INFO-D поверх незаписанных байт по фиксированным адресам (содержащим == 0xFF )
прописать несколько байт данных. (не стирая данные по остальным адресам сегмента)

Примеры Ti представлены все со стиранием сегмента.

(?) При выполнении этой ф-ии тестовые байты пишутся, но и сегмент при этом стирается.
Допустим ли в принципе такой режим (не в формате ERASE+WRITE, а только WRITE) ?

Ф-ия выполняется из флеш-памяти.

Код
#define FLASH_BUSY 0x0001
#define FLASH_LOCK 0x0010
void INF_Lock( void )
{
    Flash_ptr = (char *) 0x1800; // INFO-D

    __disable_interrupt();

    FCTL3 = FWKEY;                            // Clear Lock bit
    FCTL1 = FWKEY + WRT;                         // Enable byte/word write mode

    //while ( (FCTL3 & FLASH_BUSY ) != 0 );     // test busy - для RAM
    *Flash_ptr = 0xAB;

     Flash_ptr++;

     //while ( (FCTL3 & FLASH_BUSY ) != 0 );     // test busy
     *Flash_ptr = 0xCD;

     FCTL1 = FWKEY;                                 // Clear WRT bit
     FCTL3 = FWKEY + FLASH_LOCK;           // Set LOCK bit

    __enable_interrupt();

    return;
}




Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
k155la3
сообщение Jun 8 2017, 10:40
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Взял пример от Ti без изменений (там где прописывается INFO-C инкриментом, и копируется INFO-C -> INFO-D) - но все равно не работает.
Гипотезы пока следующие:
- убил процессор (F5438A, rev.F)
- непонятная работа компилятора-отладчика.

Характерный симтом:
После прохода программы и остановки ее в BP на завершающем while(1) (как советует Ti в комментарии)
1. невозможно по Debug->Reset выйти в начало main().
После этого:
2. выхожу из режима Debug, отключаю (проводом) программатор, снимаю питание (и закорачиваю линии питания) с платы F5438A.
Включаю все "обратно".
3. Компилирую проет через "Clean". Загружаю в F5438A.
(Грузится. Стартовая зеленая полоска - на первом операторе main() )
4. Стартуем F5.
Нет останова на последнем холостом while() на BP.
Выполняю Debug->Break. Останов есть, и как раз на __no_operation() на котором стоит BP в while(1).
5. Смотрим View->Memory Info-C Info-D
В Info-C - пусто (0xFF) , хотя дожно быть значение инкримента.
В Info-D - какаято мешанина из частично правильных значений (инкримент=номеру байта в сегменте) .
"Мешанина" имеет регулярную повторяющуюся структуру "b2 40 40 A5".
-------------------

В общем,
A: попробуем поменять процессор. И компилятор.
B: while(1) { slau208, slaz290, slaa470 } sm.gif

=========================== NextStep ============================
После стирания процессора утилитой от Elprotronic - пример от Ti работает и отлаживается по BP
без глюков. Сравнение обратно-слитой "глючной" прошивки и ново-залитой после стирания Elprotronic - отличия в CODE нет.
различаются только INFO сегменты (что и дожнобыть)



========================= NextStep ======================

Проверил работу с записью "поверх", без стирания - на базе примера от Ti. Все работает.

Поскольку глюк наблюдался при отладке в составе рабочего проекта, то скорее всего причина в этом.
Там в частности, используется DMA. Но факт в том, что после "влета" процессора в этот сбойный-непонятный режим,
не идут нормально даже отсаженные в отдельный проект примеры от Ti.


Сообщение отредактировал k155la3 - Jun 8 2017, 10:22
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 13:16
Рейтинг@Mail.ru


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