MSP430G2452 и SD карта

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение 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.

Т.е., изменить без стирания сегмента больше одного [не считая первичной записи] бита нельзя уже потому, что просто нельзя писать в одно и то же слово больше двух раз. Причем, если пишем побайтово, то все - каждая запись считается одним доступом к слову.

Мораль: без стирания больше одного раза лучше не писать, так как, пользуясь Вашей аллегорией, можно сказать, что молоток ударяет сразу по всем шестнадцати гвоздям, и каждая доска с шестнадцатью гвоздями может выдержать не более двух попаданий.
При этом ни один из его битов не будет перепрограммирован.
Я так понимаю, там неважно, был ли этот бит действительно изменен. Главное, что он все равно переживает режим программирования, и это является для него стрессом в любом случае.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

У нас есть 4 сегмента, по 64 байта, которые можно переписать, сегменты в любой очередности можно записывать, но дописать уже в существующий сегмент нельзя без его очистки, правильно я понял? И еще всего 4 сегмента? Этого мало очень, как понять эту строку *** Option 1: use program memory, uncomment these lines and you have 512 bytes of flash available (1024 bytes allocated) ****?
Реклама
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение 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байт)? Только сегменты?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

Вот эту основную память нельзя переписывать программно(512байт)? Только сегменты?
Дыг 512 байт - сегмент основной памяти.

Писать можно куда угодно. Просто несколько сегментов специально оставлены для данных и их размер сделан поменьше, чтобы удобнее было в смысле стирания. Стирать-то можно только сегмент целиком.
но дописать уже в существующий сегмент нельзя без его очистки, правильно я понял?
В сегмент дописать можно. Но только новое слово. Нельзя два раза без очистки писать по одному и тому же адресу.
Последний раз редактировалось YS Пт июн 21, 2013 23:06:27, всего редактировалось 1 раз.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Эиком - электронные компоненты и радиодетали
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

так только 4 сегмента по 64 байта и все?
Реклама
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение 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)
Объясните это пожалуйста!
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

Объясните это пожалуйста!
Подождите с кодом. Давайте сначала разберемся с теорией.
так только 4 сегмента по 64 байта и все?
Нет. Еще раз, писать можно куда угодно, только не попадите в программный код. Просто эти 4 сегмента специально предназначены для данных, потому их размер сделан поменьше для удобства.

А 256 байт - это, на самом деле, достаточно много.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

не 256 получается а 192, в сегмент A нельзя же писать не разблокировав его, я так понял его лучше и не трогать.
То есть у меня есть 16кб памяти для программы, написал я программу на 4кб, осталось 12, в эти 12 я могу писать результаты выполнения программы, главное при выборе откуда начинать писать не попасть в код программы?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

в сегмент A нельзя же писать не разблокировав его, я так понял его лучше и не трогать.
Правильно поняли. Там лежат калибровочные данные.
не 256 получается а 192
192 байта эт тоже достаточно много.
в эти 12 я могу писать результаты выполнения программы, главное при выборе откуда начинать писать не попасть в код программы?
Да. И там размер сегмента, т.е., минимальной единицы стирания, 512 байт. Соответственно, следите, чтобы не потереть конец программы. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

Это все понял :)
И смог реализовать запись данных и их чтения из 3 сегментов по 64байта, а как реализовать именно запись по 512 байтовые сегменты, как определить де начинается и заканчивается программа?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

а как реализовать именно запись по 512 байтовые сегменты
Ровно так же. Разница только в размере сегмента и, соответственно, в границах адресов.
как определить де начинается и заканчивается программа?
Посмотреть бинарник. Карта (map, не card) памяти МК есть в даташите, там указан адрес начала кода. Или посмотреть размер программы в выводе компилятора и прикнуть, на каком сегменте она кончается, и писать со следующего. Или, еще лучше, начинать с конца памяти.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: MSP430G2452 и SD карта

Сообщение 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 раз.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

Короче, экспериментально выяснилось, что при соблюдении указанной осторожности, значение байта флеша между стираниями можно изменять до 8 раз.
:dont_know:

Снимаю шляпу. Значит, можно. Но то, что это не рекомендуется - остается фактом. В даташите есть строчки, прямо запрещающие доступ на запись к одной и той же ячейке более двух раз между стираниями. Возможно, конечно, это перестраховка, но следовать документации - все же хороший тон. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

Мне вообще не нужно один и тот же байт перезаписывать сто раз, я по очереди в следующий байт памяти записываю данные. Просто не удобно что нельзя очистить один байт из сегмента, а приходиться чистить весь сегмент, но если такое действие нужно я перед очисткой заношу весь сегмент в оперативку там изменяю как надо и записываю обратно.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

но если такое действие нужно я перед очисткой заношу весь сегмент в оперативку там изменяю как надо и записываю обратно
Правильно.

Именно ради этого размер сегментов данных сделан поменьше - 64 байта против 512, чтобы занимать меньше памяти при такой операции.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение 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);
...
говорит что нельзя использовать стринг и чар вместе
в общем пришлось писать громоздкий обходной и повторяющийся код, если знаете как его переписать то подскажите)) Спасибо большое за всю помощь, благодаря вам я много понял.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение 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);
Спасибо большое за всю помощь, благодаря вам я много понял.
Да не за что.

Кстати, для прививания хороших принципов кодирования рекомендую эту статью.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение 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 карту :)
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

Написать примитивную версию ОС под микроконтроллер не получиться
ОС или оболочки? Оболочку я писал, можете глянуть, если интересно. Она изначально для AVR, но, в принципе, портируема.

ОС на таких МК не нужна.
Написал вот такой код
Ага, ардуино-стайл во всей красе. Проблема там идеологического плана - не надо писать в этом убогом стиле. Использование каких-то странных стрингов, не позволяющее написать по-человечески, - проблема стиля.

По-человечески это пишется как-то так:

Код: Выделить всё

uint8_t my_string[STR_LEN];

...

for (i=0; i<str_len; i++)
  WriteFlash(base_addr++, my_string[i]);
my_string заполняется символами в прерывании от UART'а с одновременным подсчетом их количества или так, как сделано в моей реализации оболочки по ссылке выше. Прием завершается стоповым нулевым символом или переводом строки.

И почитайте эту статью.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

Спасибо, пошел читать!
Ответить

Вернуться в «Разные вопросы по МК»