Перейти к содержанию
    

Проблема с записью во Flash

Может кто сталкивался, помогите

 

Использую процессор MSP430F5342,

программу пишу в среде Embedded Workbench 6.0.

Вроде пока проблем не возникало но тут возникла.

Дело в том, что основная память процессора code memory

располагается по адресу от 0x4400 до 0x24400 и составляет

128 КВ. У меня есть необходимость записывать во Flash архивы измеряемых

значений, причем под архивы планирую отвести половину

всей памяти (Банк С и Банк D адреса от 0х14400 до 0x24400).

Для записи использую следующую процедуру из MSPWare Driver Library:

Flash_write32(__MSP430_BASEADDRESS_FLASH__, C_N, (unsigned long *)START_ARC, 4);

Я писал сначала в Information memory в сегменты Info B и Info C (START_ARC=0x1880 START_ARC=0x1900)

писалось без проблем. Попробовал в основную память в Банк С (START_ARC=0x14400) не пишется.

И потом я обнаружил, что если ставить адрес меньше 0хFFFF, то пишется и в основную память,

а если ставить адрес больше 0х10000 не работает, то есть можно записать до середины Банка В,

а дальше нельзя.

 

И еще одно наверное с этим связанное: если я хочу расположить массивы во Flash:

 

#pragma location=0x1900 // параметры

__root __no_init unsigned long param[32];

 

#pragma location=0x1880 // счетчики

__root __no_init unsigned long counter[32];

 

#pragma location=0x14400 // архивы

__root __no_init unsigned long archive[128];

 

не компилируется, ругается на адрес третьего массива, выдает ошибку:

Error[Ta028]: Placing a located variable above 0xffff is not allowed D:\Prog\Teplos_3V_6.0\main.c 85

пишет что переменные по адресу больше 0xffff располагать запрещено.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для работы с адресами больше 0xFFFF есть ключевое слово __data20.

Может тогда подскажите как его конкретно в моем коде использовать, куда вставлять?

Я не могу сообразить :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IAR C/C++ Compiler Reference Guide

for Texas Instruments’ MSP430 Microcontroller Family

 

__data20

 

Syntax

Follows the generic syntax rules for memory type attributes that can be used on data

objects, see Type attributes, page 247.

 

Description

The __data20 memory attribute overrides the default storage of variables and places

individual variables and constants in data20 memory, which is the entire 1 Mbyte of

memory in the MSP430X architecture. You can also use the __data20 attribute to

create a pointer explicitly pointing to an object located in the data20 memory.

The __data20 attribute cannot be used in the Small data model.

 

Storage information

* Address range: 0–0xFFFFF (1 Mbyte)

* Maximum object size: 1 Mbyte

* Pointer size: 20 bits in register, 4 bytes in memory

 

Example

__data20 int x;

 

See also

Memory types (MSP430X only), page 47.

 

 

Пример работы с 20-битным указателем:

__data20 uint16_t *ptr = 0x10000;
EnableWrite()
*ptr = 0xAABBU;
DisableWrite()

 

Memory model в растройках проекта надо указать Medium или Large.

 

Все подробности в руководстве к компилятору, которое можно найти в меню Help -> C/C++ Compiler Reference Guide.

 

К тому же массивы надо сделать константными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет того что в настройках нужно поставить Medium я догадался, тогда у меня описание массива заработало:

#pragma location=0x14400 //

__root __no_init __data20 const unsigned long archive[128][128];

 

А вот процедура записи так и не работает, хотя я вроде описываю указатель с __data20

 

#define START_ARC 0x14400

__data20 unsigned long* addr_start;

addr_start=&START_ARC;

Flash_write32(__MSP430_BASEADDRESS_FLASH__, C_N, addr_start, 5);

 

Ничего не пишет по адресу 0x14400

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут явно ошибка:

 

__data20 unsigned long* addr_start;

addr_start=&START_ARC;

 

попробуйте

 

__data20 unsigned long* addr_start;
addr_start = START_ARC;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#define START_ARC 0x14400

__data20 unsigned long* addr_start;

addr_start=&START_ARC;

Flash_write32(__MSP430_BASEADDRESS_FLASH__, C_N, addr_start, 5);

ещё

#define START_ARC 0x14400UL

 

К тому же стоит взглянуть на реализацию Flash_write32, если она принимает unsigned long* а не __data20 unsigned long*, то ваши "внешние" старания не имеют смысла - надо править библиотеку, либо ставить модель памяти Large.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ещё

#define START_ARC 0x14400UL

 

К тому же стоит взглянуть на реализацию Flash_write32, если она принимает unsigned long* а не __data20 unsigned long*, то ваши "внешние" старания не имеют смысла - надо править библиотеку, либо ставить модель памяти Large.

 

Пробовал в файлах flash.h и flash.c где описывается Flash_write32, добавлять __data20:

 

void Flash_write32 (unsigned int baseAddress,

unsigned long *Data_ptr,

__data20 unsigned long *Flash_ptr,

unsigned int numberOfBytes

)

 

не помогает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оказывается модификатор __data20 нужно ставить перед значком указателя:

 

Flash_write32(__MSP430_BASEADDRESS_FLASH__, C_N, (unsigned long __data20 *)addr_start, 5);

 

И в библиотеке тоже также добавить:

 

void Flash_write32 (unsigned int baseAddress,

unsigned long *Data_ptr,

unsigned long __data20 *Flash_ptr,

unsigned int numberOfBytes

)

 

все заработало

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...