Заголовок сообщения: Программирование flash памяти в MSP430G2553
Добавлено: Пн мар 11, 2019 12:47:27
Родился
Зарегистрирован: Пн мар 11, 2019 12:21:32 Сообщений: 1
Рейтинг сообщения:0
Добрый день! Хочу сохранить в постоянной Flash памяти число int от 0 до 255. Программу написал используя пример библиотеки mspflash.h но после нажатия Reset переменная "counter" не сохраняется. Не совсем понимаю как в Energia работают функции Flash.read и Flash.write.
Вот пример кода для чтения и записи во флеш память.
Код:
// Чтение из флеш памяти от adr_start, до adr_end в массив ID_RKU_R // Значения adr_start и adr_end должны быть кратны 2, и adr_start должно быть меньше adr_end void Read_FLASH_MEMORY(unsigned int adr_start, unsigned int adr_end) { unsigned short *Flash_ptr = (unsigned short *)adr_start;// Начальный адрес флэш-памяти unsigned int d0; if ((adr_start < adr_end) && ((adr_end-adr_start) != 1)) // Защита от дурака { for (d0=0; d0<=(adr_end-adr_start)/2; d0++) { unsigned int a = adr_start+(d0*2); // Адрес ячейки памяти = "a" *Flash_ptr = a; // Указываем на адрес ячейки памяти Flash_ptr откуда нужно читать ID_RKU_R[d0] = *Flash_ptr; // Читаем в "ID_RKU[d0]" данные хранящиеся в ячейке памяти "Flash_ptr" } } }
// Запись во флеш память от adr_start, до adr_end массив данных flash_data // Значения adr_start и adr_end должны быть кратны 2, и adr_start должно быть меньше adr_end void Write_FLASH_MEMORY(unsigned int adr_start, unsigned int adr_end) { unsigned short *Flash_ptr = (unsigned short *)adr_start;// Начальный адрес флэш-памяти unsigned int d0; __disable_interrupt(); // Глобальное запрещение прерываний if ((adr_start < adr_end) && ((adr_end-adr_start) != 1)) // Защита от дурака { for (d0=0; d0<=(adr_end-adr_start)/2; d0++) { FCTL3 = FWKEY; // Снимаем блокирующий бит FCTL1 = FWKEY + ERASE; // Разрешаем стирание *Flash_ptr = 0; // Фиктивная запись для стирания флеш-сегмента FCTL1 = FWKEY + WRT; // Установить бит WRT для операции записи *Flash_ptr = flash_data[d0];// Записываем значение flash_data во флеш память с адресом Flash_ptr FCTL1 = FWKEY; // Сбросить бит записи FCTL3 = FWKEY + LOCK; // Устанавливаем бит блокировки ID_RKU_W[d0] = *Flash_ptr; // Читаем в "ID_RKU[d0]" значение "flash_data" хранящееся в "Flash_ptr" (проверка) *Flash_ptr++; } } __enable_interrupt(); // Глобальное разрешение прерываний }
Добавлено after 2 minutes 16 seconds: Пример вызова подпрограммы.
Честно говоря не проверял запись в занятые адреса (например 00001c18, отвечающий за ACP_results в .map файле моего проекта), да и не советую. Лучше пользоваться теми адресами, которые прописаны в .cmd файле, а именно в распределении карты памяти, где прописано сколько и с какого адреса начинается какой либо раздел. (работать лучше в разделе FLASH)
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Доброго времени суток, написал небольшую прогу, но работает както не правильно. может кто подскажет в чём ошибка.
Код:
unsigned short *Flash_ptr = (unsigned short *)0x8000;// Начальный адрес флэш-памяти /** * main.c */ int main(void) { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer FCTL3 = FWKEY; // Снимаем блокирующий бит FCTL1 = FWKEY + ERASE; // Разрешаем стирание *Flash_ptr = 0; // Фиктивная запись для стирания флеш-сегмента FCTL1 = FWKEY + WRT; // Установить бит WRT для операции записи *Flash_ptr = 0x4303;// Записываем значение flash_data во флеш память с адресом Flash_ptr (nop) *Flash_ptr++; *Flash_ptr = 0x1300;// Записываем значение flash_data во флеш память с адресом Flash_ptr (reti) FCTL1 = FWKEY; // Сбросить бит записи FCTL3 = FWKEY + LOCK; // Устанавливаем бит блокировки //__asm (" MOV.W #0x8000,R15 "); //__asm (" CALL &R15"); $0x8000: ((void(*)() )0x8000)(); // Переход по адресу 0х8000 __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); goto $0x8000;
Во флеш записывает всё правильно (в 8000 адрес пишет команду nop, в адрес 8002 - reti), но после ((void(*)() )0x8000)() переходит на адрес 0х0000, и благополучно там висит... Что не так?
Добавлено after 46 minutes 25 seconds: Нашёл в чём дело. Выполняя команду выхода из адреса 0х8002, происходит переход на адрес 0х0000. Вобщем в адрес 0х8003 нужно записать куда переходить.
Добавлено after 33 minutes 36 seconds: Нужно было вместо команды RETI (0x1300), ввести команду RETA (0x0110). Тогда выход происходит сразу после выполнения ((void(*)() )0x8000)();
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения