Конфигурирование прерываний в 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
}
Готово! Попробуйте собрать все это вместе.