MSP430 Запись FLASH
MSP430 Запись FLASH
Здраствуйте , есть примитивная програма при нажатии кнопки во флеш должно записатса значение "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;
}
}
}
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;
}
}
}
- Реклама
Re: MSP430 Запись FLASH
Сегмент "А" лучше не трогать. Там расположены калибровочные константы, которые лучше не затирать. Потому он защищен специальным битом LOCKA. Который, как видно, хорошо выполняет свое назначение.
Мой модуль работы с FLASH под MSP430. Написан для IAR. Но прежде чем его использовать, внимательно прочтите раздел даташита про флэш. Там есть много неочевидных моментов.
flash.h :
flash.c :
Мой модуль работы с 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
Спойлер
Код: Выделить всё
#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;
}Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: MSP430 Запись FLASH
Спасибо буду разбиратса
Re: MSP430 Запись FLASH
ви не могли би розписать как подключить даную библеотеку , нормального примера в нете так и не нашол .
Re: MSP430 Запись FLASH
Просто кинуть .c и .h в директорию проекта (и добавить в дерево исходников, ессно). В том модуле, в котором собираетесь использовать функции, написать #include "flash.h". Ну и дальше становятся доступны внутренние функции.
Вы точно все прочли и поняли? И комментарии в том коде, что я выложил, прочли и поняли? Например, про требования к тактированию?
Вы точно все прочли и поняли? И комментарии в том коде, что я выложил, прочли и поняли? Например, про требования к тактированию?
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Реклама
Re: MSP430 Запись FLASH
ну вот что я понял робочая частота тактового ценератора(fFTG) должна находитса в пределах от 257-476 кГц по етому в зависимости от частоти источника тактирования (ACLK, SMCLK или MCLK) которий виберает юзер нужно правильно сконфигурировать делитель частоти FN5.....FN0 чтоб не вилезти за предели етих (257-476 кГц ) правильно??
Re: MSP430 Запись FLASH
Да, про конфигурацию примерно так. Но там еще есть про стирание, про перезапись...
А у меня во flash.h написано следующее:
Т.е., прежде чем использовать мой модуль, надо установить частоту SMCLK в 1 МГц.
А у меня во 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.
*/
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: MSP430 Запись FLASH
спасибо за библеотеку , буду пользоватса , про стирание тоже читал что есть нюанси , а не моглиби ви всетаки написать как правильно нужно указать адрес например сегмента " B " в моем примере которий находитса на верху ветки форума .
Re: MSP430 Запись FLASH
Просто при записи указываете адрес, попадающий в диапазон адресов сегмента. Чтобы стереть сегмент - указываете любой адрес внутри сегмента.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: MSP430 Запись FLASH
Все получилось .еше раз спасибо "YS" за обяснения и совети . думаю тему можно закривать 
Re: MSP430 Запись FLASH
Не за что.

Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Кефир
- Встал на лапы
- Сообщения: 131
- Зарегистрирован: Пт апр 01, 2011 20:59:47
- Откуда: Саратов
- Контактная информация:
Re: MSP430 Запись FLASH
Как узнать адрес массива ?
Работаю с Code::Blocks
Работаю с Code::Blocks
Последний раз редактировалось Кефир Ср июл 31, 2013 14:36:29, всего редактировалось 1 раз.
Re: MSP430 Запись FLASH
Имя массива есть его адрес.Кефир писал(а):Как узнать адрес массива ?
- Кефир
- Встал на лапы
- Сообщения: 131
- Зарегистрирован: Пт апр 01, 2011 20:59:47
- Откуда: Саратов
- Контактная информация:
Re: MSP430 Запись FLASH
Вы не поняли.
Нужно узнать адрес нужной ячейки (адрес расположения во flash) чтобы записать туда значение.
Или я, что-то не понимаю ?
Нужно узнать адрес нужной ячейки (адрес расположения во flash) чтобы записать туда значение.
Или я, что-то не понимаю ?
Re: MSP430 Запись FLASH
Не понимаете.
Пусть есть объявление
Тогда my_array - адрес нулевой ячейки массива. (my_array+1*sizeof(uint8_t)) - первой. И так далее.
Обращение my_array[n] есть ничто иное, как синтаксический сахар для
(<тип_массива>)(*(my_array + n*sizeof(<тип_массива>)))
Пусть есть объявление
Код: Выделить всё
uint8_t my_array[10];
Обращение my_array[n] есть ничто иное, как синтаксический сахар для
(<тип_массива>)(*(my_array + n*sizeof(<тип_массива>)))
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Кефир
- Встал на лапы
- Сообщения: 131
- Зарегистрирован: Пт апр 01, 2011 20:59:47
- Откуда: Саратов
- Контактная информация:
Re: MSP430 Запись FLASH
Это я все понимаю. Проехали. спс.YS писал(а):Не понимаете.
Пусть есть объявление
Тогда my_array - адрес нулевой ячейки массива. (my_array+1*sizeof(uint8_t)) - первой. И так далее.Код: Выделить всё
uint8_t my_array[10];
Обращение my_array[n] есть ничто иное, как синтаксический сахар для
(<тип_массива>)(*(my_array + n*sizeof(<тип_массива>)))
- Кефир
- Встал на лапы
- Сообщения: 131
- Зарегистрирован: Пт апр 01, 2011 20:59:47
- Откуда: Саратов
- Контактная информация:
Re: MSP430 Запись FLASH
Как будет выглядеть процедура чтения по адресу из Сегмента?
Re: MSP430 Запись FLASH
Чтение по адресу из сегмента для MSP430 выглядит ровно так же, как любое другое чтение - они имеют Фон-Неймановскую архитектуру.
Разница между теорией и практикой на практике гораздо больше, чем в теории.


