IR + USB HID = очередной пульт для компа (часть 3)


В первых двух частях (часть 1 и часть 2) мы разобрали теоретические моменты. В этой части мы перейдем к практике — создадим рабочий код.


Копируем файлы и настраиваем окружение

Итак, поехали создавать приложение. Сначала качаем «STM32F10x and STM32L1xx USB full-speed device library». В ней, кроме библиотек, будут и примеры использования. Вот возьмем подходящий пример и подрихтуем его.
Напомню, что я пользуюсь связкой eclipse + code sourcery g++

Пример находится в архиве в папке \Project\JoyStickMouse\. Берем оттуда две подпапки src\ и inc\, копируем их себе в проект.
Файл линковщика вытаскиваем из папочки с примером:
\Project\JoyStickMouse\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld
Также копируем папки с библиотеками:
\Libraries\STM32_USB-FS-Device_Driver\ — библиотека USB
\Libraries\STM32F10x_StdPeriph_Driver\ — библиотека SPL
Также из папочки \Libraries\CMSIS\ вытаскиваем все, что касается нашего камня.

Поскольку пример написан универсально для существующих демоплат, то в настройках укажем ту, которая соответствует нашему камню. В этом случае переделок потребуется минимум. Камень у меня STM32F107V, значит демоплата будет STM3210C-EVAL

Скопировали, теперь подчистим лишнее. Удалим все, что касается STM32L:
inc\stm32l1xx_conf.h
src\system_stm32l1xx.c

В настройках проекта укажем следующие символы, чтобы библиотеки правильно собрались:
STM32F10X_CL
USE_STDPERIPH_DRIVER
USE_STM3210C_EVAL

Они указываются в свойствах проекта «C/C++ Build» → «Settings» → «ARM Sourcery Windows GCC C Compiler» → «Preprocessor» → «Defined symbols (-D)»
Этот список добавит параметров -D в ключи компиляции. Те, кто используют ручной makefile, добавляют эти опции туда.

Для линковщика указываем наш файл настроек:
«C/C++ Build» → «Settings» → «ARM Sourcery Windows GCC C Linker» → «General» → «Script file (-T)»

Добавляем каталоги с инклюдами в настройки проекта:
«C/C++ General» → «Paths and Symbols» → «Includes»

Правим код примера

файл inc\paltform_config.h
∙ комментируем строки 50-51. Нам от демоборды ничего и не надо.
//  #include "stm3210c_eval.h"
//  #include "stm3210c_eval_ioe.h"


файл \src\hw_config.c
∙ выкидываем все, что касается инициализации джойстика. У нас его нет и его роль будет выполнять IR-пульт

∙ функция Joystick_Send(uint8_t Keys) меняется на такую:

void Joystick_Send(uint16_t Keys)
{
  uint8_t Mouse_Buffer[4] = {0, 0, 0, 0};

  switch (Keys)
  {
  case 0: {
	  break;
  }
  case 0xf4ff: { //mute
	  Mouse_Buffer[0] = 0x01;
	  break;
  }
  case 0xebff: { //V+
	  Mouse_Buffer[0] = 0x02;
	  break;
  }
  case 0xeaff: { //V-
	  Mouse_Buffer[0] = 0x03;
	  break;
  }
  case 0xecff: { // Play
	  Mouse_Buffer[0] = 0x04;
	  break;
  }
  }

  Mouse_Buffer[1] = (Keys & 0xff00) >> 8;
  Mouse_Buffer[2] = (Keys & 0x00ff);

  
  /* Reset the control token to inform upper layer that a transfer is ongoing */
  PrevXferComplete = 0;
  
  /* Copy mouse position info in ENDP1 Tx Packet Memory Area*/
  USB_SIL_Write(EP1_IN, Mouse_Buffer, 3);
}


Там и свершается таинство формирования пакета HID исходя из переданного 16-битного кода кнопки пульта.

из файла src\stm32_it.c выкидываем обработчик EXTI

Так, проект скомпилировался. Теперь добавляем наши фичи:

файл src\usb_desc.c — записываем туда наши дескрипторы из прошлой части. Не забываем откорректировать дефайн
#define JOYSTICK_SIZ_REPORT_DESC                37

в файле inc\usb_desc.c

файл src\main.c — закидываем туда наши функции захвата и декодирования из первой части и теперь функция main() должна выглядеть так:

int main(void)
{
  Set_System();
  
  USB_Interrupts_Config();
  Set_USBClock();
  USB_Init();

  initIR();

  while (1)
  {
    if (bDeviceState == CONFIGURED)
    {
      if ((recState == REC_Captured) && (PrevXferComplete))
      {
        Joystick_Send(IR_decodeNEC());
        recState = REC_Idle;
      }
    }    
  }
}


Собираем, прошиваем.

С оптимизацией -Os легко влезли в 16К:
Invoking: ARM Sourcery Windows GNU Print Size
arm-none-eabi-size  --format=berkeley IR-HID-2.elf
   text	   data	    bss	    dec	    hex	filename
  10728	    268	   2704	  13700	   3584	IR-HID-2.elf
Finished building: IR-HID-2.siz


Архив с проектом прилагаю.
И поскольку решил-таки выдвигаться на конкурс (ну слоупок я :) — то баннер
  • +1
  • 25 ноября 2012, 19:21
  • steel_ne
  • 1
Файлы в топике: IR-HID-2.zip

Комментарии (3)

RSS свернуть / развернуть
Попробовать адаптировать под плату на STM32F103VET6. Поставил дефайн USESTM3210B-EVAL, как наиболее близкой платы. Вычистил лишнее, проект скомпилился и девайс определился как джойстик STM32, но репорты от него не шлются как от обычного джоя. Попробовал дебаггером пройтись — bDeviceState == CONFIGURED не выполняется по всей видимости. Как минимум под отладчиком. Убрал условия, оставив только отправку Joystick_Send — все равно репортов не идет от девайса. В чем может быть косяк?
0
  • avatar
  • RaJa
  • 15 августа 2013, 15:09
Запустил код для пульта на stm32f072, все работает, спасибо за статью
0
Кнопочные IR пульты уже вышли из моды, надо бы написать статейку про пульт на модулях nRF24L01 и акселерометрах.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.