STM32F4. Урок 30 — Работа с PS2-мышкой

Данная библиотека позволяет подключать PS2 мышку к микроконтроллеру STM32F4.
Для работы необходима линия внешнего прерывания и обычный GPIO вывод. Автор использует PB7 и PA8 на плате Discovery.
После инициализации мышь опрашивается и передает структуру данных со значениями для осей X и Y, статусом 2-х кнопок и, если мышь имеет колесо, значение оси Z.
Примечание: мышке необходимо около 500мс после включения, прежде чем она начнет работать.
Пользователь может устанавливать максимальные значения в H-файле для всех 3-х осей, чтобы не произошло переполнение переменной. Автор заинтересован в покупке дисплея с разрешением (320 × 240), поэтому были установлены такие значения, но цифры могут быть произвольными.

Мышь работает с уровнями 5В, автор подключал ее напрямую к GPIO (без преобразователя уровня) и устройство работало.
Для работы с прерываниями необходима библиотека «STM32_UB_EXT_INT5TO9».

Схема подключения PS2:

  • Линия данных (DATA)
  • Не используется
  • Земля (GND)
  • Питание (+5В)
  • Линия тактирования (CLK)
  • Не используется
  • Используемые выводы:

    CLK к PB7 (через прерывание 7)

    DATA к PA8

    Требуемые библиотеки:

    Подключаемые модули CooCox-IDE: GPIO
    Поддерживаемые библиотеки: STM32_UB_EXT_INT5TO9

    Перечисления

    typedef enum {
    MOUSE_INAKTIV = 0, // Мышка неактивна
    MOUSE_AKTIV, // Мышка активна
    MOUSE_NEW_DATA // Новые данные
    }PS2_MOUSE_STATUS_t;

    typedef enum {
    MOUSE_SPEED_10 =0, // 10 Измерений в секунду (100ms)
    MOUSE_SPEED_20, // 20 Измерений в секунду (50ms)
    MOUSE_SPEED_40, // 40 Измерений в секунду (25ms)
    MOUSE_SPEED_60, // 60 Измерений в секунду (16,6ms)
    MOUSE_SPEED_80 // 80 Измерений в секунду (12,5ms)
    }PS2_MOUSE_SPEED_t;

    typedef enum {
    BTN_RELEASED =0, // Кнопка отпущена
    BTN_PRESSED // Кнопка нажата
    }PS2_MOUSE_BTN;

    Структура данных мыши:

    typedef struct {
    PS2_MOUSE_BTN btn_left; // Статус левой кнопкой мыши
    PS2_MOUSE_BTN btn_right; // Статус правой кнопкой мыши
    uint16_t xpos; // Актуальная координата X
    uint16_t ypos; // Актуальная координата Y
    uint16_t zpos; // Актуальная координата Z (колесо)
    }PS2_MOUSE_DATA_t;
    PS2_MOUSE_DATA_t PS2_MOUSE_DATA;

    Функции:

    void UB_PS2_Mouse_Init(void); // для инициализации мыши
    ErrorStatus UB_PS2_Mouse_Start(PS2_MOUSE_SPEED_t mode); // активировать мышь
    PS2_MOUSE_STATUS_t UB_PS2_Mouse_GetData(void); // для запроса данные от мыши

    Пример использования:

     //—————————————————————
    // File : main.c
    // Datum : 03.04.2013
    // Version : 1.0
    // Autor : UB
    // EMail : mc-4u(@)t-online.de
    // Web : www.mikrocontroller-4u.de
    // CPU : STM32F4
    // IDE : CooCox CoIDE 1.7.0
    // Module : CMSIS_BOOT, M4_CMSIS_CORE
    // Funktion : Demo der PS2-Mouse-Library
    // Hinweis : Diese zwei Files muessen auf 8MHz stehen
    // «cmsis_boot/stm32f4xx.h»
    // «cmsis_boot/system_stm32f4xx.c»
    //—————————————————————

    #include «main.h»
    #include «stm32_ub_ps2_mouse.h»
    #include «stm32_ub_led.h»

    void Delay(volatile uint32_t nCount)
    {
    while(nCount—)
    {
    }
    }

    int main(void)
    {
    PS2_MOUSE_STATUS_t check;

    SystemInit(); // Инициализация настроек кварца

    // Инициализация светодиодов
    UB_Led_Init();

    // Инициализация PS2-мыши
    UB_PS2_Mouse_Init();

    // небольшая пауза
    Delay(50000000);

    // Включить мышь PS2 (10 опросам / сек)
    UB_PS2_Mouse_Start(MOUSE_SPEED_10);

    while(1)
    {
    // Запрос данных от мыши
    check=UB_PS2_Mouse_GetData();
    if(check==MOUSE_INAKTIV) {
    UB_Led_On(LED_RED); // доступных мышей нет
    }
    else if(check==MOUSE_NEW_DATA){
    UB_Led_Toggle(LED_GREEN); // получены новые данные

    // Включить/выключить синий светодиод по нажатию левой кнопки
    if(PS2_MOUSE_DATA.btn_left==BTN_PRESSED) UB_Led_On(LED_BLUE); else UB_Led_Off(LED_BLUE);
    }
    }
    }

    В приложении проект CooCox и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.

    Оригинал статьи

    Прикрепленные файлы:

    Добавить комментарий

    Ваш адрес email не будет опубликован.