Vector IDE

sergey_the_great
Сообщения: 17
Зарегистрирован: 09 дек 2016, 18:55

Re: Vector IDE

Сообщение sergey_the_great » 12 дек 2016, 17:45

Спасибо Максим, я разобрался. Проблема была в плате собственной сборки. У меня еще вопрос: получалось ли у вас запустить FreeRTOS или CMSIS RTOS RTX на данный процессор (плату)?

Аватара пользователя
Лашкевич Максим
Сообщения: 183
Зарегистрирован: 30 дек 2015, 10:38

Re: Vector IDE

Сообщение Лашкевич Максим » 13 дек 2016, 11:49

Нет, мы даже и не пытались, мы на фирме для задач электропривода больше придерживаемся религии bare metal programming. С такими вопросами, наверное, лучше обратиться на форум НИИЭта (http://forum.niiet.ru/viewforum.php?f=37).
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.

sergey_the_great
Сообщения: 17
Зарегистрирован: 09 дек 2016, 18:55

Re: Vector IDE

Сообщение sergey_the_great » 27 дек 2016, 18:28

Скажите пожалуйста Максим, я хочу добавить обработчики прерываний на UART1 по RX и TX. Достаточно ли для этого в файле с main просто создать процедуры с правильными названиями и эти процедуры будут автоматически распознаны как обработчики прерываний? Надо ли эти процедуры правильно чередовать в файле?

sergey_the_great
Сообщения: 17
Зарегистрирован: 09 дек 2016, 18:55

Re: Vector IDE

Сообщение sergey_the_great » 28 дек 2016, 13:08

Максим, а вы не могли бы выслать пример работы с UART, у меня не получается. Непонятна привязка процедур обработки прерываний к векторам. Мой адрес ***************@mail.ru. Спасибо.

Аватара пользователя
Лашкевич Максим
Сообщения: 183
Зарегистрирован: 30 дек 2015, 10:38

Re: Vector IDE

Сообщение Лашкевич Максим » 28 дек 2016, 14:59

Добрый день. С уартом можно работать и без прерываний. А процесс организации процедур обработки прерываний к самому уарт отношения не имеет. Как работать с прерываниями показано в примерах, которые идут вместе с VectorIDE - там есть прерывания от таймеров. А для работы с UART можно посмотреть библиотеку UART на битбакете НИИЭТ https://bitbucket.org/niietcm4/niietcm4_pd
Да и ничего там сложно нет, вот инициализация уарта из одного из наших драйверов (без прерываний)

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

	// Выбрать и разрешить периферийную функцию
	NT_COMMON_REG->GPIOPCTLD_bit.PIN1 = 1;	 //UART_TxD[3]
	NT_COMMON_REG->GPIOPCTLD_bit.PIN2 = 1;	//UART_RxD[3]
	NT_GPIOD->ALTFUNCSET = (1 << 1) + (1 << 2);

	// Изменить периферийную функцию F12 и F13, чтобы они не заблокировали UART3
	NT_COMMON_REG->GPIOPCTLF_bit.PIN12 = 1;
	NT_COMMON_REG->GPIOPCTLF_bit.PIN13 = 1;

	NT_UART3->CR_bit.UARTEN = 1; // Разрешить работу UART_3

	// Натсройка частоты в двух регистрах:
	// задание делителя частоты для получения BaudRate
	// Т.к. блок UART тактируется с частотой 25 МГц (так настроено в ините микроконтроллера),
	// то для получения частоты 57600 бит/с необходим
	// делитель 25000000 / (16 * 57600) = 27,126736111111111111111111111111
	// Целая часть I = 27
	// Дробная часть F = (int)( 0.126736111*64 + 0.5 ) = 8
	// Формулы см. в документации
	NT_UART3->IBRD_bit.BAUD_DIVINT = 27;
	NT_UART3->FBRD_bit.BAUD_DIVFRAC = 8;

	NT_UART3->LCR_H_bit.SPS = 0;		// Нет проверки четности
	NT_UART3->LCR_H_bit.WLEN = 3;		// Длина посылки 8 бит
	NT_UART3->LCR_H_bit.FEN = 1;		// Использовать FIFO
	NT_UART3->CR_bit.TXE = 1;			// Разрешить приём
	NT_UART3->CR_bit.RXE = 1;			// Разрешить передачу
	NT_UART3->LCR_H_bit.STP2 = 0;		// 1 стоп-бит
вот отправка

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

NT_UART3->DR_bit.DATA = 42
вот прием

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

			
if (NT_UART3->FR_bit.RXFE)
	return;
temp_byte = NT_UART3->DR_bit.DATA;
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.

sergey_the_great
Сообщения: 17
Зарегистрирован: 09 дек 2016, 18:55

Re: Vector IDE

Сообщение sergey_the_great » 29 дек 2016, 08:15

Спасибо за примеры, но я не понял как происходит назначение вектору прерывания функции для его обработки? Тут есть "магическое название" функции или привязка происходит по другому? Как должна называться функция для прерывания UART1_RX? UART1_RX_IRQHandler или по-другому? И как указать, что процедура UART1_RX_IRQHandler обрабатывает прерывание UART1_RX_IRQn?

sergey_the_great
Сообщения: 17
Зарегистрирован: 09 дек 2016, 18:55

Re: Vector IDE

Сообщение sergey_the_great » 29 дек 2016, 08:34

В примере с таймерами не раскрыто как должна называться функция для прерывания UART1_RX и где указывается, что именно эта функция, а не какая-то другая является обработчиком именно этого прерывания.

Аватара пользователя
Лашкевич Максим
Сообщения: 183
Зарегистрирован: 30 дек 2015, 10:38

Re: Vector IDE

Сообщение Лашкевич Максим » 29 дек 2016, 13:24

Как и во всех кортексах. Есть вектор прерываний g_pfnVectors, где лежат адреса обработчиков прерываний. Их заполняет пользователь. В файле asm/startup_MCP_gcc.S этот вектор заполняется "пустыми" метками, если функция с таким именем встречается где-то в коде, то она линкуется как обработчик прерывания. Собственно, в этом файле можно и посмотреть все названия, и поменять если надо. Указатель на этот вектор прерываний задается в регистре SCB->VTOR в инициализации, в функции Timer_and_interrupt_init.
С уважением,
Лашкевич Максим.
skype: maxlashk
Инженер-программист ООО "НПФ Вектор", Москва.

sergey_the_great
Сообщения: 17
Зарегистрирован: 09 дек 2016, 18:55

Re: Vector IDE

Сообщение sergey_the_great » 29 дек 2016, 14:20

Спасибо большое Максим. Я разобрался, просто напутал с Регистром маски прерываний. Думал он наоборот работает.

sergey_the_great
Сообщения: 17
Зарегистрирован: 09 дек 2016, 18:55

Re: Vector IDE

Сообщение sergey_the_great » 30 дек 2016, 11:08

Добрый день Максим. У меня такой вопрос. Можно ли фукцией memcpy считывать данные из пользовательской FLASH памяти. И как этой функции указать, что работаешь с пользовательской Flash, а не загрузочной?

Ответить