Добрый день!
Стоит задача активировать прерывание выполнения основного цикла по внешнему сигналу.
Согласно даташиту такая функция присутствует на 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; //Сбросить флаг прерывания по сигналу???????????????????????????????????????
}
К1921ВК01Т---прерывания по внешнему сигналу
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
-
- Сообщения: 1
- Зарегистрирован: 31 янв 2022, 13:11
- Предприятие: ООО ЭТЗ-Вектор
-
- Сообщения: 209
- Зарегистрирован: 14 дек 2015, 09:21
- Предприятие: АО НИИЭТ
- Откуда: АО НИИЭТ, Воронеж
Re: К1921ВК01Т---прерывания по внешнему сигналу
Доброго времени суток!
Вот фрагмент обработчика прерывания для GPIO:
Вот фрагмент обработчика прерывания для GPIO:
Код: Выделить всё
// Проверяем, что прерывание от 3-го пина
if (NT_GPIOE->INTSTATUS & (1 << 3)) {
// какие-то действия
// Сбрасываем флаг прерывания
NT_GPIOE->INTSTATUS = (1 << 3);
}