К1921ВК01Т---прерывания по внешнему сигналу

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

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

Ответить
Eugene Zhevartsov
Сообщения: 1
Зарегистрирован: 31 янв 2022, 13:11
Предприятие: ООО ЭТЗ-Вектор

К1921ВК01Т---прерывания по внешнему сигналу

Сообщение Eugene Zhevartsov »

Добрый день!

Стоит задача активировать прерывание выполнения основного цикла по внешнему сигналу.
Согласно даташиту такая функция присутствует на 3м выводе порта Е.
Активируем порт, задаем функции, но в конце имеем заминку-
Не совсем понятно каким образом установить флаг сброса прерывания в обработчике.
Исходя из даташита предположили, что это должна быть команда:
NT_GPIOE->INTCLEAR_INTCLEAR_bit. = (1<<3); // сброс флага прерываний
Но при таком раскладе среда не компилирует код и дает ошибку.
При написании NT_GPIOE-> среда не предлагает регистр сброса флага. В РЭ регистр сброса флага, конкретно для внешних прерываний, не описан.

Вопросы:

1) Подскажите название регистра со ссылкой на РЭ, который позволяет сбросить флаг прерывания по внешнему сигналу;
2) Уточните необходимость применения активации данного регистра при наладке прерывания- NT_GPIOE->INTSTATUS_bit.INTSTATUS = (1 << 3);//Регистр состояния и сброса прерываний порта;

//------------------------------------------------

Листинг:


#include "DSP.h"
#include "main.h"


#define HL1_ON NT_GPIOA->MASKLOWBYTE_bit[1].MASKLB = 0 // лампа желтая A0
#define HL1_OFF NT_GPIOA->MASKLOWBYTE_bit[1].MASKLB = 1 //



#define SB1_b ((NT_GPIOE->DATA & (1 << 3)) == 0) // Вкл



void LED_init (void)
{

NT_GPIOE->ALTFUNCCLR = (1 << 3); //кнопка альт.ф откл
NT_GPIOE->OUTENCLR = (1 << 3); //вход действ.

NT_GPIOA->ALTFUNCCLR_bit.ALTFUNCCLR = (1 << 0); //лампаА0 альт.ф откл
NT_GPIOA->OUTENSET_bit.OUTENSET |= (1 << 0); //лампаА0 действ.


//--------------------------------------------------------------
void Timer_and_interrupt_init (void)
{
volatile uint32_t priority;
volatile uint32_t priorityGroup;

extern int *g_pfnVectors;//Указатель на массив векторов прерываний, объявлен в startup_MCP_gcc.s
//Надо показать в регистре SCB->VTOR, где лежит таблица прерываний.
//А лежит она там, куда записал её линкер, в зависимости от файла компоновки.
//Поэтому берем адрес от массива g_pfnVectors и кладем туда
SCB->VTOR = (uint32_t)(&g_pfnVectors);//Sets the vector table location and Offset.

DINT; //запретить все прерывания



Энвик_SetPriorityGrouping(4); //В данном процессоре под группы/подгруппы отведено только 3 бита, т.е. будет 8 групп и 0 подгрупп

priorityGroup = Энвик_GetPriorityGrouping(); //прочитаем группировку прерываний для дальнейшего пользования
Энвик_EnableIRQ(GPIOE_IRQn);

NT_GPIOE->INTENCLR_bit.INTENCLR = (1 << 3);//Регистр сброса разрешения прерываний порта

NT_GPIOE->INTTYPECLR_bit.INTTYPECLR = (1 << 3);//Регистр сброса типа Прерываний порта

NT_GPIOE->INTPOLCLR_bit.INTPOLCLR = (1 << 3) ;//Регистр сброса полярности события прерывания порта



NT_GPIOE->INTENSET_bit.INTENSET = (1 << 3);//Регистр разрешения прерываний порта

NT_GPIOE->INTPOLSET_bit.INTPOLSET = (1 << 3);// Регистр полярностисобытия прерывания порта

NT_GPIOE->INTTYPESET_bit.INTTYPESET = (1 << 3); //Регистр типа прерываний порта

NT_GPIOE->INTSTATUS_bit.INTSTATUS = (1 << 3);//Регистр состояния и сброса прерываний порта!!!!!!!!!!!!!!!!!!!!!!!!!!!!?????????????


priority = Энвик_EncodePriority(priorityGroup, 0, 0);
Энвик_SetPriority(GPIOE_IRQn,0);

EINT; //Разрешить прерывания
}

//--------------------------------------------------------------

void LED_light ()
{
HL1_ON;
}

//-------------------------------------------------------------
int16 main (void)
{
InitCLK();//Инициализация микроконтроллера: настройка таймеров, инициализаци периферийных устройств
LED_init();//Инициализация переменной LED_init

while(1)
{
LED_light();

}//while
}//int16


//------------------------------------------------------------
void GPIOE_IRQHandler (void)//--------------обработчик
{
{
if (SB1_b == 1)
HL1_OFF;
}

NT_TIMER0->INTSTATUS_INTCLEAR_bit.INT = 1; //Сбросить флаг прерывания по сигналу???????????????????????????????????????

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

Re: К1921ВК01Т---прерывания по внешнему сигналу

Сообщение dav »

Доброго времени суток!

Вот фрагмент обработчика прерывания для GPIO:

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

    // Проверяем, что прерывание от 3-го пина
    if (NT_GPIOE->INTSTATUS & (1 << 3)) {
        // какие-то действия
        
        // Сбрасываем флаг прерывания
        NT_GPIOE->INTSTATUS = (1 << 3);
    }
Ответить

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