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

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

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

hgost
Сообщения: 58
Зарегистрирован: 14 дек 2015, 12:07
Предприятие: АО НИИЭТ
Откуда: НИИЭТ
Contact:

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

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

prostoRoman писал(а):
26 сен 2018, 12:12
А действительно ли всё это нужно для сброса процессора?
Может будет достаточно глобально отключить прерывания и просто ждать? (_ISB(); _DSB(); while(1);)
Если просто нужно сбросить программно контроллер немедленно, можно воспользоваться системным регистром SCB->AIRCR
или напрямую через его адрес в памяти, если этого регистра нет в используемых Вами хедерах
*((volatile uint32_t *)(0xE000ED0C )) = (uint32_t)0x05FA0001;

bahoo08
Сообщения: 14
Зарегистрирован: 10 сен 2018, 14:15
Предприятие: .

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

Сообщение bahoo08 » 01 окт 2018, 16:19

Не могу разобраться с тем, как можно работать с АЦП с использованием двух каналов одного АЦП. Как я понял, записи идут в буфер по порядку, сначала канал А, потом канал В. Если рассматривать буфер нулевого секвенсора, то там может хратиться 32 значения. Таким образом в каждой нечётной ячейке будет лежать значение канала A. Что я получаю, когда считываю с регистра DATA? Всё содержимое буфера? Но как в 16 битах могут лежать 32 значения. Или я чего-то не понимаю? Там ещё говорится, что после каждого выполненного измерения генерируется прерывание, таким образом я должен обработать это прерывание и считать это в нужную мне переменную? Обработку по одному каналу АЦП я осилил, но вот работу с двумя каналами на одном АЦП что-то не понимаю.

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

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

Сообщение Лашкевич » 01 окт 2018, 18:28

При каждом новом обращении к регистру DATA fifo эта ячейка освобождается, и при следующем обращении вычитывается новое измеренное значение. Можете посмотреть пример работы с FIFO здесь. Еще, для простоты, можно не использовать FIFO, а включить компараторы и считывать всегда последнее новое оцифрованное значение с регистра данных компарататора, типа в ините сделать
NT_ADC->DCCTL_bit[0].CHNL = 0;
NT_ADC->DCCTL_bit[1].CHNL = 1;

и потом впри чтении
ch1=NT_ADC->DCVAL_bit[0].VAL;
ch2=NT_ADC->DCVAL_bit[1].VAL;
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/

bahoo08
Сообщения: 14
Зарегистрирован: 10 сен 2018, 14:15
Предприятие: .

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

Сообщение bahoo08 » 01 окт 2018, 19:29

Спасибо, ваш вариант помог. Меня ввело в замешательство с буфером то, что почему-то в таком варианте считывалось только с одного канала, и весь буфер был заполнен значением только от одного канала.
buf[0] = NT_ADC -> SEQ[0].FIFO_b.DATA;
buf[1] = NT_ADC-> SEQ[0].FIFO_b.DATA;

bahoo08
Сообщения: 14
Зарегистрирован: 10 сен 2018, 14:15
Предприятие: .

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

Сообщение bahoo08 » 15 окт 2018, 16:27

Возникли проблемы с Keil`ом и переменными типа float и double. Настроил аналогично, как в примере с blinky под Keil, к сожалению всё также. Поковырялся, всё-равно зависает камень. При чём __FPU_PRESENT выставлен в 1.

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

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

Сообщение Лашкевич » 15 окт 2018, 16:30

Возникли проблемы с Keil`ом и переменными типа float и double. Настроил аналогично, как в примере с blinky под Keil, к сожалению всё также. Поковырялся, всё-равно зависает камень. При чём __FPU_PRESENT выставлен в 1.
Что именно также? Также, как что? Можете описать подробно симптомы - на какой строчке виснет, что там в дизассемблерном коде, какие команды вызывает, как именно виснет?
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/

bahoo08
Сообщения: 14
Зарегистрирован: 10 сен 2018, 14:15
Предприятие: .

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

Сообщение bahoo08 » 15 окт 2018, 16:55

Лашкевич писал(а):
15 окт 2018, 16:30
Возникли проблемы с Keil`ом и переменными типа float и double. Настроил аналогично, как в примере с blinky под Keil, к сожалению всё также. Поковырялся, всё-равно зависает камень. При чём __FPU_PRESENT выставлен в 1.
Что именно также? Также, как что? Можете описать подробно симптомы - на какой строчке виснет, что там в дизассемблерном коде, какие команды вызывает, как именно виснет?
Чтобы понятней было, приведу пример на примере, который вы выкладывали в среде Keil на мигание светодиодом. Если я немного изменю ваш пример

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

float j = 1.5f;
int main (void){
	
	InitCLK();

	LED_init();

	while(1)
	{
		j += 1.6f;
		LED_blink();
	}
}
В точке j += 1.6f; зависает
скриншот https://yadi.sk/i/5gFX3iJN8uxUAw
Вот после этой стрелки уже никуда не идёт. Сам же проц не откликается ни на какие события извне. Т.е я могу настроить прерывания, если я в какой-то момент смогу использовать float, то даже на прерывания не будет реагировать.На различных форумах по АРМам вычитал схожие симптомы, но они сводились к тому, что FPU не был включён.

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

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

Сообщение Лашкевич » 15 окт 2018, 17:20

Я не помню, что делает __FPU_PRESENT и где он выставляется, но внутри самого микроконтроллера модуль FPU включается так:

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

    NT_SYSTEM->CPACR_bit.CP10 = 0b11;
    NT_SYSTEM->CPACR_bit.CP11 = 0b11;
или вот так на гнутом ассемблере:

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

  ldr.w R0, =0xE000ED88
  ldr R1, [R0]
  orr R1, R1, #(0xF << 20)
  str R1, [R0]
  dsb
  isb /*reset pipeline now the FPU is enabled*/
попробуйте поискать это в кейловском проекте, и, если нет, вписать куда-нибудь.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/

bahoo08
Сообщения: 14
Зарегистрирован: 10 сен 2018, 14:15
Предприятие: .

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

Сообщение bahoo08 » 15 окт 2018, 17:40

Лашкевич писал(а):
15 окт 2018, 17:20
Я не помню, что делает __FPU_PRESENT и где он выставляется, но внутри самого микроконтроллера модуль FPU включается так:

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

    NT_SYSTEM->CPACR_bit.CP10 = 0b11;
    NT_SYSTEM->CPACR_bit.CP11 = 0b11;
или вот так на гнутом ассемблере:

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

  ldr.w R0, =0xE000ED88
  ldr R1, [R0]
  orr R1, R1, #(0xF << 20)
  str R1, [R0]
  dsb
  isb /*reset pipeline now the FPU is enabled*/
попробуйте поискать это в кейловском проекте, и, если нет, вписать куда-нибудь.
Огромное спасибо. Странно, что NT_SYSTEM в последней версии K1921VK01T.h с Bitbacker`a нет. Скопировал этот хэдер из того, что прилагался к vectorIde. Добавил, что вы сказали. Всё работает))

bahoo08
Сообщения: 14
Зарегистрирован: 10 сен 2018, 14:15
Предприятие: .

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

Сообщение bahoo08 » 18 окт 2018, 18:21

Добрый день, небольшой вопрос по драйверу модбаса. Я его добавил в проект, всё настроил. Модбас работает, вот только смущает то, что он, похоже, не успевает отработать полностью за минимальную частоту вызова (которая предлагается в 5кГц). Под этим я имею в виду, что если ставлю точку останова в цикле while, со временем, в этот цикл вообще не возвращается программа. Модбас работает, посылки принимает, отправляет. Можно редактировать параметры, однако в бесконечный цикл он даже не возвращается. Это так и должно быть или я что-то не так настроил?
Если я добавляю прерывание с бОльшим приоритетом, тогда прерывание по таймеру может не вызваться больше.

Ответить

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя