Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.01.2013, 16:29
Kateee Kateee вне форума
Прохожий
 
Регистрация: 27.01.2013
Сообщения: 9
Репутация: 10
По умолчанию Отправка данных по USB

Всем здравствуйте!!!
У меня задача такая:мне нужно написать программу на Delphi 7. Чтобы была кнопочка,при нажатии которой на контроллере STM32F407 защигался светодиод.Если кто-нидь сталкивался с этим,подскажите,пожалуйста,хоть в какую сторону копать.А если скинете код,буду очень благодарна!!!
Ответить с цитированием
  #2  
Старый 27.01.2013, 18:46
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Если USB как COM порт в системе виден - то достаточно просто.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 27.01.2013, 21:34
Kateee Kateee вне форума
Прохожий
 
Регистрация: 27.01.2013
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Если USB как COM порт в системе виден - то достаточно просто.
Хмм...и как же,если не секрет?Я просто новичок в этом.впервые стакиваюсь с контроллером(

Последний раз редактировалось Kateee, 27.01.2013 в 21:36.
Ответить с цитированием
  #4  
Старый 27.01.2013, 22:01
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Если устройство HID - то как-то так:
Код:
procedure TfrmMultiMeter.tbConnectClick(Sender: TObject);
var
  devSet: integer;
  i, uBytes: integer;
  spdt: SP_DEVICE_INTERFACE_DATA;

begin
  if connected then
  begin
    MessageBoxA(0, 'Вы уже подключены к устройству.', 'Ошибка!', 0);
    exit;
  end;

  hHid := LoadLibrary('Hid.dll');
  if hHid = 0 then
  begin
    MessageBoxA(0, 'Не удалось загрузить библиотеку Hid.dll', 'Ошибка!', 0);
    exit;
  end;

  hSetupAPI := LoadLibrary('SetupAPI.dll');
  if hSetupAPI = 0 then
  begin
    DoDisconnect();
    MessageBoxA(0, 'Не удалось загрузить библиотеку SetupAPI.dll',
      'Ошибка!', 0);
    exit;
  end;

  HidD_GetHidGuid := GetProcAddress(hHid, 'HidD_GetHidGuid');
  SetupDiGetClassDevsA := GetProcAddress(hSetupAPI, 'SetupDiGetClassDevsA');
  SetupDiDestroyDeviceInfoList := GetProcAddress(hSetupAPI,
    'SetupDiDestroyDeviceInfoList');
  SetupDiEnumDeviceInterfaces := GetProcAddress(hSetupAPI,
    'SetupDiEnumDeviceInterfaces');
  SetupDiGetDeviceInterfaceDetailA := GetProcAddress(hSetupAPI,
    'SetupDiGetDeviceInterfaceDetailA');
  if (not assigned(HidD_GetHidGuid)) or (not assigned(SetupDiGetClassDevsA)) or
    (not assigned(SetupDiDestroyDeviceInfoList)) or
    (not assigned(SetupDiEnumDeviceInterfaces)) or
    (not assigned(SetupDiGetDeviceInterfaceDetailA)) then
  begin
    DoDisconnect();
    MessageBoxA(0, 'Не удалось получить адрес функции.', 'Ошибка!', 0);
    exit;
  end;

  HidD_GetHidGuid(@Hg);
  devSet := SetupDiGetClassDevsA(@Hg, 0, 0, $12);
  if devSet = -1 then
  begin
    DoDisconnect();
    MessageBoxA(0, 'Не получен список устройств.', 'Ошибка!', 0);
    exit;
  end;
  i := 0;
  spdt.cbSize := sizeof(spdt);
  while SetupDiEnumDeviceInterfaces(devSet, 0, @Hg, i, @spdt) do
  begin
    SetupDiGetDeviceInterfaceDetailA(devSet, @spdt, 0, 0, @uBytes, 0);
    if (uBytes <> 0) and (GetLastError() = 122) then
    begin
      GetMem(pSpDDT, uBytes);
      pSpDDT^.cbSize := 5;
      SetupDiGetDeviceInterfaceDetailA(devSet, @spdt, pSpDDT, uBytes,
        @uBytes, 0);
      if (pos('vid_0483&pid_5750', PAnsiChar(@(pSpDDT^.DevicePath))) <> 0) then
        break;
      FreeMem(pSpDDT);
      pSpDDT := 0;
    end;
    inc(i);
  end;
  SetupDiDestroyDeviceInfoList(devSet);
  if pSpDDT = nil then
  begin
    DoDisconnect();
    MessageBoxA(0, 'Устройство vid_0483&pid_5750 не найдено.', 'Ошибка!', 0);
    exit;
  end;
  hMM := CreateFileA(PAnsiChar(@(pSpDDT^.DevicePath)), GENERIC_READ or
    GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
  if hMM = 0 then
  begin
    DoDisconnect();
    MessageBoxA(0, 'Не удалось открыть устройство.', 'Ошибка!', 0);
    exit;
  end;

  hEvt := CreateEvent(0, true, false, 0);
  ResetEvent(hEvt);
  ovlp.Offset := 0;
  ovlp.OffsetHigh := 0;
  ovlp.hEvent := hEvt;
end;
Ну а потом чтение/запись стандартным ReadFile/WriteFile.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 28.01.2013, 16:43
Kateee Kateee вне форума
Прохожий
 
Регистрация: 27.01.2013
Сообщения: 9
Репутация: 10
По умолчанию

Это ведь код обнаружения устройства..Я же не знаю,что послать по USB в контроллер,чтобы загорелся светодиод.Я нашла вот такое -
пример из программы, которая передает в МК 16 управляющих байт,
Код:
procedure TForm1.cmdWriteClick(Sender: TObject);
var
 i : integer;
 Buf: array [0..16] of Byte;
 Written: Cardinal;
 ToWrite: Cardinal;
begin
//Проверяем подключено ли наше устройство if Assigned(CurrentDevice) then begin //Узнаем какова длина OUTPUT репорта, котрым владеет МК ToWrite := CurrentDevice.Caps.OutputReportByteLength;
//Заполняем буфер нужными нам параметрами. Необходимо отметить, что самым первым //значением в буфере стоит номер репорта. В нашем случае это 0!
 Buf[0] := 0;
 Buf[1] := Rx;
 Buf[2] := Gx;
 Buf[3] := Yx;
 Buf[4] := Bx;
 Buf[5] := Rf;
 Buf[6] := Gf;
 Buf[7] := Yf;
 Buf[8] := Bf;
 Buf[9] := Regim;
 Buf[10] := Zmax;
 Buf[11] := Zmin;
 Buf[12] := Tim;
 Buf[13] := HiZat;
 Buf[14] := LoZat;
 Buf[15] := HiZatF;
 Buf[16] := LoZatF;
//Все скопом сбрасываем в контроллер. В переменной Written будет количество //переданных байт
 CurrentDevice.WriteFile(Buf, ToWrite, Written);
 end;
end;
Админ: Пользуемся тегами!

откуда взять эти параметры,которые записываются в буфер?Если есть возможность,то хотя бы приведите,пожалуйста,пример на каком-нидь другом контроллере,чтоб я понимала что и откуда берется(

Последний раз редактировалось Admin, 28.01.2013 в 20:36.
Ответить с цитированием
  #6  
Старый 28.01.2013, 17:23
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Схема устройства есть?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение:
Kateee (28.01.2013)
  #7  
Старый 28.01.2013, 17:31
Kateee Kateee вне форума
Прохожий
 
Регистрация: 27.01.2013
Сообщения: 9
Репутация: 10
По умолчанию

у меня микроконтроллер STM32F407.
Один из светодиодов подключен к порту С ножка 8 --PC8.
Ответить с цитированием
  #8  
Старый 28.01.2013, 17:33
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Это все очень интересно, но гораздо интереснее увидеть электрическую схему. К слову, светодиод напрямую на ногу процессора никто не подключает.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #9  
Старый 28.01.2013, 18:31
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Схема боюсь тут не поможет. Если взять "голый" камень, и ему на "ножку 8 подключить светодиод" - ничего не произойдет, потому что нужна прошивка, которая будет этим светодиодом управлять при приходящих данных. И тут всё будет зависеть от того, в каком формате эти данные принимаются и что означают.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #10  
Старый 28.01.2013, 19:19
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Скорее всего, имеется в виду вот такая (или подобная) штука.

Kateee, прошивку в студию.

Cortex M4 для мигания светодиодом - это сильно...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 28.01.2013 в 19:22.
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
Kateee (28.01.2013)
  #11  
Старый 28.01.2013, 21:24
Kateee Kateee вне форума
Прохожий
 
Регистрация: 27.01.2013
Сообщения: 9
Репутация: 10
По умолчанию

Вот эта программа уже вшита в микроконтроллер.Новая сжатая ZIP-папка.zip
Ответить с цитированием
  #12  
Старый 28.01.2013, 21:54
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Данная прошивка никак не обрабатывает сигналы от ПК по USB. Во всяком случае, состояние LED-ов не изменяет. Нужна другая прошивка и программа, заточенная под неё.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #13  
Старый 28.01.2013, 22:46
Kateee Kateee вне форума
Прохожий
 
Регистрация: 27.01.2013
Сообщения: 9
Репутация: 10
По умолчанию Диоды

Код:
#include "main.h"
#include "usbd_hid_core.h"
#include "usbd_usr.h"
#include "usbd_desc.h"

#define TESTRESULT_ADDRESS         0x080FFFFC
#define ALLTEST_PASS               0x00000000
#define ALLTEST_FAIL               0x55555555

#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
    #pragma data_alignment = 4   
  #endif
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
__ALIGN_BEGIN USB_OTG_CORE_HANDLE  USB_OTG_dev __ALIGN_END;
  
uint16_t PrescalerValue = 0;

__IO uint32_t TimingDelay;
__IO uint8_t DemoEnterCondition = 0x00;
__IO uint8_t UserButtonPressed = 0x00;
LIS302DL_InitTypeDef  LIS302DL_InitStruct;
LIS302DL_FilterConfigTypeDef LIS302DL_FilterStruct;  
__IO int8_t X_Offset, Y_Offset, Z_Offset  = 0x00;
uint8_t Buffer[6];

/* Private function prototypes -----------------------------------------------*/
static uint32_t Demo_USBConfig(void);
static void TIM4_Config(void);
static void Demo_Exec(void);
int main(void)
{
  RCC_ClocksTypeDef RCC_Clocks;

  STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); 
  STM_EVAL_LEDInit(LED4);
  STM_EVAL_LEDInit(LED3);
  STM_EVAL_LEDInit(LED5);
  STM_EVAL_LEDInit(LED6);
  RCC_GetClocksFreq(&RCC_Clocks);
  SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);
  
  if (STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET)
  {
    STM_EVAL_LEDOn(LED4);
    STM_EVAL_LEDOn(LED3);
    STM_EVAL_LEDOn(LED5);
    STM_EVAL_LEDOn(LED6); 

    if ((*(__IO uint32_t*) TESTRESULT_ADDRESS) == ALLTEST_PASS)
    {
      TimingDelay = 300;
      while ((STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET)&&(TimingDelay != 0x00))
      {}
    }
    else
    {
      TimingDelay = 300;
      while ((STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET)&&(TimingDelay != 0x00))
      {}
      if (STM_EVAL_PBGetState(BUTTON_USER) == Bit_RESET)
      {
        TimingDelay = 0x00;
      }
    }
    if (TimingDelay == 0x00)
    {
      /* Turn off LEDs available on STM32F4-Discovery ------------------------*/
      STM_EVAL_LEDOff(LED4);
      STM_EVAL_LEDOff(LED3);
      STM_EVAL_LEDOff(LED5);
      STM_EVAL_LEDOff(LED6); 
      
      /* Waiting User Button is released */
      while (STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET)
      {}
      
      /* Unlocks the FLASH control register access */
      FLASH_Unlock();
      
      Accelerometer_MEMS_Test();
      
      /* USB Hardware connection */   Ооооо,слово USB!!!!
      USB_Test();
  
      Audio_Test();
      Microphone_MEMS_Test();
      
      /* Write PASS code at last word in the flash memory */
      FLASH_ProgramWord(TESTRESULT_ADDRESS, ALLTEST_PASS);
      
      while(1)
      {
        /* Toggle Green LED: signaling the End of the Test program */
        STM_EVAL_LEDToggle(LED4);
        Delay(10);
      }
    }
    else
    {
      Demo_Exec();
    }
  }
  else
  {    
    Demo_Exec();
  }
}

/**
  * @brief  Execute the demo application.
  * @param  None
  * @retval None
  */
MAD: пользуемся тегами!
и так далее..............
я конечно занимаюсь этими контроллерами впервые в жизне и ито не по собственному желанию.а потому что мне диплом надо делать(но на сколько я освоила функции
Код:
STM_EVAL_LEDOn(LED4);
    STM_EVAL_LEDOn(LED3);
    STM_EVAL_LEDOn(LED5);
    STM_EVAL_LEDOn(LED6);
MAD: теги!
включают светодиоды с 3 по 6.Так что эта прошивка изменяет светодиоды)

Последний раз редактировалось M.A.D.M.A.N., 28.01.2013 в 23:02. Причина: предупреждение! пользцемся тегом [code], иначе последуют санкции
Ответить с цитированием
  #14  
Старый 29.01.2013, 07:55
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Если разобраться в структуре, то включение происходит при условии
Код:
STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET
Мне кажется, что это - кнопка на самом устройстве, или подключаемая к нему. Но не USB.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #15  
Старый 29.01.2013, 09:54
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Пришел сегодня на работу, посмотрел на этот кит (не на точно такой-же, попроще, "дискавери"). Да, на нем есть 2 кнопки, одна правда reset, а вот вторая как раз мигает светодиодами в разных режимах на демонстрационной прошивке. Так что ТС отчасти права, в прошивке таки есть обращения к светодиодам.
Теперь в тему:
Первое и очень важное: нельзя подключать внешние светодиоды напрямую к пинам платы, нужно поставить токозадающие резисторы.
Второе: чтобы помигать этими светодиодами нужно будет написать прошивку которая:
а) обеспечит общение по UART с внешними устройствами (в нашем случае это компьютер)
б) получая команды по UART будет их анализировать и включать/выключать светодиоды (по сути управлять выходами на камне)
Для того чтобы написать такую прошивку нужно долго и вдумчиво курить вот эту книжку.

Как-то так...
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.

Последний раз редактировалось Aristarh Dark, 29.01.2013 в 10:10.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:09.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter