![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем здравствуйте!!!
У меня задача такая:мне нужно написать программу на Delphi 7. Чтобы была кнопочка,при нажатии которой на контроллере STM32F407 защигался светодиод.Если кто-нидь сталкивался с этим,подскажите,пожалуйста,хоть в какую сторону копать.А если скинете код,буду очень благодарна!!! ![]() |
|
#2
|
||||
|
||||
|
Если USB как COM порт в системе виден - то достаточно просто.
|
|
#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; |
|
#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 подключить светодиод" - ничего не произойдет, потому что нужна прошивка, которая будет этим светодиодом управлять при приходящих данных. И тут всё будет зависеть от того, в каком формате эти данные принимаются и что означают.
|
|
#10
|
||||
|
||||
|
Скорее всего, имеется в виду вот такая (или подобная) штука.
Kateee, прошивку в студию. Cortex M4 для мигания светодиодом - это сильно... Последний раз редактировалось PhoeniX, 28.01.2013 в 19:22. |
| Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Kateee (28.01.2013)
| ||
|
#11
|
|||
|
|||
|
Вот эта программа уже вшита в микроконтроллер.Новая сжатая ZIP-папка.zip
|
|
#12
|
||||
|
||||
|
Данная прошивка никак не обрабатывает сигналы от ПК по USB. Во всяком случае, состояние LED-ов не изменяет. Нужна другая прошивка и программа, заточенная под неё.
|
|
#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 |
|
#15
|
||||
|
||||
|
Пришел сегодня на работу, посмотрел на этот кит (не на точно такой-же, попроще, "дискавери"). Да, на нем есть 2 кнопки, одна правда reset, а вот вторая как раз мигает светодиодами в разных режимах на демонстрационной прошивке. Так что ТС отчасти права, в прошивке таки есть обращения к светодиодам.
Теперь в тему: Первое и очень важное: нельзя подключать внешние светодиоды напрямую к пинам платы, нужно поставить токозадающие резисторы. Второе: чтобы помигать этими светодиодами нужно будет написать прошивку которая: а) обеспечит общение по UART с внешними устройствами (в нашем случае это компьютер) б) получая команды по UART будет их анализировать и включать/выключать светодиоды (по сути управлять выходами на камне) Для того чтобы написать такую прошивку нужно долго и вдумчиво курить вот эту книжку. Как-то так... Последний раз редактировалось Aristarh Dark, 29.01.2013 в 10:10. |