Jump to content

    
Sign in to follow this  
pil123456789

stm32f105 нужен пример usb device

Recommended Posts

начал осваивать stm32f105, до этого работал с lpc1343.

Так вот, интересует USB Device. Далее составные usb и т.д.

Пишу в Keil.

К lpc1343 все просто - есть примеры usb device -> правишь под себя + функционал = ОК

Под сабж примеров не найду никак, есть только USB hub. Есть примеры под другие stm32 (f103 например), но оно не подходит никак, т.к. f105/107 организованы иначе.

Нашел так же библиотеку от производителя, с ходу правки не поддается, да и не нравится.

 

Вопрос:

А есть ли вообще от Keil примеры usb device под stm32f105/7 ????

Их отсутствие просто нелогично. Подскажите пожалуйста куда копать.

Edited by pil

Share this post


Link to post
Share on other sites

В библиотеке от 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 под практически любую среду разработки.

Итого : открываете проект, правите директивы препроцессора, компилируете, смотрите. Работает без напильника из коробки.

Share this post


Link to post
Share on other sites

Спасибо за ответ.

За неимением альтернатив (не нашел по крайней мере), уже ковыряюсь в этой библиотеке.

И есть проблема. У меня на макетке кварц 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

 

Больше ума не приложу что пробовать, буду благодарен за идеи.

Edited by pil

Share this post


Link to post
Share on other sites

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

В доке все почти хорошо описано, если прочитать ее несколько раз )

 

пс. в инете примеров для OTG_FS stm32f1xx не нашел )

 

вот мой кодик. код местами блокирует систему - в прерывании есть циклические ожидания, писалось чтобы освоить otg_fs в stm32f1, но и применяю уже. на какое время блокирует не проверял, но пока устраивает.

Copy_of_usbotg.txt

Share this post


Link to post
Share on other sites

Я считаю что должно быть так :

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);

 

Ну и дальше.

Share this post


Link to post
Share on other sites

К тому, что у меня на руках нет 105 процессора, и я не могу проверить код, возможно что не заработает. У ST есть возможность выдать внутреннюю частоту на вывод процессора, т.е. есть возможность проверить правильность прочтения документации. По моему опыту : библиотеки от ST рабочие, нужно обеспечить им системные базовые функции : частоты, настройки пинов.

Share this post


Link to post
Share on other sites

Спасибо за подсказки, совладал с этой библиотекой.

В голове уперто сидела идея, что все должно быть доступно прям из препроцессора, ан нет.

Забыл отписаться по результатам, мало ли кому понадобится.

Примеры от 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 */
 }
}

Edited by IgorKossak
[codebox]!!!

Share this post


Link to post
Share on other sites

Уважаемый brag.

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

В доке все почти хорошо описано, если прочитать ее несколько раз )

 

пс. в инете примеров для OTG_FS stm32f1xx не нашел )

 

вот мой кодик. код местами блокирует систему - в прерывании есть циклические ожидания, писалось чтобы освоить otg_fs в stm32f1, но и применяю уже. на какое время блокирует не проверял, но пока устраивает.

Я так-же делаю otg без фреймворка. У меня так удачно прочитать доки что-то не получилось.

Я задал свой вопрос http://electronix.ru/forum/index.php?showtopic=92328. Но потом нашел это обсуждение и решил обратиться к вам в этой ветке.

Ваш пример внимательно изучил. Не вижу принципиальной разницы со своим кодом. Тем не менее у меня не работает. Проблема - получаю запрос дескриптора устройства, отправляю этот дескриптор - и все. ни ответа ни привета.

Мой кодик. usb_otg.txt Это очень черновой вариант.

Посмотрите пожалуйста, ткните носом, что не так.

Share this post


Link to post
Share on other sites

выложите полный лог, какие прерывания возникают в процессе начиная от коннекта usb. если дескриптор запросило, значт должно запросить еще раз,если что-то не так.

 

у вас в УSB_DataInStage,USB_WriteEP явно что-то намучено, сравните с моей UsbEp0InXfr и главное, еще раз перепроверьте все ее содержимое согласно документации.

 

Внимательно пересмотрите обработку прерываний, я думаю, как раз там и застряет.

Ну и доку usb2.0 покурите, чтобы было понятно, какое состояние за каким идет, оно примерно так же отражено в юзер-интерфейсе любого контроллера usb. начните, на пример со страницы 226(картинка внизу)

Share this post


Link to post
Share on other sites

Ув. коллеги! Камень 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);      
      }

Edited by svn79

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this