Вот несколько предложений:
Вы вообще используете функцию отключения оперативной памяти (RAMCTL)?
Оперативная память состоит из n секторов. Каждый сектор может быть полностью отключен, чтобы сохранить утечку,
Однако все данные будут потеряны. Особенности оперативной памяти включают в себя:
• Память RAM имеет n секторов по 2 Кбайт каждый.
• Каждый сектор от 0 до n может быть полностью отключен, однако сохранение данных теряется.
• Каждый сектор от 0 до n автоматически переходит в режим сохранения низкой мощности, когда это возможно.
Какой-нибудь спящий режим используется? Я думаю о LPMx.5.
При вводе LPMx.5 (LPM3.5 или LPM4.5) регулятор напряжения модуля управления питанием
(PMM) отключен. Все ОЗУ и содержимое регистров потеряны.
Вы писали:
Когда я использую локальную переменную для копирования значения из этой статической переменной, оно, однако, не равно 0x3F.
Вы имеете в виду, что локальная копия не равна 0x3F, в то время как глобальная статика работает, или что копирование приводит к тому, что и копия, и глобальная статическая работа работают?
Если копирование делает обе работы, я полагаю, что на статические глобальные ссылки никогда не ссылаются. Сделай это volatile
.
Создание файла карты (Project-> Options-> Linker-> List, Создать список компоновщика, Карта сегментов, Карта модулей). Найдите файл карты в Debug / List и найдите свою глобальную статическую переменную. Он должен находиться в разделе DATA16_Z (или, возможно, в разделе DATA16_I, с соответствующим слотом в DATA16_ID для значения инициализации).
Если это не так, у вас есть проблема, я думаю, вы можете найти интересную информацию в EW430_CompilerReference.pdf, глава "Описания сегментов".
Можете ли вы попробовать написать на адрес 0x1CED из отладчика? Вы можете использовать окно памяти, чтобы проверить это, и прочитать обратно. Это подтвердит, что сам слот памяти работает.
Если это не работает, возможно, повреждена память вашего чипа. Это объясняет, почему у вас есть шаблон в пределах 0x1C00-0x1CFF, но не за его пределами.