начал осваивать stm32f105, до этого работал с lpc1343.
Так вот, интересует USB Device. Далее составные usb и т.д.
Пишу в Keil.
К lpc1343 все просто - есть примеры usb device -> правишь под себя + функционал = ОК
Под сабж примеров не найду никак, есть только USB hub. Есть примеры под другие stm32 (f103 например), но оно не подходит никак, т.к. f105/107 организованы иначе.
Нашел так же библиотеку от производителя, с ходу правки не поддается, да и не нравится.
Вопрос:
А есть ли вообще от Keil примеры usb device под stm32f105/7 ????
Их отсутствие просто нелогично. Подскажите пожалуйста куда копать.
kovigor
Jun 1 2011, 07:34
Цитата(pil @ Jun 1 2011, 00:00)

А есть ли вообще от Keil примеры usb device под stm32f105/7 ????
Можно еще IAR скачать, там тоже примеров довольно много. Может, и нужный вам имеется ...
Arischenko Ivan
Jun 1 2011, 11:53
В библиотеке от 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 под практически любую среду разработки.
Итого : открываете проект, правите директивы препроцессора, компилируете, смотрите. Работает без напильника из коробки.
Спасибо за ответ.
За неимением альтернатив (не нашел по крайней мере), уже ковыряюсь в этой библиотеке.
И есть проблема. У меня на макетке кварц 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
Больше ума не приложу что пробовать, буду благодарен за идеи.
Либы не юзаю, тк у меня ось своя и оно не совместимо, да и не люблю я эти либы, то,что там прописано,вернее то,что тебе нужно из того что там прописано

прописывается за день-два.
В доке все почти хорошо описано, если прочитать ее несколько раз )
пс. в инете примеров для OTG_FS stm32f1xx не нашел )
вот мой кодик. код местами блокирует систему - в прерывании есть циклические ожидания, писалось чтобы освоить otg_fs в stm32f1, но и применяю уже. на какое время блокирует не проверял, но пока устраивает.
Arischenko Ivan
Jun 2 2011, 10:25
Я считаю что должно быть так :
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);
Ну и дальше.
Спасибо, щас попробую.
Вот последняя фраза "Ну и дальше" - это к чему?=)
Arischenko Ivan
Jun 2 2011, 19:50
К тому, что у меня на руках нет 105 процессора, и я не могу проверить код, возможно что не заработает. У ST есть возможность выдать внутреннюю частоту на вывод процессора, т.е. есть возможность проверить правильность прочтения документации. По моему опыту : библиотеки от ST рабочие, нужно обеспечить им системные базовые функции : частоты, настройки пинов.
Спасибо за подсказки, совладал с этой библиотекой.
В голове уперто сидела идея, что все должно быть доступно прям из препроцессора, ан нет.
Забыл отписаться по результатам, мало ли кому понадобится.
Примеры от ST рабочии, но нужно заточить под свой кварц, если он у вас оригинальный.
Например чуть подправить ф-цию SetSysClockTo в system_stm32f10x.c под себя. И заставить юзать именно наш вариант.
CODE
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 */
}
}
V_M_Luck
Jul 14 2011, 12:50
Уважаемый brag.
Цитата(brag @ Jun 2 2011, 05:11)

Либы не юзаю, тк у меня ось своя и оно не совместимо, да и не люблю я эти либы, то,что там прописано,вернее то,что тебе нужно из того что там прописано

прописывается за день-два.
В доке все почти хорошо описано, если прочитать ее несколько раз )
пс. в инете примеров для OTG_FS stm32f1xx не нашел )
вот мой кодик. код местами блокирует систему - в прерывании есть циклические ожидания, писалось чтобы освоить otg_fs в stm32f1, но и применяю уже. на какое время блокирует не проверял, но пока устраивает.
Я так-же делаю otg без фреймворка. У меня так удачно прочитать доки что-то не получилось.
Я задал свой вопрос
http://electronix.ru/forum/index.php?showtopic=92328. Но потом нашел это обсуждение и решил обратиться к вам в этой ветке.
Ваш пример внимательно изучил. Не вижу принципиальной разницы со своим кодом. Тем не менее у меня не работает. Проблема - получаю запрос дескриптора устройства, отправляю этот дескриптор - и все. ни ответа ни привета.
Мой кодик.
Нажмите для просмотра прикрепленного файла Это очень черновой вариант.
Посмотрите пожалуйста, ткните носом, что не так.
выложите полный лог, какие прерывания возникают в процессе начиная от коннекта usb. если дескриптор запросило, значт должно запросить еще раз,если что-то не так.
у вас в УSB_DataInStage,USB_WriteEP явно что-то намучено, сравните с моей UsbEp0InXfr и главное, еще раз перепроверьте все ее содержимое согласно документации.
Внимательно пересмотрите обработку прерываний, я думаю, как раз там и застряет.
Ну и доку usb2.0 покурите, чтобы было понятно, какое состояние за каким идет, оно примерно так же отражено в юзер-интерфейсе любого контроллера usb. начните, на пример со страницы 226(картинка внизу)
Ув. коллеги! Камень 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);
}
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.