Конфигурирование прерываний в MQX для примера кода / учебника

Я новичок в freescale MQX и пытаюсь настроить прерывания на входном выводе, используя функции MQX (на всякий случай, если мы хотим изменить MPU). Я не мог найти хорошие учебники... Может кто-нибудь указать мне направление? Thanx

1 ответ

Давайте настроим прерывание на переднем фронте для PTA5, хорошо?

Определите макрос для представления вашей булавки. Не очень нужно, но помогает.

#define MY_GPIO_INT_PIN     (GPIO_PORT_A|GPIO_PIN_IRQ_RISING|GPIO_PIN5)

Объявите некоторые необходимые переменные

PORT_MemMapPtr  pctl; 
GPIO_PIN_STRUCT  pins[2];
MQX_FILE_PTR pin_fd;

Получите базовый указатель для вашего порта вывода и установите соответствующий параметр мультиплексирования (см. Справочное руководство по вашему чипу).

//note: this code should be in init_gpio.c, from your bsp folder.
pctl = (PORT_MemMapPtr) PORTA_BASE_PTR;
/* PTA5 as GPIO (Alt.1)  */
pctl->PCR[5] = PORT_PCR_MUX(1) ;

Заполните массив структур булавки. Обратите внимание, что вы можете настроить более одного контакта одновременно, и массив должен быть завершен с помощью GPIO_LIST_END, чтобы драйвер знал, где остановиться.

pins[0] = MY_GPIO_INT_PIN;
pins[1] = GPIO_LIST_END;

Как полу-POSIX-совместимая операционная система, почти все воспринимается как файл в MQX. Давайте откроем обработчик файла для вашей булавки:

pin_fd = fopen("gpio:input", (char*)pins);

Проверьте, все ли прошло хорошо

if(NULL == pin_fd){
    //something bad happened, check for error with ferror(fd)
}

Теперь зарегистрируйте обратный звонок для вашего пин-кода

void pin_int_callback(void* data){
    //interrupt handle code goes here
}

if(IO_OK != ioctl(pin_fd, GPIO_IOCTL_SET_IRQ_FUNCTION, (void*)pin_int_callback)){
   //something bad happened registering your callback
}

Готово! Попробуйте собрать все это вместе.

Другие вопросы по тегам