К1921ВК01Т (ARM Cortex-M4F)

32-разрядные микроконтроллеры разработки ОАО "НИИЭТ"

Модераторы: pip, _sva_

bkolbov
Сообщения: 120
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: К1921ВК01Т (ARM Cortex-M4F)

Сообщение bkolbov » 13 авг 2018, 10:07

Max R писал(а):
11 авг 2018, 02:58
bkolbov писал(а):
27 июн 2018, 10:52
leontiev писал(а):
26 июн 2018, 18:31
А схема подключения дешевого STLink V2 подразумевает доп.компоненты на стороне контроллера? Или напрямую, SWDIO - на вывод B1 (JTAG TMS), SWCLK - на B2 (JTAG TCK)?
И еще один вопрос - будет ли работать с CodeMaster?
Codemaster работает только c JEM-NT-CM4, STLink и JLink не поддерживаются.
bkolbov!
J Link - единственный отладчик, который поддержан во всех популярных средах: Keil, IAR и CodeMasterARM.
| Показать
J Link.jpg
Речь шла о CodeMaster++[ARM], который поддерживает К1921ВК01Т.
CodeMasterARM - другой программный продукт.

Max R
Сообщения: 11
Зарегистрирован: 07 май 2018, 22:58
Предприятие: Cyberdyne Systems

Re: К1921ВК01Т (ARM Cortex-M4F)

Сообщение Max R » 13 авг 2018, 22:01

Pardon moi!) Не посмотрел, но думаю добавить GDB-сервер не помешало бы...

pavel
Сообщения: 4
Зарегистрирован: 17 сен 2018, 14:08
Предприятие: Университет ИТМО

Re: К1921ВК01Т (ARM Cortex-M4F)

Сообщение pavel » 17 сен 2018, 14:16

Добрый день.

Хотелось бы узнать, существует ли какая-либо документация (или, может быть, примеры) по перепрограммированию загрузочной Flash-памяти во время работы. В первую очередь интересует, есть ли аналог библиотек Flash28XXX_API_XXX.lib от Texas Instruments.

Аватара пользователя
Лашкевич
Сообщения: 121
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Contact:

Re: К1921ВК01Т (ARM Cortex-M4F)

Сообщение Лашкевич » 18 сен 2018, 11:52

Хотелось бы узнать, существует ли какая-либо документация (или, может быть, примеры) по перепрограммированию загрузочной Flash-памяти во время работы. В первую очередь интересует, есть ли аналог библиотек Flash28XXX_API_XXX.lib от Texas Instruments.
Да прямо вот главный даташит и читайте, там пять с половиной регистров на всё-про-всё...
Вот пример нашей функции дня прожига слова

Код: Выделить всё

/**
 * Функция записи 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;
}
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/

pavel
Сообщения: 4
Зарегистрирован: 17 сен 2018, 14:08
Предприятие: Университет ИТМО

Re: К1921ВК01Т (ARM Cortex-M4F)

Сообщение pavel » 18 сен 2018, 14:16

Спасибо за быстрый ответ.

pavel
Сообщения: 4
Зарегистрирован: 17 сен 2018, 14:08
Предприятие: Университет ИТМО

Re: К1921ВК01Т (ARM Cortex-M4F)

Сообщение pavel » 24 сен 2018, 13:47

Добрый день.

Возникла проблема с программным сбросом контроллера.
При выполнении следующего кода:

Код: Выделить всё

NVIC_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;
контроллер попадает в обработчик прерывания по умолчанию (Default_Handler, содержащий бесконечный цикл), а не в Reset_Handler. С чем это может быть связано?

dav
Сообщения: 54
Зарегистрирован: 14 дек 2015, 09:21
Предприятие: АО НИИЭТ
Откуда: АО НИИЭТ, Воронеж

Re: К1921ВК01Т (ARM Cortex-M4F)

Сообщение dav » 24 сен 2018, 14:14

pavel писал(а):
24 сен 2018, 13:47
Добрый день.

Возникла проблема с программным сбросом контроллера.
При выполнении следующего кода:

Код: Выделить всё

NVIC_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;
контроллер попадает в обработчик прерывания по умолчанию (Default_Handler, содержащий бесконечный цикл), а не в Reset_Handler. С чем это может быть связано?
Все верно, таким образом включается WatchDogTimer,при этом необходимо объявить обработчик прерывания WWDG_IRQHandler, т.к. по умолчанию компилятор вставляет Default_Handler, содержащий бесконечный цикл.

pavel
Сообщения: 4
Зарегистрирован: 17 сен 2018, 14:08
Предприятие: Университет ИТМО

Re: К1921ВК01Т (ARM Cortex-M4F)

Сообщение pavel » 24 сен 2018, 15:42

Все верно, таким образом включается WatchDogTimer,при этом необходимо объявить обработчик прерывания WWDG_IRQHandler, т.к. по умолчанию компилятор вставляет Default_Handler, содержащий бесконечный цикл.
Объявление обработчика прерывания WWDG_IRQHandler ничего не дало.

При выполнении программы из RAM все работает нормально: контроллер сбрасывается и начинает выполняться программа, загруженная во Flash. Ход эксперимента:
1) зашил во Flash программу мигающую светодиодами
2) зашил в RAM программу, выполняющую сброс по кнопке и _не_ мигающую светодиодами
3) до нажатия кнопки, светодиоды не мигают, а после - мигают

Но тот же самый код не работает, при выполнении программы из Flash. При нажатии на кнопку контроллер попадает в Default_Handler независимо от того, объявлен WWDG_IRQHandler или нет. При этом стек вызовов выглядит так (первая строка меняется в зависимости от того, какие обработчики не равны Default_Handler):
USART3_TX_IRQHandler() at startup_MCP_gcc.S:108 0xf3c
<signal handler called>() at 0xfffffff9
Reset_Handler() at startup_MCP_gcc.S:55 0xee4

Аватара пользователя
Лашкевич
Сообщения: 121
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Contact:

Re: К1921ВК01Т (ARM Cortex-M4F)

Сообщение Лашкевич » 26 сен 2018, 11:45

Если программа по-разному себя ведет с точки зрения вызова прерываний при выполнении из RAM и из FLASH, то, возможно, проблема с настройкой таблицы векторов прерываний. Проверьте, куда в каком случае указывает регистр SCB->VTOR, и есть ли обработчик WWDG_IRQHandler в этой таблице и показывает ли он на правильную функцию.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/

prostoRoman
Сообщения: 32
Зарегистрирован: 11 июл 2014, 15:06

Re: К1921ВК01Т (ARM Cortex-M4F)

Сообщение prostoRoman » 26 сен 2018, 12:12

Лашкевич писал(а):
26 сен 2018, 11:45
... проблема с настройкой таблицы векторов прерываний. Проверьте, куда в каком случае указывает регистр SCB->VTOR, и есть ли обработчик WWDG_IRQHandler в этой таблице и показывает ли он на правильную функцию.
А действительно ли всё это нужно для сброса процессора?
Может будет достаточно глобально отключить прерывания и просто ждать? (_ISB(); _DSB(); while(1);)

Ответить

Вернуться в «32-разрядные микроконтроллеры на ядре ARM Cortex»

Кто сейчас на конференции

Сейчас этот форум просматривают: hgost и 1 гость