Перейти к содержанию
    

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

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

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

Пишу в Keil.

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

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

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

 

Вопрос:

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

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

Изменено пользователем pil

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Можно еще IAR скачать, там тоже примеров довольно много. Может, и нужный вам имеется ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В библиотеке от 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

 

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

Изменено пользователем pil

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

Copy_of_usbotg.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Ну и дальше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Изменено пользователем IgorKossak
[codebox]!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемый brag.

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

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

 

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

 

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

выложите полный лог, какие прерывания возникают в процессе начиная от коннекта 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);      
      }

Изменено пользователем svn79

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...