Алексей ВМ 0 6 декабря, 2019 Опубликовано 6 декабря, 2019 · Жалоба Добрый день, Необходимо запускать все функции из SRAM, так как надо перезаписать флешь с кодом. Проблема в том, что функция, вызываемая из SRAM, обращается к служебным функциям, сидящим во флеше. Как перенести все функции в SRAM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 6 декабря, 2019 Опубликовано 6 декабря, 2019 · Жалоба 11 минут назад, Алексей ВМ сказал: Необходимо запускать все функции из SRAM, так как надо перезаписать флешь с кодом. Проблема в том, что функция, вызываемая из SRAM, обращается к служебным функциям, сидящим во флеше. Как перенести все функции в SRAM? Создать отдельную программу. В отдельном проекте. Так и делают бутлоадеры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 6 декабря, 2019 Опубликовано 6 декабря, 2019 (изменено) · Жалоба Это и есть отдельная программа. Она копируется из ROM в SRAM и оттуда запускается, но при этом происходит обращение к служебным функциям, например LCALL ?BANKED_ENTER_XDATA, которые находятся во флеше. #pragma default_function_attributes = @ "RAMCODE" void UpdateFirmware(void) { buf[0] = 0xBE; buf[1] = 0xEF; buf[2] = 0xDE; buf[3] = 0xAD; HalFlashWriteRAM(TEST_ADDR, buf, 1); LED_ON for(;;); } void HalFlashWriteRAM(uint16 addr, uint8 *buf, uint16 cnt) { halDMADesc_t *ch = HAL_NV_DMA_GET_DESC(); HAL_DMA_SET_SOURCE(ch, buf); HAL_DMA_SET_DEST(ch, &FWDATA); HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN); HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE)); HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE); HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE); HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH); HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1); HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0); // The DMA is to be polled and shall not issue an IRQ upon completion. HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE); HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS); HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH); HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH); HAL_DMA_ARM_CH(HAL_NV_DMA_CH); FADDRL = (uint8)addr; FADDRH = (uint8)(addr >> 8); FCTL |= 0x02; // Trigger the DMA writes. while (FCTL & 0x80); // Wait until writing is done. //LED_ON //for(;;); } #pragma default_function_attributes = Например, вызов функции HalFlashWriteRAM(TEST_ADDR, buf, 1); порождает вызов LCALL ?BANKED_ENTER_XDATA Изменено 6 декабря, 2019 пользователем Алексей ВМ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 6 декабря, 2019 Опубликовано 6 декабря, 2019 · Жалоба 21 минуту назад, Алексей ВМ сказал: Это и есть отдельная программа. Она копируется из ROM в SRAM и оттуда запускается, но при этом происходит обращение к служебным функциям, например LCALL ?BANKED_ENTER_XDATA, которые находятся во флеше. Например, вызов функции HalFlashWriteRAM(TEST_ADDR, buf, 1); порождает вызов LCALL ?BANKED_ENTER_XDATA Ну значит часть этой программы у Вас слинковалась во флешь. Например - все эти функции типа HAL_DMA_...() где находятся? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 6 декабря, 2019 Опубликовано 6 декабря, 2019 (изменено) · Жалоба Это макросы. Насколько я понял, служебные функции вызываются при использовании параметров в вызове функции. Если тело функции HalFlashWriteRAM() использовать в функции UpdateFirmware(), то все работает отлично. Изменено 6 декабря, 2019 пользователем Алексей ВМ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться