MSP430 Запись FLASH

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
slava 1
Родился
Сообщения: 12
Зарегистрирован: Пт авг 19, 2011 01:21:24

MSP430 Запись FLASH

Сообщение slava 1 »

Здраствуйте , есть примитивная програма при нажатии кнопки во флеш должно записатса значение "3" при нажатии другой кнопки ето значение обнуляетса , значение флеш еквивалентно значению переменной если переменная становитса равно"3"тогда включть мигалку преривание от кнопок не использовал запись и стирание производитса по условиям наличея лог"0"на кнопках , так от незнаю как достучатса до "сегмента А " то есть как правильно записать адрес"сегмента А" на язике СИ. МК
MSP430G2452. Вот текст програми .


#include "io430.h"

unsigned char prm=0;
unsigned char segment_A;
void main()
{
WDTCTL = WDTPW + WDTHOLD;

P1DIR &= ~BIT3|BIT2;
P1REN |= BIT3|BIT2;



P1DIR |= BIT0;
P1OUT &=~ BIT0;
P1DIR |= BIT6;
P1OUT &=~ BIT6;
P1DIR |= BIT4;
P1OUT &=~ BIT4;


while(1)
{



if(P1IN_bit.P2 == 0 )
{

__bis_SR_register(GIE); // глобально запрещаем преривания
IE1&=~ACCVIE|NMIIE|OFIE ; // опустить флаги
WDTCTL = WDTPW + WDTHOLD; // останавливаем WDT
while(1)if(!(BUSY&FCTL3))break; // проверка BUSY
FCTL3=FWKEY; // Lock = 0
FCTL1=FWKEY|WRT; // WRT = 1 снимаем ключ запрета записи
?????????? // как записать в segmentA число 3 ?????????
while(1)if(!(BUSY&FCTL3))break; // проверка BUSY
FCTL1=FWKEY; // WRT = 0 устанавливаем ключ запрета записи
FCTL3=FWKEY|LOCK; // Lock = 1
__bis_SR_register(GIE); // разрешаем глобально прерывания
P1OUT|=BIT0; // индикация светодиодом об прохождении удачной записи во флеш
for(volatile unsigned int i = 60000; i != 0; i--);// задержка для исключения повторной записи во флеш
P1OUT&=~BIT0; // обнуляем индикатор
__bis_SR_register(GIE); // разрешаем глобально прерывания
}






if(P1IN_bit.P3 == 0 )
{
__bis_SR_register(GIE); // глобально запрещаем преривания
IE1&=~ACCVIE|NMIIE|OFIE ; // опустить флаги
WDTCTL = WDTPW + WDTHOLD; // останавливаем WDT
while(1)if(!(BUSY&FCTL3))break; // проверка BUSY
FCTL2=FWKEY|FSSEL1|FN0; // SMCLK/2
FCTL3=FWKEY; // Lock = 0
FCTL1=FWKEY|ERASE; //розрешаем стирание сегмента
??????????????? // стираем семгмент segmentA
while(1)if(!(BUSY&FCTL3))break; // проверка BUSY
FCTL3=FWKEY|LOCK; // Lock = 1 устанавливаем запрет на запись
__bis_SR_register(GIE); // разрешаем глобально прерывания
P1OUT|=BIT6; // индикация светодиодом об прохождении удачной записи во флеш
for(volatile unsigned int i = 60000; i != 0; i--);// задержка для исключения повторного стирания флеш
P1OUT&=~BIT6; // обнуляем индикатор
__bis_SR_register(GIE); // разрешаем глобально прерывания
}



prm=segment_A;

if( prm==3)

{

P1OUT^=BIT4;
for(volatile unsigned int i = 3000; i != 0; i--);

}

else
{
P1OUT&=~BIT4;
}





}

}
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430 Запись FLASH

Сообщение YS »

Сегмент "А" лучше не трогать. Там расположены калибровочные константы, которые лучше не затирать. Потому он защищен специальным битом LOCKA. Который, как видно, хорошо выполняет свое назначение. :)))

Мой модуль работы с FLASH под MSP430. Написан для IAR. Но прежде чем его использовать, внимательно прочтите раздел даташита про флэш. Там есть много неочевидных моментов.

flash.h :
Спойлер

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

#ifndef _MSP_FLASH_H_
#define _MSP_FLASH_H_

//Change to target MCU name if needed
#include "msp430g2121.h"
#include "stdint.h"

/*
WARNING: These functions were designed in assumption
that internal calibrated 1MHz frequency is used as SMCLK.
In case of other SMCLK frequencies flash clock divider
MUST be checked and corrected if needed.
*/

void EraseFlashSegment(uint16_t *dummy_ptr);
void WriteFlashWord(uint16_t word,uint16_t *flash_ptr);

#endif
flash.c :
Спойлер

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

#include "flash.h"

/*Flash write/erase module for MSP430 by YS.
Please see appropriate header file for additional info.*/

void EraseFlashSegment(uint16_t *dummy_ptr)
{
  //Select erase mode
  FCTL1=FWKEY | ERASE;
  //Flash clock is SMCLK/3
  FCTL2=FWKEY | FSSEL_2 | FN1;
  //Unlock flash
  FCTL3=FWKEY;
  
  //Starting segment erase
  (*dummy_ptr)=1;
  
  /*The CPU is halted until the process completes*/
  
  //Reset mode
  FCTL1=FWKEY;
  //Lock flash
  FCTL3=FWKEY | LOCK;
}

void WriteFlashWord(uint16_t word,uint16_t *flash_ptr)
{
  //Select write mode
  FCTL1=FWKEY | WRT;
  //Flash clock is SMCLK/3
  FCTL2=FWKEY | FSSEL_2 | FN1;
  //Unlock flash
  FCTL3=FWKEY;
  
  //Write data; CPU is halted while
  //write is active
  (*flash_ptr)=word;
  
  //Reset WRT bit
  FCTL1=FWKEY;
  //Lock flash
  FCTL3=FWKEY | LOCK;
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
slava 1
Родился
Сообщения: 12
Зарегистрирован: Пт авг 19, 2011 01:21:24

Re: MSP430 Запись FLASH

Сообщение slava 1 »

Спасибо буду разбиратса
slava 1
Родился
Сообщения: 12
Зарегистрирован: Пт авг 19, 2011 01:21:24

Re: MSP430 Запись FLASH

Сообщение slava 1 »

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

Re: MSP430 Запись FLASH

Сообщение YS »

Просто кинуть .c и .h в директорию проекта (и добавить в дерево исходников, ессно). В том модуле, в котором собираетесь использовать функции, написать #include "flash.h". Ну и дальше становятся доступны внутренние функции.

Вы точно все прочли и поняли? И комментарии в том коде, что я выложил, прочли и поняли? Например, про требования к тактированию?
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
slava 1
Родился
Сообщения: 12
Зарегистрирован: Пт авг 19, 2011 01:21:24

Re: MSP430 Запись FLASH

Сообщение slava 1 »

ну вот что я понял робочая частота тактового ценератора(fFTG) должна находитса в пределах от 257-476 кГц по етому в зависимости от частоти источника тактирования (ACLK, SMCLK или MCLK) которий виберает юзер нужно правильно сконфигурировать делитель частоти FN5.....FN0 чтоб не вилезти за предели етих (257-476 кГц ) правильно??
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430 Запись FLASH

Сообщение YS »

Да, про конфигурацию примерно так. Но там еще есть про стирание, про перезапись...

А у меня во flash.h написано следующее:

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

/*
WARNING: These functions were designed in assumption
that internal calibrated 1MHz frequency is used as SMCLK.
In case of other SMCLK frequencies flash clock divider
MUST be checked and corrected if needed.
*/
Т.е., прежде чем использовать мой модуль, надо установить частоту SMCLK в 1 МГц.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
slava 1
Родился
Сообщения: 12
Зарегистрирован: Пт авг 19, 2011 01:21:24

Re: MSP430 Запись FLASH

Сообщение slava 1 »

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

Re: MSP430 Запись FLASH

Сообщение YS »

Просто при записи указываете адрес, попадающий в диапазон адресов сегмента. Чтобы стереть сегмент - указываете любой адрес внутри сегмента.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
slava 1
Родился
Сообщения: 12
Зарегистрирован: Пт авг 19, 2011 01:21:24

Re: MSP430 Запись FLASH

Сообщение slava 1 »

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

Re: MSP430 Запись FLASH

Сообщение YS »

Не за что. :) :beer:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Кефир
Встал на лапы
Сообщения: 131
Зарегистрирован: Пт апр 01, 2011 20:59:47
Откуда: Саратов
Контактная информация:

Re: MSP430 Запись FLASH

Сообщение Кефир »

Как узнать адрес массива ?
Работаю с Code::Blocks
Последний раз редактировалось Кефир Ср июл 31, 2013 14:36:29, всего редактировалось 1 раз.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: MSP430 Запись FLASH

Сообщение dosikus »

Кефир писал(а):Как узнать адрес массива ?
Имя массива есть его адрес.
Аватара пользователя
Кефир
Встал на лапы
Сообщения: 131
Зарегистрирован: Пт апр 01, 2011 20:59:47
Откуда: Саратов
Контактная информация:

Re: MSP430 Запись FLASH

Сообщение Кефир »

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

Re: MSP430 Запись FLASH

Сообщение YS »

Не понимаете.

Пусть есть объявление

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

uint8_t my_array[10];
Тогда my_array - адрес нулевой ячейки массива. (my_array+1*sizeof(uint8_t)) - первой. И так далее.

Обращение my_array[n] есть ничто иное, как синтаксический сахар для

(<тип_массива>)(*(my_array + n*sizeof(<тип_массива>)))
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Кефир
Встал на лапы
Сообщения: 131
Зарегистрирован: Пт апр 01, 2011 20:59:47
Откуда: Саратов
Контактная информация:

Re: MSP430 Запись FLASH

Сообщение Кефир »

YS писал(а):Не понимаете.

Пусть есть объявление

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

uint8_t my_array[10];
Тогда my_array - адрес нулевой ячейки массива. (my_array+1*sizeof(uint8_t)) - первой. И так далее.

Обращение my_array[n] есть ничто иное, как синтаксический сахар для

(<тип_массива>)(*(my_array + n*sizeof(<тип_массива>)))
Это я все понимаю. Проехали. спс.
Аватара пользователя
Кефир
Встал на лапы
Сообщения: 131
Зарегистрирован: Пт апр 01, 2011 20:59:47
Откуда: Саратов
Контактная информация:

Re: MSP430 Запись FLASH

Сообщение Кефир »

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

Re: MSP430 Запись FLASH

Сообщение YS »

Чтение по адресу из сегмента для MSP430 выглядит ровно так же, как любое другое чтение - они имеют Фон-Неймановскую архитектуру.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Ответить

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