|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Отправка данных по USB
Всем здравствуйте!!!
У меня задача такая:мне нужно написать программу на Delphi 7. Чтобы была кнопочка,при нажатии которой на контроллере STM32F407 защигался светодиод.Если кто-нидь сталкивался с этим,подскажите,пожалуйста,хоть в какую сторону копать.А если скинете код,буду очень благодарна!!! |
#2
|
||||
|
||||
Если USB как COM порт в системе виден - то достаточно просто.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
|||
|
|||
Цитата:
Последний раз редактировалось Kateee, 27.01.2013 в 21:36. |
#4
|
||||
|
||||
Если устройство 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; jmp $ ; Happy End! The Cake Is A Lie. |
#5
|
|||
|
|||
Это ведь код обнаружения устройства..Я же не знаю,что послать по 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
|
||||
|
||||
Схема устройства есть?
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
Kateee (28.01.2013)
|
#7
|
|||
|
|||
у меня микроконтроллер STM32F407.
Один из светодиодов подключен к порту С ножка 8 --PC8. |
#8
|
||||
|
||||
Это все очень интересно, но гораздо интереснее увидеть электрическую схему. К слову, светодиод напрямую на ногу процессора никто не подключает.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#9
|
||||
|
||||
Схема боюсь тут не поможет. Если взять "голый" камень, и ему на "ножку 8 подключить светодиод" - ничего не произойдет, потому что нужна прошивка, которая будет этим светодиодом управлять при приходящих данных. И тут всё будет зависеть от того, в каком формате эти данные принимаются и что означают.
jmp $ ; Happy End! The Cake Is A Lie. |
#10
|
||||
|
||||
Скорее всего, имеется в виду вот такая (или подобная) штука.
Kateee, прошивку в студию. Cortex M4 для мигания светодиодом - это сильно... Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 28.01.2013 в 19:22. |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Kateee (28.01.2013)
|
#11
|
|||
|
|||
Вот эта программа уже вшита в микроконтроллер.Новая сжатая ZIP-папка.zip
|
#12
|
||||
|
||||
Данная прошивка никак не обрабатывает сигналы от ПК по USB. Во всяком случае, состояние LED-ов не изменяет. Нужна другая прошивка и программа, заточенная под неё.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#13
|
|||
|
|||
Диоды
Код:
#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 */ и так далее.............. я конечно занимаюсь этими контроллерами впервые в жизне и ито не по собственному желанию.а потому что мне диплом надо делать(но на сколько я освоила функции Код:
STM_EVAL_LEDOn(LED4); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED5); STM_EVAL_LEDOn(LED6); включают светодиоды с 3 по 6.Так что эта прошивка изменяет светодиоды) Последний раз редактировалось M.A.D.M.A.N., 28.01.2013 в 23:02. Причина: предупреждение! пользцемся тегом [code], иначе последуют санкции |
#14
|
||||
|
||||
Если разобраться в структуре, то включение происходит при условии
Код:
STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#15
|
||||
|
||||
Пришел сегодня на работу, посмотрел на этот кит (не на точно такой-же, попроще, "дискавери"). Да, на нем есть 2 кнопки, одна правда reset, а вот вторая как раз мигает светодиодами в разных режимах на демонстрационной прошивке. Так что ТС отчасти права, в прошивке таки есть обращения к светодиодам.
Теперь в тему: Первое и очень важное: нельзя подключать внешние светодиоды напрямую к пинам платы, нужно поставить токозадающие резисторы. Второе: чтобы помигать этими светодиодами нужно будет написать прошивку которая: а) обеспечит общение по UART с внешними устройствами (в нашем случае это компьютер) б) получая команды по UART будет их анализировать и включать/выключать светодиоды (по сути управлять выходами на камне) Для того чтобы написать такую прошивку нужно долго и вдумчиво курить вот эту книжку. Как-то так... Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. Последний раз редактировалось Aristarh Dark, 29.01.2013 в 10:10. |