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 : Демонстрація бібліотеки PS2-Mouse
// Hinweis  : Ці два файли повинні бути на 8MHz
//              "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 і окрема бібліотека для використання в інших проектах. Автор оригіналу статті просить ставити питання на його сайті німецькою або англійською мовами.

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

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

Top