Страница 2 из 8
Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 22:21:14
YS
апноут по флешу
О! Спасибо за ссылку, интересный документ.
Где я ошибаюсь?
В том аппноуте, который Вы привели, тоже прямо запрещена запись одного и того же слова более двух раз между стираниями блока.
The same 16-bit flash word cannot be programmed more than twice before the next erase cycle. Writing
to one 16-bit word with two byte-wise programming cycles counts as two programming cycles. Single-bit
overprogramming is possible only once, if the flash cell previously has been programmed 16-bit word
wise.
Страница 6.
Т.е., изменить без стирания сегмента больше одного [не считая первичной записи] бита нельзя уже потому, что просто нельзя писать в одно и то же слово больше двух раз. Причем, если пишем побайтово, то все - каждая запись считается одним доступом к слову.
Мораль: без стирания больше одного раза лучше не писать, так как, пользуясь Вашей аллегорией, можно сказать, что молоток ударяет сразу по всем шестнадцати гвоздям, и каждая доска с шестнадцатью гвоздями может выдержать не более двух попаданий.
При этом ни один из его битов не будет перепрограммирован.
Я так понимаю, там неважно, был ли этот бит действительно изменен. Главное, что он все равно переживает режим программирования, и это является для него стрессом в любом случае.
Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 22:46:32
GreatDrek
У нас есть 4 сегмента, по 64 байта, которые можно переписать, сегменты в любой очередности можно записывать, но дописать уже в существующий сегмент нельзя без его очистки, правильно я понял? И еще всего 4 сегмента? Этого мало очень, как понять эту строку *** Option 1: use program memory, uncomment these lines and you have 512 bytes of flash available (1024 bytes allocated) ****?
Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 22:50:28
GreatDrek
The information memory has four 64-byte segments. The main memory has two or more 512-byte
segments. See the device-specific data sheet for the complete memory map of a device.
Вот эту основную память нельзя переписывать программно(512байт)? Только сегменты?
Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 23:04:24
YS
Вот эту основную память нельзя переписывать программно(512байт)? Только сегменты?
Дыг 512 байт - сегмент основной памяти.
Писать можно куда угодно. Просто несколько сегментов специально оставлены для данных и их размер сделан поменьше, чтобы удобнее было в смысле стирания. Стирать-то можно только сегмент целиком.
но дописать уже в существующий сегмент нельзя без его очистки, правильно я понял?
В сегмент дописать можно. Но только новое слово. Нельзя два раза без очистки писать по одному и тому же адресу.
Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 23:06:24
GreatDrek
так только 4 сегмента по 64 байта и все?
Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 23:08:25
GreatDrek
// Two options to use for flash: One of the info flash segments, or a part of the program memory
// either define a bit of constant program memory, and pass a pointer to the start of a segment to the flash functions,
//*** Option 1: use program memory, uncomment these lines and you have 512 bytes of flash available (1024 bytes allocated) ****
//const unsigned char data[2*SEGMENT_SIZE] = {0};
//#define flash SEGPTR(data)
//
//*** Option 2: use one of the 64 byte info segments, uncomment this line. Use SEGMENT_B, SEGMENT_C or SEGMENT_D (each 64 bytes, 192 bytes in total)
Объясните это пожалуйста!
Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 23:13:09
YS
Объясните это пожалуйста!
Подождите с кодом. Давайте сначала разберемся с теорией.
так только 4 сегмента по 64 байта и все?
Нет. Еще раз, писать можно куда угодно, только не попадите в программный код. Просто эти 4 сегмента специально предназначены для данных, потому их размер сделан поменьше для удобства.
А 256 байт - это, на самом деле, достаточно много.
Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 23:16:58
GreatDrek
не 256 получается а 192, в сегмент A нельзя же писать не разблокировав его, я так понял его лучше и не трогать.
То есть у меня есть 16кб памяти для программы, написал я программу на 4кб, осталось 12, в эти 12 я могу писать результаты выполнения программы, главное при выборе откуда начинать писать не попасть в код программы?
Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 23:30:14
YS
в сегмент A нельзя же писать не разблокировав его, я так понял его лучше и не трогать.
Правильно поняли. Там лежат калибровочные данные.
не 256 получается а 192
192 байта эт тоже достаточно много.
в эти 12 я могу писать результаты выполнения программы, главное при выборе откуда начинать писать не попасть в код программы?
Да. И там размер сегмента, т.е., минимальной единицы стирания, 512 байт. Соответственно, следите, чтобы не потереть конец программы.

Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 23:32:34
GreatDrek
Это все понял
И смог реализовать запись данных и их чтения из 3 сегментов по 64байта, а как реализовать именно запись по 512 байтовые сегменты, как определить де начинается и заканчивается программа?
Re: MSP430G2452 и SD карта
Добавлено: Пт июн 21, 2013 23:56:24
YS
а как реализовать именно запись по 512 байтовые сегменты
Ровно так же. Разница только в размере сегмента и, соответственно, в границах адресов.
как определить де начинается и заканчивается программа?
Посмотреть бинарник. Карта (map, не card) памяти МК есть в даташите, там указан адрес начала кода. Или посмотреть размер программы в выводе компилятора и прикнуть, на каком сегменте она кончается, и писать со следующего. Или, еще лучше, начинать с конца памяти.
Re: MSP430G2452 и SD карта
Добавлено: Сб июн 22, 2013 03:27:16
Ser60
Не получил я ответа на свой вопрос еще раз перечитав ДШ и апноут, и поскольку для спора нет официальных данных, я решил получить ответ на практике.
YS писал(а):молоток ударяет сразу по всем шестнадцати гвоздям
Именно в этом-то я и не был уверен. Прочитав про электрические процессы при программировании флеша, у меня создалось следующее впечатление. Во время программирования весь 64-байтный ряд флеша подвергается воздействию высокого напряжения программирования, и в этом смысле молоток действительно ударяет сразу по всем гвоздям. Однако, это лишь молоточек по сравнению с реальным ударом кувалдой, который получают биты, изменяющие свое состояние из 1 в 0. Короче, по данным апноута, я понял так, что каждый бит способен выдержать в зависимости от частоты тактирования флеша 40-80 ударов молоточком прежде чем забьется по шляпку (т.е. изменит свое состояние из 1 в 0 даже если пользователь все время записывает 1 в этот бит) и лишь 1 удар кувалдой.
Для проверки этой гипотезы код из примера ТИ для работы с флешью был адаптирован следуюшим образом:
Спойлер
Код: Выделить всё
#include <msp430g2231.h>
ORG 0x0F800 ; Program Reset
RESET: mov.w #0x0280, SP ; Initialize stackpointer
mov.w #WDTPW+WDTHOLD, &WDTCTL ; Stop WDT
mov.b &CALBC1_1MHZ, &BCSCTL1 ; Set DCO to 1MHz
mov.b &CALDCO_1MHZ, &DCOCTL
mov.w #0x1040, R10 ; 1st address in SegC
loop: call #Erase_SegC ; erase segment C in info memory
mov.b #0x7F, R5 ; R5 = value to write to flash
mov.b #8, R6 ; R6 = bit counter
wbyte: call #Write_SegC ; write value to segment C
mov.b @R10, R11 ; R11 = value from flash
nop ; set BREAK point here
setc
rrc.b R5 ; update value to write
dec.b R6 ; update bit counter
jnz wbyte
jmp loop ;
;-------------------------------------------------------------------------------
Erase_SegC:
mov.w #FWKEY+FSSEL0+FN1, &FCTL2 ; *Timing generator = MCLK/3
mov.w #FWKEY, &FCTL3 ; Lock = 0
mov.w #FWKEY+ERASE, &FCTL1 ; Erase bit = 1, allow interrupts
mov.w #0, 0(R10) ; Dummy write to SegC to erase
ret
;-------------------------------------------------------------------------------
Write_SegC:
mov.w #FWKEY+WRT, &FCTL1 ; Write bit = 1, block interrupts
mov.w #FWKEY, &FCTL3 ; Lock = 0
mov.b R5, 0(R10) ; write value to flash
mov.w #FWKEY+LOCK, &FCTL3 ; Lock = 1;
ret
;-------------------------------------------------------------------------------
; Interrupt Vectors
;-------------------------------------------------------------------------------
ORG 0x0FFFE ; MSP430 RESET Vector
DW RESET
END
(извиняюсь за табуляцию, но в IAR будет выглядеть нормально) и произведена проверка его работы живьем на MSP430F2231. В цикле программы первоначальное значение байта 0хFF по адресу 0х1040 (это первый байт Сегмента С информационной памяти) изменялось до 0х00 путем обнуления одного из битов без стирания флеша между записями. Т.е. этот байт в промежутке между стираниями перезаписывался 8 раз. Чтобы исключить повторный удар кувалдой по байту в каждый его бит записывался 0 только 1 раз. Т.е. последовательность записываемых байтов по адресу 0х1040 была следующей:
0x7F - 0xBF - 0xDF - 0xEF - 0xF7 - 0xFB - 0xFD - 0xFE
Каждый байт этой последовательности содержить лишь один 0 и нули эти в разных местах. Записанный байт потом читался из флеша и в отладчике контролировалось его содержимое и состояние остальных байтов сегмента. Оказалось, что во всем сегменте изменялось лишь значение записываемого байта и принимаемые им значения менялись так:
0xFF - 0x7F - 0x3F - 0x1F - 0x0F - 0x07 - 0x03 - 0x01 - 0x00
т.е. каждый раз производилось стирание одной единицы в байте. Затем производилось стирание всего сегмента, в результате которого значение насилуемого байта восстанавливалось до 0хFF, и производилась новая серия его модификаций. Прокрутив всю программу несколько раз никаких побочных эффектов замечено не было. Кто хочет - проверьте сами.
Короче, экспериментально выяснилось, что при соблюдении указанной осторожности, значение байта флеша между стираниями можно изменять до 8 раз.
Re: MSP430G2452 и SD карта
Добавлено: Сб июн 22, 2013 13:12:52
YS
Короче, экспериментально выяснилось, что при соблюдении указанной осторожности, значение байта флеша между стираниями можно изменять до 8 раз.
Снимаю шляпу. Значит, можно. Но то, что это не рекомендуется - остается фактом. В даташите есть строчки, прямо запрещающие доступ на запись к одной и той же ячейке более двух раз между стираниями. Возможно, конечно, это перестраховка, но следовать документации - все же хороший тон.

Re: MSP430G2452 и SD карта
Добавлено: Сб июн 22, 2013 14:04:02
GreatDrek
Мне вообще не нужно один и тот же байт перезаписывать сто раз, я по очереди в следующий байт памяти записываю данные. Просто не удобно что нельзя очистить один байт из сегмента, а приходиться чистить весь сегмент, но если такое действие нужно я перед очисткой заношу весь сегмент в оперативку там изменяю как надо и записываю обратно.
Re: MSP430G2452 и SD карта
Добавлено: Сб июн 22, 2013 14:35:41
YS
но если такое действие нужно я перед очисткой заношу весь сегмент в оперативку там изменяю как надо и записываю обратно
Правильно.
Именно ради этого размер сегментов данных сделан поменьше - 64 байта против 512, чтобы занимать меньше памяти при такой операции.
Re: MSP430G2452 и SD карта
Добавлено: Сб июн 22, 2013 18:17:22
GreatDrek
Хочу сделать что бы я по uart отправлял слово, слово на входе делится на отдельные буквы, каждая буква переводиться в байт, к примеру b=98, записать именно стринговое значение в байт не получается так как под стринг не выделяется какая то постоянная память, при записи int значения например 97 когда начинаю его считывать почему то получается 127 при чтении, в итоге я так и не придумал как на входе uarta букву z например записать в байт и потом прочитать от туда именно z а не что то другое.
Flash.write(flash+key, (unsigned char*) "z" ,1); если использовать этот код то z нормально запишется, а если
String text = "z";
...
Flash.write(flash+key, (unsigned char*) text ,1);
...
говорит что нельзя использовать стринг и чар вместе
в общем пришлось писать громоздкий обходной и повторяющийся код, если знаете как его переписать то подскажите)) Спасибо большое за всю помощь, благодаря вам я много понял.
Re: MSP430G2452 и SD карта
Добавлено: Сб июн 22, 2013 19:19:30
YS
как его переписать
Все еще пишете в Energia, этой ардуиноообразной унылости?

Я бы рекомендовал перейти на IAR. Это по-взрослому. Бесплатной kickstart-версии Вам хватит с лихвой.
String - это плохо, это все Ардуино-стайл. В ANSI C нет никаких стрингов. Строка - просто массив байт,
заканчивающийся нулем.
Код: Выделить всё
uint8_t my_true_string[MY_TRUE_STRING_LENGTH];
...
my_true_string[0]='h';
my_true_string[1]='e';
my_true_string[2]='l';
my_true_string[3]='l';
my_true_string[4]='o';
my_true_string[5]=0;
...
uint8_t - один из типов в stdint.h, беззнаковый целый. Использование stdint.h - хороший тон. Очень рекомендую, тем более что это еще и удобно.
Будет как-то так:
Код: Выделить всё
uint8_t my_true_string[MY_TRUE_STRING_LENGTH];
...
Flash.write(flash+key, my_true_string[WANTED_LETTER] ,1);
Спасибо большое за всю помощь, благодаря вам я много понял.
Да не за что.
Кстати, для прививания хороших принципов кодирования рекомендую
эту статью.
Re: MSP430G2452 и SD карта
Добавлено: Сб июн 22, 2013 19:38:09
GreatDrek
/*a...z = 97...122*/
#include "MspFlash.h"
#define flash SEGMENT_D
byte inByte = 0;
int key = 1;
void setup() {
Serial.begin(9600);
}
void loop() {
if(Serial.available() > 0){
inByte = Serial.read();
//Serial.println(inByte);
if(inByte==97){
Flash.write(flash+key, (unsigned char*) "a" ,1);
}
if(inByte==98){
Flash.write(flash+key, (unsigned char*) "b" ,1);
}
if(inByte==99){
Flash.write(flash+key, (unsigned char*) "c" ,1);
}
if(inByte==100){
Flash.write(flash+key, (unsigned char*) "d" ,1);
}
if(inByte==101){
Flash.write(flash+key, (unsigned char*) "e" ,1);
}
if(inByte==102){
Flash.write(flash+key, (unsigned char*) "f" ,1);
}
if(inByte==103){
Flash.write(flash+key, (unsigned char*) "g" ,1);
}
if(inByte==104){
Flash.write(flash+key, (unsigned char*) "h" ,1);
}
if(inByte==105){
Flash.write(flash+key, (unsigned char*) "i" ,1);
}
if(inByte==106){
Flash.write(flash+key, (unsigned char*) "j" ,1);
}
if(inByte==107){
Flash.write(flash+key, (unsigned char*) "k" ,1);
}
if(inByte==108){
Flash.write(flash+key, (unsigned char*) "l" ,1);
}
if(inByte==109){
Flash.write(flash+key, (unsigned char*) "m" ,1);
}
if(inByte==110){
Flash.write(flash+key, (unsigned char*) "n" ,1);
}
if(inByte==111){
Flash.write(flash+key, (unsigned char*) "o" ,1);
}
if(inByte==112){
Flash.write(flash+key, (unsigned char*) "p" ,1);
}
if(inByte==113){
Flash.write(flash+key, (unsigned char*) "q" ,1);
}
if(inByte==114){
Flash.write(flash+key, (unsigned char*) "r" ,1);
}
if(inByte==115){
Flash.write(flash+key, (unsigned char*) "s" ,1);
}
if(inByte==116){
Flash.write(flash+key, (unsigned char*) "t" ,1);
}
if(inByte==117){
Flash.write(flash+key, (unsigned char*) "u" ,1);
}
if(inByte==118){
Flash.write(flash+key, (unsigned char*) "v" ,1);
}
if(inByte==119){
Flash.write(flash+key, (unsigned char*) "w" ,1);
}
if(inByte==120){
Flash.write(flash+key, (unsigned char*) "x" ,1);
}
if(inByte==121){
Flash.write(flash+key, (unsigned char*) "y" ,1);
}
if(inByte==122){
Flash.write(flash+key, (unsigned char*) "z" ,1);
}
if(inByte==32){
Flash.write(flash+key, (unsigned char*) " " ,1);
}
++key;
}
}
Написал вот такой код) На 64 байта больше одного предложения не запишешь

)
Написать примитивную версию ОС под микроконтроллер не получиться
Если не использовать SD карту

Re: MSP430G2452 и SD карта
Добавлено: Сб июн 22, 2013 19:48:25
YS
Написать примитивную версию ОС под микроконтроллер не получиться
ОС или
оболочки? Оболочку я
писал, можете глянуть, если интересно. Она изначально для AVR, но, в принципе, портируема.
ОС на таких МК не нужна.
Написал вот такой код
Ага, ардуино-стайл во всей красе. Проблема там идеологического плана - не надо писать в этом убогом стиле. Использование каких-то странных стрингов, не позволяющее написать по-человечески, - проблема стиля.
По-человечески это пишется как-то так:
Код: Выделить всё
uint8_t my_string[STR_LEN];
...
for (i=0; i<str_len; i++)
WriteFlash(base_addr++, my_string[i]);
my_string заполняется символами в прерывании от UART'а с одновременным подсчетом их количества или так, как сделано в моей реализации оболочки по ссылке выше. Прием завершается стоповым нулевым символом или переводом строки.
И почитайте
эту статью.
Re: MSP430G2452 и SD карта
Добавлено: Сб июн 22, 2013 19:52:00
GreatDrek
Спасибо, пошел читать!