Данная библиотека позволяет подключать PS2 мышку к микроконтроллеру STM32F4.
Для работы необходима линия внешнего прерывания и обычный GPIO вывод. Автор использует PB7 и PA8 на плате Discovery.
После инициализации мышь опрашивается и передает структуру данных со значениями для осей X и Y, статусом двух кнопок и, если мышь имеет колесо, значение оси Z.
Примечание: мышке необходимо около 500мс после включения, прежде чем она начнет работать.
Пользователь может устанавливать максимальные значения в H-файле для всех трех осей, чтобы не произошло переполнение переменной. Автор заинтересован в покупке дисплея с разрешением (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 и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.
Прикрепленные файлы:
- Demo_30_PS2_MOUSE_rus.rar (200 Кб)
- ub_stm32f4_ps2_mouse_v100_rus.rar (10 Кб)
Комментарии (0) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация