1921вк035, блок захвата перестает формировать прерывания

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

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

Ответить
aleks_e
Сообщения: 1
Зарегистрирован: 15 июл 2022, 19:05
Предприятие: АО "Геоптикс"

1921вк035, блок захвата перестает формировать прерывания

Сообщение aleks_e »

Здравствуйте. Проблема такая: микроконтроллер 1921вк035, настроены блоки захвата 0 и 1 на захват, если на соответствующих ножках микроконтроллера сформировать фронты 10-100 раз, то микроконтроллер перестает генерировать прерывания, оба канала ведут себя одинаково. Причем в регистре ECFLG будут формироваться соответствующие флаги, а регистр PEINT будет в нуле. Сигнал подаю с кнопки возможно дребезг так влияет.

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

int was_cap0 = 0;
int was_cap1 = 0;
uint32_t cap0, cap1;

void ECAP0_IRQHandler(void)
{
	ECAP0->ECCLR_bit.CEVT0 = 1;
	ECAP0->ECCLR_bit.INT = 1;
	ECAP0->PEINT_bit.PEINT = 1;
	
	cap0 = ECAP0->CAP0;
	was_cap0 = 1;
}

void ECAP1_IRQHandler(void)
{
	ECAP1->ECCLR_bit.CEVT0 = 1;
	ECAP1->ECCLR_bit.INT = 1;
	ECAP1->PEINT_bit.PEINT = 1;
	
	cap1 = ECAP1->CAP0;
	was_cap1 = 1;
}

void capture_init(void)
{
	RCU->HCLKCFG_bit.GPIOAEN = 1;
	
	GPIOA->DENSET_bit.PIN4 = 1;
	GPIOA->DENSET_bit.PIN5 = 1;
	
	GPIOA->ALTFUNCSET_bit.PIN4 = 1;
	GPIOA->ALTFUNCSET_bit.PIN5 = 1;
	
	SIU->REMAPAF_bit.ECAP0EN = 1;
	SIU->REMAPAF_bit.ECAP1EN = 1;
	
	RCU->PCLKCFG_bit.ECAP0EN = 1;
	RCU->PRSTCFG_bit.ECAP0EN = 1;
	
	RCU->PCLKCFG_bit.ECAP1EN = 1;
	RCU->PRSTCFG_bit.ECAP1EN = 1;

	ECAP0->ECCTL0 = 0;
	ECAP0->ECCTL1 = 0;
	ECAP0->ECCTL1_bit.TSCTRSTOP = 1;
	ECAP0->ECCTL1_bit.REARM = 1;	
	ECAP0->ECCTL0_bit.CAPLDEN = 1;
	
	ECAP1->ECCTL0 = 0;
	ECAP1->ECCTL1 = 0;
	ECAP1->ECCTL1_bit.TSCTRSTOP = 1;
	ECAP1->ECCTL1_bit.REARM = 1;
	ECAP1->ECCTL0_bit.CAPLDEN = 1;
	
	ECAP0->ECEINT_bit.CEVT0 = 1;
	ECAP1->ECEINT_bit.CEVT0 = 1;
	
	Энвик_EnableIRQ(ECAP0_IRQn);
	Энвик_EnableIRQ(ECAP1_IRQn);
}

int main()
{
	SystemCoreClockUpdate();
	retarget_init();
	BSP_LED_Init(); 
	BSP_Btn_Init();

	SysTick_Config(10000000);
    
	capture_init();	
	
	while (1)
	{
		if (was_cap0) {printf("CAP0: %u\n", cap0); was_cap0 = 0;}
		
		if (was_cap1) {printf("CAP1: %u\n", cap1); was_cap1 = 0;}

		if (BSP_Btn_IsPressed()) {printf("button\n");}
	}
}
Вложения
Состояние регистров после возникновения проблемы
Состояние регистров после возникновения проблемы
ecap.png (55.73 КБ) 1154 просмотра
Аватара пользователя
Лашкевич
Сообщения: 372
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

Re: 1921вк035, блок захвата перестает формировать прерывания

Сообщение Лашкевич »

Добрый день. Такое можно представить, если второе прерывание возникло во время обслуживания первого, когда вы флаги сбрасываете. Попробуйте:
1. Переставить местами строчки подтверждения прерывания, а именно перенесите ECAP0->PEINT_bit.PEINT = 1; вверх
2. Подтверждайте не записью в битовое поле (это операция чтение-модификация-запись), а в регистр целиком
3. Включите квалифаер для дискретных входов CAP типа такого

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

// Настройка квалифаеров для ножек eCAP E4 E5 E6 с максимальным периодом
	// 6 отсчётов с периодом 250 тактов = 6 * 250 / 100 000 000 = 15 мкс
    NT_COMMON_REG->GPIOQE2 |= (1 << 4) + (1 << 5) + (1 << 6);	// Включение фильтров на пинах E4/5/6
    NT_COMMON_REG->GPIOQM2 |= (1 << 4) + (1 << 5) + (1 << 5);	// Фильтр по 6ти отсчетам
    NT_COMMON_REG->GPIOQPEH_bit.SPRDE = 250; 					// Период отсчётов = 250 тактов проца
    
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
Ответить

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