pil123456789 0 31 мая, 2011 Опубликовано 31 мая, 2011 (изменено) · Жалоба начал осваивать stm32f105, до этого работал с lpc1343. Так вот, интересует USB Device. Далее составные usb и т.д. Пишу в Keil. К lpc1343 все просто - есть примеры usb device -> правишь под себя + функционал = ОК Под сабж примеров не найду никак, есть только USB hub. Есть примеры под другие stm32 (f103 например), но оно не подходит никак, т.к. f105/107 организованы иначе. Нашел так же библиотеку от производителя, с ходу правки не поддается, да и не нравится. Вопрос: А есть ли вообще от Keil примеры usb device под stm32f105/7 ???? Их отсутствие просто нелогично. Подскажите пожалуйста куда копать. Изменено 31 мая, 2011 пользователем pil Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 1 июня, 2011 Опубликовано 1 июня, 2011 · Жалоба А есть ли вообще от Keil примеры usb device под stm32f105/7 ???? Можно еще IAR скачать, там тоже примеров довольно много. Может, и нужный вам имеется ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivan1180 0 1 июня, 2011 Опубликовано 1 июня, 2011 · Жалоба В библиотеке от ST STM32_USB-FS-Device_Lib есть шаблоны проектов (путь STM32_USB-FS-Device_Lib_V3.2.1\Project) реализующие классы устройств : Audio_Speaker Audio_Streaming Custom_HID Device_Firmware_Upgrade JoyStickMouse Mass_Storage Virtual_COM_Port под практически любую среду разработки. Итого : открываете проект, правите директивы препроцессора, компилируете, смотрите. Работает без напильника из коробки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pil123456789 0 1 июня, 2011 Опубликовано 1 июня, 2011 (изменено) · Жалоба Спасибо за ответ. За неимением альтернатив (не нашел по крайней мере), уже ковыряюсь в этой библиотеке. И есть проблема. У меня на макетке кварц 8Мгц + 32Мгц под юсб. Если залить пример из библиотеки возникает ошибка нумерации по юсб. пример пользую под STM3210C-EVAL, т.е. как раз под stm32f105. на ките к которому пример кварц 25мгц. Пытаюсь править под свой кварц: 1. препроцессору добавил, теперь он такой STM32F10X_CL,USE_STDPERIPH_DRIVER, USE_STM3210C_EVAL, HSE_VALUE=8000000 2. system_stm32f10x.c теперь рабочий дефайн: (чтоб работал параметр препроцессора ) #define SYSCLK_FREQ_HSE HSE_VALUE Больше ума не приложу что пробовать, буду благодарен за идеи. Изменено 1 июня, 2011 пользователем pil Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
brag 0 2 июня, 2011 Опубликовано 2 июня, 2011 · Жалоба Либы не юзаю, тк у меня ось своя и оно не совместимо, да и не люблю я эти либы, то,что там прописано,вернее то,что тебе нужно из того что там прописано :) прописывается за день-два. В доке все почти хорошо описано, если прочитать ее несколько раз ) пс. в инете примеров для OTG_FS stm32f1xx не нашел ) вот мой кодик. код местами блокирует систему - в прерывании есть циклические ожидания, писалось чтобы освоить otg_fs в stm32f1, но и применяю уже. на какое время блокирует не проверял, но пока устраивает. Copy_of_usbotg.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivan1180 0 2 июня, 2011 Опубликовано 2 июня, 2011 · Жалоба Я считаю что должно быть так : USE_STDPERIPH_DRIVER, STM32F10X_CL, USE_STM3210C_EVAL Настройка тактирования производится в файле (из библиотеки, из примера) hw_config.c, функция void Set_System(void) в ней нужно коректно настроить все частоты, глава в документации "Connectivity line devices: reset and clock control (RCC)" Я бы поменял строчку /* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */ RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5); на строчку /* PLL configuration: RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1); Ну и дальше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pil123456789 0 2 июня, 2011 Опубликовано 2 июня, 2011 · Жалоба Спасибо, щас попробую. Вот последняя фраза "Ну и дальше" - это к чему?=) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivan1180 0 2 июня, 2011 Опубликовано 2 июня, 2011 · Жалоба К тому, что у меня на руках нет 105 процессора, и я не могу проверить код, возможно что не заработает. У ST есть возможность выдать внутреннюю частоту на вывод процессора, т.е. есть возможность проверить правильность прочтения документации. По моему опыту : библиотеки от ST рабочие, нужно обеспечить им системные базовые функции : частоты, настройки пинов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pil123456789 0 6 июня, 2011 Опубликовано 6 июня, 2011 (изменено) · Жалоба Спасибо за подсказки, совладал с этой библиотекой. В голове уперто сидела идея, что все должно быть доступно прям из препроцессора, ан нет. Забыл отписаться по результатам, мало ли кому понадобится. Примеры от ST рабочии, но нужно заточить под свой кварц, если он у вас оригинальный. Например чуть подправить ф-цию SetSysClockTo в system_stm32f10x.c под себя. И заставить юзать именно наш вариант. static void SetSysClockToHSE8(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ /* Enable HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* Wait till HSE is ready and if Time out is reached exit */ do { HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); if ((RCC->CR & RCC_CR_HSERDY) != RESET) { HSEStatus = (uint32_t)0x01; } else { HSEStatus = (uint32_t)0x00; } if (HSEStatus == (uint32_t)0x01) { /* Enable Prefetch Buffer */ FLASH->ACR |= FLASH_ACR_PRFTBE; /* Flash 2 wait state */ FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; /* HCLK = SYSCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9); /* Enable PLL */ RCC->CR |= RCC_CR_PLLON; /* Wait till PLL is ready */ while((RCC->CR & RCC_CR_PLLRDY) == 0) { } /* Select PLL as system clock source */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /* Wait till PLL is used as system clock source */ while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) { } } else { /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */ } } Изменено 7 июня, 2011 пользователем IgorKossak [codebox]!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_M_Luck 0 14 июля, 2011 Опубликовано 14 июля, 2011 · Жалоба Уважаемый brag. Либы не юзаю, тк у меня ось своя и оно не совместимо, да и не люблю я эти либы, то,что там прописано,вернее то,что тебе нужно из того что там прописано :) прописывается за день-два. В доке все почти хорошо описано, если прочитать ее несколько раз ) пс. в инете примеров для OTG_FS stm32f1xx не нашел ) вот мой кодик. код местами блокирует систему - в прерывании есть циклические ожидания, писалось чтобы освоить otg_fs в stm32f1, но и применяю уже. на какое время блокирует не проверял, но пока устраивает. Я так-же делаю otg без фреймворка. У меня так удачно прочитать доки что-то не получилось. Я задал свой вопрос http://electronix.ru/forum/index.php?showtopic=92328. Но потом нашел это обсуждение и решил обратиться к вам в этой ветке. Ваш пример внимательно изучил. Не вижу принципиальной разницы со своим кодом. Тем не менее у меня не работает. Проблема - получаю запрос дескриптора устройства, отправляю этот дескриптор - и все. ни ответа ни привета. Мой кодик. usb_otg.txt Это очень черновой вариант. Посмотрите пожалуйста, ткните носом, что не так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
brag 0 2 августа, 2011 Опубликовано 2 августа, 2011 · Жалоба выложите полный лог, какие прерывания возникают в процессе начиная от коннекта usb. если дескриптор запросило, значт должно запросить еще раз,если что-то не так. у вас в УSB_DataInStage,USB_WriteEP явно что-то намучено, сравните с моей UsbEp0InXfr и главное, еще раз перепроверьте все ее содержимое согласно документации. Внимательно пересмотрите обработку прерываний, я думаю, как раз там и застряет. Ну и доку usb2.0 покурите, чтобы было понятно, какое состояние за каким идет, оно примерно так же отражено в юзер-интерфейсе любого контроллера usb. начните, на пример со страницы 226(картинка внизу) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
svn79 0 23 декабря, 2011 Опубликовано 23 декабря, 2011 (изменено) · Жалоба Ув. коллеги! Камень STM32L152RB. Застрял в самом начале, получаю SET_ADDRES, вбиваю в регистр и... получаю RESET. Так четыре или пять раз и хост отваливает железку. Вывод printf-а: ************************ ******* Main ********** ************************ USB_HwReset USB_HwReset Request 80 6 100 0 40 USB_HwReset Request 0 5 2 0 0 SetDADDR 2 USB_HwReset Я догадываюсь что надо что то еще сделать, но что не понятно. Еще зачем _ToggleDTOG_RX(ENDP0) - без установки этого бита не принимает ничего. Из даташита понял что это для точек с двойной беферизацией, непонятно нах здесь этот бит нужен. if (usb_req.bRequest == 0x05) { printf("SetDADDR %X \n", usb_req.wValue); _ClearEP_CTR_RX(ENDP0); _ToggleDTOG_RX(ENDP0); _SetEPRxStatus(ENDP0, EP_RX_VALID); _SetDADDR(usb_req.wValue | 0x80); } Изменено 23 декабря, 2011 пользователем svn79 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться