Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

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

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

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

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (0) | Я собрал (0) | Подписаться

Статью еще никто не комментировал. Вы можете стать первым.
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Ветрогенератор Сатфайндер
вверх