KEEN SIDE успешно заменяет аналогичные продукты таких известных брендов, как Phoenix Contact, Weidmueller, Degson, Winstar, Hsuan Mao, KLS, G-NOR, Mean Well и др.

Подключение внешней памяти к микроконтроллеру ATmega128. Часть 2. Программная часть

ATmega128

В первой части мы рассмотрели основные характерситики и параметры интерфейса внешней памяти микроконтроллера ATmega128, схему и интерфейс подключения модуля расширения.

Примечание. Выборки исходного кода, размещенные в тексте описания, использовать в своих проектах не рекомендуется. В конце описания имеется ссылка на архив с полным исходным кодом к проекту.

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

После сборки модуля необходимо протестировать его работу. Для этого напишем несколько программных функций реализующих алгоритм размещения памяти и чтения/записи данных.

Сперва необходимо настроить проект в среде разработки AVRStudio. При использовании автоматической генерации make-файла, нам необходимо добавить опции, связанные с параметрами внешней SRAM, таким образом, мы указываем компилятору адресное пространство для распределения ОЗУ. Для этого в настройках проекта (меню Project->Configuration Options) найдем закладку Custom Options и в параметрах компоновщика (Linker Options) впишем строку:

-Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x8030ff

Это указывает компоновщику начальный и конечный адрес внешнего ОЗУ, а также указывает, что данная память используется для хранения переменных и хипа (Heap область – это область памяти, динамически распределяющаяся приложением)

Программная часть - Подключение внешней памяти к микроконтроллеру ATmega128

В соответствии с такой конфигурацией мы имеем диапазон адресов: для внутреннего ОЗУ 0×8000000x8010FF, для внешнего ОЗУ 0×8011000x8030FF и поскольку мы используем 8 КБайт внешней памяти, то к концу адресного пространства внутреннего ОЗУ (0x8010FF) мы прибавляем 0×2000. Всего мы получаем 12 КБайт ОЗУ, причем внутренняя память используется под стек (STACK), а внешняя – для хранения данных (секция .data), глобальных и статических переменных (секция .bss) и хипа (heap).

Для проверки внешней памяти есть несколько способов. Мы будем использовать функцию malloc(), которая просто распределяет некоторый объем памяти и возвращает начальный адрес указателю. После конфигурирования проекта мы можем приступить к написанию кода.

Прежде, чем мы сможем использовать внешнюю память, нам необходимо разрешить ее использование установкой бита SRE в регистре управления MCUCR – это действие переключает специализированные выводы микроконтроллера на XMEM интерфейс. Также мы можем освободить неиcпользуемыме в интерфейсе XMEM выводы для других функций (выводы PC5, PC6, PC7)

void XMEM_init(void)
{
// External memory interface enable
MCUCR |= (1<SRE);
XMCRA = 0;
//PC7..PC5 released pins
XMCRB |= (1<XMM1)|(1<XMM0);
}

После инициализации мы можем приступить к написанию основной программы. Простой код распределяет 255 Байт в хипе (куче) во внешней памяти:

#define BUFFER_SIZE 255
uint8_t *mem;
mem = malloc(BUFFER_SIZE);

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

uint8_t index;
// Fill memory incrementing values
for(index = 0; index < BUFFER_SIZE; index++)
{
   mem[index] = data++;
}
// Display memory block
for(index = 0; index < BUFFER_SIZE; index++)
{
   PRINTF("%02X ",mem[index]);
   if((index&0x0F) == 0x0F)
   {
      PRINTF("/n");
   }
}

В окне терминальной программы мы получим следующее сообщение:

В окне терминальной программы мы получим следующее сообщение

В этом случае начало heap-памяти находится по адресу 0×1221. Это означает, что секции .data и .bss находятся в адресном пространстве от 0×1100 до 0x121E. Проверить это можно, посмотрев .map файл. В нашем случае начальный адрес секции .data 0×1100, .bss секции - 0×1114. Указатель *mem указывает на начальный адрес heap 0x121E.

Рассмотрим другую ситуацию, когда вся область внешней памяти является областью, динамически распределяемой приложением. Для этого необходимо изменить конфигурацию компоновщика:

-Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x8030ff

Распределение памяти в этом случае будет такое:

Распределение памяти - Подключение внешней памяти к микроконтроллеру ATmega128

После компиляции программы в окне терминальной программы мы увидим:

После компиляции программы в окне терминальной программы мы увидим

Как вы видите, область heap размещается с самого начала внешней памяти. Первые два байта используются для хранения размера распределенной области памяти. В .map файле мы видим:

.data 0x00800100
.bss 0x00800114
__heap_start = 0x801100
__heap_end = 0x8030ff 

Сектор .data находится в начале внутреннего ОЗУ, затем следует сектор .bss, а область heap занимает весь объем внешнего ОЗУ.

Какую модель распределения памяти использовать – решает сам пользователь при разработке своего приложения. Еси вы рассчитываете использовать объемные буферы данных хранения графической информации для дальнейшего вывода на дисплей – определенно необходимо распределять внешнюю память только для heap. Если планируется реализация операционной системы реального времени с большим количеством задач – то, вероятно, лучше оставлять больше внутреннем ОЗУ для стека, а статические данные переместить во внешнее ОЗУ.

Загрузки

Исходный код к проекту - скачать.

scienceprog.com

Перевод: Vadim по заказу РадиоЛоцман

На английском языке: Adding External Memory to Atmega128. Part 2. Software

Содержание цикла «Подключение внешней памяти к микроконтроллеру ATmega128»

  1. Часть 1. Аппаратная реализация
  2. Часть 2. Программная часть
74 предложений от 36 поставщиков
MCU 128Kb FLASH, 4Kb RAM, 4Kb EEPROM, ISP, ADC,  = ATMEGA128A-U-TW ATMEGA128-16AU ATMEGA128L-8AI ATMEGA128-6AI ATMEGA128L-8AC ATMEGA128-16AUR ATMEGA128L-8AU ATMEGA128L-8AUR ATMEGA128-16AI ATMEGA128-16AC ATMEGA128-8AI...
ЗУМ-СМД
Россия
ATMEGA128A-AU
Microchip
35 ₽
AliExpress
Весь мир
USB-программатор USBASP, для самостоятельной сборки, с USB, ATMEGA8, ATMEGA128, ATtiny, CAN, PWM, с 10 контактами, с переходником 10 контактов на 6 контактов
46 ₽
Utmel
Весь мир
ATMEGA128A-AU
Microchip
от 240 ₽
Akcel
Весь мир
ATMEGA128A-AUR
Microchip
от 353 ₽
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя