Речь шла о CodeMaster++[арм], который поддерживает К1921ВК01Т.
CodeMasterARM - другой программный продукт.
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
Речь шла о CodeMaster++[арм], который поддерживает К1921ВК01Т.
Да прямо вот главный даташит и читайте, там пять с половиной регистров на всё-про-всё...Хотелось бы узнать, существует ли какая-либо документация (или, может быть, примеры) по перепрограммированию загрузочной Flash-памяти во время работы. В первую очередь интересует, есть ли аналог библиотек Flash28XXX_API_XXX.lib от ti.
Код: Выделить всё
/**
* Функция записи 4 32-разрядных слов (или 8 16-разрядных).
* Также осуществляет проверку возможности прожига (т.е. не пытаемся ли мы
* прожечь битик "1" в битик "0", ведь мы можем только менять "1" на ноль,
* а не наоброт).
*
* @param address - адрес, куда прожечь
* @param dataBuf - указатель на буфер с данными (16 бит) для прожига
* @param status - подробный результат операции
* @param memoryType - "0" работать с основным блоком, "1" - работать с инфо-блоком
* @return
*/
__attribute__((section(".fastcode")))
Uint16 Niiet_Flash_Write_Words(Uint32 address, Uint16* dataBuf, FLASH_ST* status, Uint16 memoryType){
Uint32 timeOutCounter;
Uint16 i;
volatile Uint32 readVal, writeVal, tempVal;
// Для начала очистим статусное слово и регистры данных.
NT_BOOTFLASH->FCIC = 0x3;
NT_BOOTFLASH->FMD0 = 0xFFFFFFFF;
NT_BOOTFLASH->FMD1 = 0xFFFFFFFF;
NT_BOOTFLASH->FMD2 = 0xFFFFFFFF;
NT_BOOTFLASH->FMD3 = 0xFFFFFFFF;
// Загружаем адрес, данные и шьём
NT_BOOTFLASH->FMA = address;
NT_BOOTFLASH->FMD0 = *((Uint32*)(dataBuf + 0));
NT_BOOTFLASH->FMD1 = *((Uint32*)(dataBuf + 2));
NT_BOOTFLASH->FMD2 = *((Uint32*)(dataBuf + 4));
NT_BOOTFLASH->FMD3 = *((Uint32*)(dataBuf + 6));
if (memoryType == MEMORY_BLOCK_MAIN) NT_BOOTFLASH->FMC = (BOOTFLASH_KEY | BOOTFLASH_CMD_WRITE);
else if (memoryType == MEMORY_BLOCK_SECURE) NT_BOOTFLASH->FMC = (BOOTFLASH_KEY | BOOTFLASH_CMD_WRITEINFO);
timeOutCounter = 0;
while(NT_BOOTFLASH->FCIS == 0x0){
timeOutCounter++;
if (timeOutCounter > BOOTFLASH_MAX_WAITCLOCKS){
status->FirstFailAddr = address;
return BOOTFLASH_WRITE_TIMEOUT;
}
};
// Проверяем, не получили ли ошибку
if (NT_BOOTFLASH->FCIS_bit.OP_ERROR){
status->FirstFailAddr = address;
return BOOTFLASH_WRITE_HARDFAULT;
}
// Раз сюда дошли - всё хорошо. Очищаем статус и возвращаем успех
NT_BOOTFLASH->FCIC = 0x3;
return BOOTFLASH_ERROR_OK;
}
Код: Выделить всё
Энвик_SystemReset();
Код: Выделить всё
NT_COMMON_REG->APB_CLK_bit.WDEN = 1;
NT_COMMON_REG->PER_RST0_bit.WDRST = 1;
NT_WDT->LOAD = 0x1000;
NT_WDT->CTRL = WDT_CTRL_INTEN_Msk | WDT_CTRL_RESEN_Msk;
Все верно, таким образом включается WatchDogTimer,при этом необходимо объявить обработчик прерывания WWDG_IRQHandler, т.к. по умолчанию компилятор вставляет Default_Handler, содержащий бесконечный цикл.pavel писал(а): ↑24 сен 2018, 13:47 Добрый день.
Возникла проблема с программным сбросом контроллера.
При выполнении следующего кода:илиКод: Выделить всё
Энвик_SystemReset();
контроллер попадает в обработчик прерывания по умолчанию (Default_Handler, содержащий бесконечный цикл), а не в Reset_Handler. С чем это может быть связано?Код: Выделить всё
NT_COMMON_REG->APB_CLK_bit.WDEN = 1; NT_COMMON_REG->PER_RST0_bit.WDRST = 1; NT_WDT->LOAD = 0x1000; NT_WDT->CTRL = WDT_CTRL_INTEN_Msk | WDT_CTRL_RESEN_Msk;
Объявление обработчика прерывания WWDG_IRQHandler ничего не дало.Все верно, таким образом включается WatchDogTimer,при этом необходимо объявить обработчик прерывания WWDG_IRQHandler, т.к. по умолчанию компилятор вставляет Default_Handler, содержащий бесконечный цикл.
А действительно ли всё это нужно для сброса процессора?