К1921ВГ015 общее

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

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

Аватара пользователя
maxlab
Сообщения: 28
Зарегистрирован: 05 дек 2025, 10:29
Предприятие: Пенсионер фрилансер
Откуда: Краснодар,RU

Re: К1921ВГ015 общее

Сообщение maxlab »

Доброй ночи!

Наткнулся на странное поведение... Представьте себе что нужно настроить пины РА14 и РА15 на вход с поддтяжкой, Т.е. PULLUP
Настраиваю такой последовательностью команд

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

case INPUT_PULLUP:
	GPIO_OutCmd(port, pin_Map[pin].halPin, DISABLE);
	GPIO_PullModeConfig(port, pin_Map[pin].halPin, GPIO_PullMode_PU);
	break;
На пинах появляется 3.3в - вроде все нормально. Замыкая эти пины на землю считываю с этих пинов 0.Тоже все хорошо.
Но если приаттачить к этим пинам обработчики прерывания, начинается чехарда
Настраиваю такой последовательностью

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

static voidFuncPtr GPIO_Irq_Table[GPIO_PIN_NUMS]={NULL};

void attachInterrupt(PINS interruptNumber, voidFuncPtr callback, PinStatus mode)
{
	GPIO_Irq_Table[interruptNumber] = callback;


	if(mode == CHANGE)
	{
		GPIO_ITTypeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntType_Edge);
		GPIO_ITEdgeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntEdge_Any);
	}
	else if (mode == FALLING)
	{
		GPIO_ITTypeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntType_Edge);
		GPIO_ITEdgeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin,  GPIO_IntEdge_Polarity);
		GPIO_ITPolConfig(pin_Map[interruptNumber].pPort,pin_Map[interruptNumber].halPin, GPIO_IntPol_Negative);
	}
	else if (mode == RISING)
	{
		GPIO_ITTypeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntType_Edge);
		GPIO_ITEdgeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntEdge_Polarity);
		GPIO_ITPolConfig(pin_Map[interruptNumber].pPort,pin_Map[interruptNumber].halPin, GPIO_IntPol_Positive);
	}
	else if (mode == LOW)
	{
		GPIO_ITTypeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntType_Level);
		GPIO_ITPolConfig(pin_Map[interruptNumber].pPort,pin_Map[interruptNumber].halPin, GPIO_IntPol_Negative);
	}
	else if (mode == HIGH)
	{
		GPIO_ITTypeConfig(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, GPIO_IntType_Level);
		GPIO_ITPolConfig(pin_Map[interruptNumber].pPort,pin_Map[interruptNumber].halPin, GPIO_IntPol_Positive);
	}

	GPIO_ITCmd(pin_Map[interruptNumber].pPort, pin_Map[interruptNumber].halPin, ENABLE);

	if (!GPIO_Interrupt_Init)
	{
		SetIrqHandler(IsrVect_IRQ_GPIO, GPIO_IRQManager,0x1);
		GPIO_Interrupt_Init = true;
	}
}
Менеджер нормально разруливает с какой ноги пришел перепад уровня в любом из режимов CHANGE/RISING/FALLING

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

void GPIO_IRQManager()
{
	for(uint8_t i = 0; i < GPIO_PIN_NUMS; i++)
	{
		if(GPIO_Irq_Table[i] == NULL) continue;
		FlagStatus pinStat = GPIO_ITStatus(pin_Map[i].pPort, pin_Map[i].halPin);
		if (pinStat == SET)
		{
			GPIO_ITStatusClear(pin_Map[i].pPort, pin_Map[i].halPin);
			GPIO_Irq_Table[i]();
		}
	}
}
В итоге срабатывают обработчики которые находятся в теле скетча

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

void isr_Enc_A()
{
	digitalToggle(LED1);
	digitalToggle(LED);
	printf("Enc_A \n\r");
}

void isr_Enc_B()
{
	digitalToggle(LED2);
	digitalToggle(LED);
	printf("Enc_B \n\r");
}
Чехарда заключается в том, что на входных пинах, даже с подключенным/неподключенным (без разницы) энкодером, появляется полноценный меандр с частотой около 300 гц. И все это хозяйство как бы самовозбуждается :D
Что я делаю не так?
Девице - Device
Аватара пользователя
maxlab
Сообщения: 28
Зарегистрирован: 05 дек 2025, 10:29
Предприятие: Пенсионер фрилансер
Откуда: Краснодар,RU

Re: К1921ВГ015 общее

Сообщение maxlab »

maxlab писал(а): 01 мар 2026, 00:56 Что я делаю не так?
Всех приветствую! Оказывается опять дело не во мне :D
Накрылся, ни с того ни с сего, внутренний PLL медным тазом. Причем я искры не метал рядом :D и работаю с заземленным браслетом.
Процедура инициализации PLL штатная, я туда еще не успел залезть.
После перевода на тактирование SYSCLK_HSE (16mHz), все чудесным образом заработало.
Чип перепаивать не буду, пока и так сойдет. Но это странно
Девице - Device
Аватара пользователя
maxlab
Сообщения: 28
Зарегистрирован: 05 дек 2025, 10:29
Предприятие: Пенсионер фрилансер
Откуда: Краснодар,RU

Re: К1921ВГ015 общее

Сообщение maxlab »

maxlab писал(а): 01 мар 2026, 14:57
maxlab писал(а): 01 мар 2026, 00:56 Что я делаю не так?
После перевода на тактирование SYSCLK_HSE (16mHz), все чудесным образом заработало.
Чип перепаивать не буду, пока и так сойдет. Но это странно
Что еще замечено... Если тактирование от PLL включено то при подключении питания резкий бросок тока потребления, аж лампочки в USB хабе тухнут. Потом все быстренько восстанавливается. Конкретно инструментальными замерами не занимался.
А дальше чип начинает периодически сбрасываться. Поэтому я наблюдаю меандр на пинах с pullup. Т.е. переинициализация чипа с частотой около 300 гц. ХЗ что это такое...Может инженерам НИИЭТ эта инфа будет полезна.
Девице - Device
RabidRabbit
Сообщения: 136
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1921ВГ015 общее

Сообщение RabidRabbit »

maxlab писал(а): 01 мар 2026, 18:10 Может инженерам НИИЭТ эта инфа будет полезна.
Займитесь лучше своим кодом ;) Явно баг на баге сидит и багом погоняет.
Аватара пользователя
maxlab
Сообщения: 28
Зарегистрирован: 05 дек 2025, 10:29
Предприятие: Пенсионер фрилансер
Откуда: Краснодар,RU

Re: К1921ВГ015 общее

Сообщение maxlab »

RabidRabbit писал(а): 01 мар 2026, 19:02 Займитесь лучше своим кодом ;) Явно баг на баге сидит и багом погоняет.
Не преувеличивайте корявость моего кода :)
И где конкретно, по Вашему мнению, я накосячил?
В штатную процедуру настройки PLL я не лез. В PLIB015 внес одно изменение к тактированию не имеющее отношения.
Девице - Device
RabidRabbit
Сообщения: 136
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1921ВГ015 общее

Сообщение RabidRabbit »

Не использую plib015. И на практике косяки именно в коде, а не в "железе" или компиляторе. Просто обвинить железяку и компилятор проще всего обычно :)
fog
Сообщения: 18
Зарегистрирован: 21 май 2025, 09:32
Предприятие: ***

Re: К1921ВГ015 общее

Сообщение fog »

maxlab писал(а): 01 мар 2026, 14:57 Процедура инициализации PLL штатная, я туда еще не успел залезть.
После перевода на тактирование SYSCLK_HSE (16mHz), все чудесным образом заработало.
Писал уже об этом
3. Стр.2 -> - внутренний RC генератор HSI: 1МГц
стр.24 -> - коэффициент деления обратной связи (без дробного делителя) 16 ≤ FBDIV ≤ 160;
- значение частоты fVCO должно быть в диапазоне (200 – 1600) МГц;
с коэф 160 невозможно получить минимум 200МГц от HSI 1МГц, да и HSI 1МГц не подходит под минимальную частоту fREF должна находиться в
диапазоне от 10 МГц до 30 МГц, поэтому вопрос вообще возможно использование HSI для постоянного тактирования через PLL, или HSI
предусмотрен только для старта, с последующим переключением на HSE?
Аватара пользователя
maxlab
Сообщения: 28
Зарегистрирован: 05 дек 2025, 10:29
Предприятие: Пенсионер фрилансер
Откуда: Краснодар,RU

Re: К1921ВГ015 общее

Сообщение maxlab »

RabidRabbit писал(а): 02 мар 2026, 02:52 И на практике косяки именно в коде, а не в "железе" или компиляторе. Просто обвинить железяку и компилятор проще всего обычно :)
Согласен, обычно так и бывает.
Но это не наш случай :) Работоспособность PLL можно проверить не только опцией CKO_PLL0, но и вызовом функций mslip() и uslip() из mtimer.c
Если они адекватно отработают - все нормально. Если получите зависон - PLL склеил ласты и переключаемся на SYSCLK_HSE. А там все работает.
Я уже заново создал пустой проект чтобы исключить "ошибку выжившего" и там проверял без всяких plib015.
Есть подозрение что мой ослик сидит на другой фазе и он питается не через разделительный трансформатор. А макетка с компом на другой фазе. И когда земляной крокодил цепляю к макетке - проскакивает искра. Может это причина выхода из строя PLL. Выравнивание потенциалов может создать кучу проблем, если специально с этим не бороться. А про заземление аппаратуры... не, это не про нас :)
Девице - Device
Аватара пользователя
maxlab
Сообщения: 28
Зарегистрирован: 05 дек 2025, 10:29
Предприятие: Пенсионер фрилансер
Откуда: Краснодар,RU

Re: К1921ВГ015 общее

Сообщение maxlab »

fog писал(а): 02 мар 2026, 09:49
..... или HSI предусмотрен только для старта, с последующим переключением на HSE?
Контроллер стартует на внутреннем RC 1мГц (HSI)
В зависимости от опции SYSCLK_HSI/SYSCLK_HSE/SYSCLK_PLL в функции ClkInit() происходит выбор источника для тактирования.
В случае с PLL нужна также опция HSECLK_VAL с номиналом кварца который вы используете.
Девице - Device
Аватара пользователя
maxlab
Сообщения: 28
Зарегистрирован: 05 дек 2025, 10:29
Предприятие: Пенсионер фрилансер
Откуда: Краснодар,RU

Re: К1921ВГ015 общее

Сообщение maxlab »

maxlab писал(а): 02 мар 2026, 10:58 В случае с PLL/HSE нужна также опция HSECLK_VAL с номиналом кварца который вы используете.
Эти номиналы прибиты гвоздями в той же функции ClkInit()
Девице - Device
Ответить

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