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

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

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

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

  1. Линия данных (DATA)
  2. Не используется
  3. Земля (GND)
  4. Питание (+5В)
  5. Линия тактирования (CLK)
  6. Не используется

Используемые выводы:

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 и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.