|
IAR для MSP430, удобная работа с флешью |
|
|
|
 |
Ответов
|
Nov 20 2011, 11:00
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(dxp @ Nov 20 2011, 12:33)  Что это за константа такая, что может меняться в программе. Тогда это не константа. неправильно выразился... переменная конечно) нашёл заветный код: CODE struct info_mem_s { union { struct nv_parms_s s; int8_t x[128]; } seg_a;
struct nv_parms_s { int16_t variable; }
void flash_write_int16(int16_t *ptr, int16_t value) { _DINT(); FCTL3 = FWKEY; /* Lock = 0 */ FCTL1 = FWKEY | WRT; *((int16_t *) ptr) = value; /* Program the flash */ }
затем пишу во флешь так в функции main(): CODE flash_write_int16((int *) &(nv_parms.seg_a.s.variable), (int16_t)1000);
я думаю вопрос с записью решён. Как теперь можно прочитать эту переменную из флеши?
Сообщение отредактировал Zelepuk - Nov 20 2011, 18:13
|
|
|
|
|
Nov 20 2011, 19:46
|
Участник

Группа: Участник
Сообщений: 54
Регистрация: 25-09-07
Пользователь №: 30 836

|
Цитата(Zelepuk @ Nov 20 2011, 15:00)  flash_write_int16((int *) &(nv_parms.seg_a.s.variable), (int16_t)1000);
я думаю вопрос с записью решён.
Как теперь можно прочитать эту переменную из флеши? Прочитать-то просто: int x = nv_parms.seg_a.s.variable; Но Вы, кажется, не понимаете, как работает флеш. Записать значение по любому адресу в ней можно без проблем, но только один раз и в чистую (все биты равны единице). При попытке повторной записи туда же другого значения старое не затрется - те биты, что были ранее сброшены в ноль, так и останутся. Нужно снова проинициализировать (стереть) память перед записью нового значения, а сделать это можно только со всей страницей целиком, а не с отдельным байтом.
Сообщение отредактировал =DS= - Nov 20 2011, 19:59
|
|
|
|
|
Nov 21 2011, 13:11
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(=DS= @ Nov 20 2011, 22:46)  Прочитать-то просто: int x = nv_parms.seg_a.s.variable; Но Вы, кажется, не понимаете, как работает флеш. Записать значение по любому адресу в ней можно без проблем, но только один раз и в чистую (все биты равны единице). При попытке повторной записи туда же другого значения старое не затрется - те биты, что были ранее сброшены в ноль, так и останутся. Нужно снова проинициализировать (стереть) память перед записью нового значения, а сделать это можно только со всей страницей целиком, а не с отдельным байтом. пытаюсь после манипуляций описаных выше (в частности flash_write_int16()) прочитать записанное значение int x = nv_parms.seg_a.s.variable; вывожу 'x' на дисплей: нули(( P.S. дисплей выводит правильно
|
|
|
|
Сообщений в этой теме
Zelepuk IAR для MSP430 Nov 19 2011, 10:11 SSerge Чтобы изменить содержимое флэши нужно скопировать ... Nov 19 2011, 12:15 KARLSON Вы можете сделать переменную во флеш по любому адр... Nov 19 2011, 15:51 Zelepuk спасибо, но как же быть тогда?
може тогда перед пе... Nov 21 2011, 06:18 =DS= Цитата(Zelepuk @ Nov 21 2011, 10:18) може... Nov 21 2011, 10:48 Zelepuk нашёл интересный код по теме поста:
CODE// ******... Nov 21 2011, 11:32 =DS= А что тут комментировать? Стандартная процедура, о... Nov 21 2011, 12:22  Zelepuk Цитата(=DS= @ Nov 21 2011, 15:22) А что т... Nov 22 2011, 20:35   =DS= Цитата(Zelepuk @ Nov 23 2011, 00:35) -при... Nov 23 2011, 00:53    Zelepuk Цитата(=DS= @ Nov 23 2011, 03:53) Не так ... Nov 23 2011, 05:58     Дмитрий К. QUOTE (Zelepuk @ Nov 23 2011, 08:58) можн... Nov 23 2011, 07:11 Zelepuk спасибо за ответы, я разбираю код для MSP430
так в... Nov 21 2011, 12:31 MrYuran Цитата(Zelepuk @ Nov 21 2011, 16:31) не с... Nov 21 2011, 13:01 =DS= CODE#define __infomem___ Pragma("location=... Nov 21 2011, 13:43 Zelepuk Спасибо за подсказки. Всё заработало. Кристалл F47... Nov 21 2011, 16:48 =DS= Цитата(Zelepuk @ Nov 21 2011, 20:48) Спас... Nov 21 2011, 18:33
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|