|
|
  |
Проблема с записью во Flash |
|
|
|
May 6 2014, 05:10
|
Участник

Группа: Участник
Сообщений: 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 располагать запрещено.
|
|
|
|
|
May 6 2014, 08:09
|
Участник

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

|
Цитата(msalov @ May 6 2014, 10:56)  Для работы с адресами больше 0xFFFF есть ключевое слово __data20. Может тогда подскажите как его конкретно в моем коде использовать, куда вставлять? Я не могу сообразить
|
|
|
|
|
May 6 2014, 08:59
|
Знающий
   
Группа: Свой
Сообщений: 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. К тому же массивы надо сделать константными.
|
|
|
|
|
May 6 2014, 10:24
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 6 2014, 10:31
|
Профессионал
    
Группа: Свой
Сообщений: 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;
|
|
|
|
|
May 6 2014, 11:06
|
Знающий
   
Группа: Свой
Сообщений: 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 0x14400 ULК тому же стоит взглянуть на реализацию Flash_write32, если она принимает unsigned long* а не __data20 unsigned long*, то ваши "внешние" старания не имеют смысла - надо править библиотеку, либо ставить модель памяти Large.
|
|
|
|
|
May 6 2014, 11:38
|
Участник

Группа: Участник
Сообщений: 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 ) не помогает
|
|
|
|
|
May 7 2014, 06:00
|
Участник

Группа: Участник
Сообщений: 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 )
все заработало
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|