реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблема с записью во Flash
lehacheb
сообщение May 6 2014, 05:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 11-04-09
Пользователь №: 47 508



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

Использую процессор 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 располагать запрещено.
Go to the top of the page
 
+Quote Post
msalov
сообщение May 6 2014, 06:56
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Для работы с адресами больше 0xFFFF есть ключевое слово __data20.
Go to the top of the page
 
+Quote Post
lehacheb
сообщение May 6 2014, 08:09
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 11-04-09
Пользователь №: 47 508



Цитата(msalov @ May 6 2014, 10:56) *
Для работы с адресами больше 0xFFFF есть ключевое слово __data20.

Может тогда подскажите как его конкретно в моем коде использовать, куда вставлять?
Я не могу сообразить wacko.gif
Go to the top of the page
 
+Quote Post
msalov
сообщение May 6 2014, 08:59
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



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.

К тому же массивы надо сделать константными.
Go to the top of the page
 
+Quote Post
lehacheb
сообщение May 6 2014, 10:24
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 11-04-09
Пользователь №: 47 508



Насчет того что в настройках нужно поставить 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
Go to the top of the page
 
+Quote Post
doom13
сообщение May 6 2014, 10:31
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



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

Цитата(lehacheb @ May 6 2014, 13:24) *
__data20 unsigned long* addr_start;
addr_start=&START_ARC;


попробуйте

Код
__data20 unsigned long* addr_start;
addr_start = START_ARC;

Go to the top of the page
 
+Quote Post
msalov
сообщение May 6 2014, 11:06
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(lehacheb @ May 6 2014, 13:24) *
#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.
Go to the top of the page
 
+Quote Post
lehacheb
сообщение May 6 2014, 11:38
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 11-04-09
Пользователь №: 47 508



Цитата(msalov @ May 6 2014, 15:06) *
ещё
#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
)

не помогает
Go to the top of the page
 
+Quote Post
lehacheb
сообщение May 7 2014, 06:00
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 11-04-09
Пользователь №: 47 508



Оказывается модификатор __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
)

все заработало
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 14:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.02033 секунд с 7
ELECTRONIX ©2004-2016