|
|
 |
Ответов
(1 - 11)
|
Jun 1 2011, 18:22
|
Участник

Группа: Участник
Сообщений: 33
Регистрация: 15-11-08
Пользователь №: 41 658

|
Спасибо за ответ. За неимением альтернатив (не нашел по крайней мере), уже ковыряюсь в этой библиотеке. И есть проблема. У меня на макетке кварц 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 - Jun 1 2011, 18:23
|
|
|
|
|
Jun 2 2011, 02:11
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Либы не юзаю, тк у меня ось своя и оно не совместимо, да и не люблю я эти либы, то,что там прописано,вернее то,что тебе нужно из того что там прописано  прописывается за день-два. В доке все почти хорошо описано, если прочитать ее несколько раз ) пс. в инете примеров для OTG_FS stm32f1xx не нашел ) вот мой кодик. код местами блокирует систему - в прерывании есть циклические ожидания, писалось чтобы освоить otg_fs в stm32f1, но и применяю уже. на какое время блокирует не проверял, но пока устраивает.
|
|
|
|
|
Jun 2 2011, 14:12
|
Участник

Группа: Участник
Сообщений: 33
Регистрация: 15-11-08
Пользователь №: 41 658

|
Спасибо, щас попробую. Вот последняя фраза "Ну и дальше" - это к чему?=)
|
|
|
|
|
Jun 6 2011, 22:25
|
Участник

Группа: Участник
Сообщений: 33
Регистрация: 15-11-08
Пользователь №: 41 658

|
Спасибо за подсказки, совладал с этой библиотекой. В голове уперто сидела идея, что все должно быть доступно прям из препроцессора, ан нет. Забыл отписаться по результатам, мало ли кому понадобится. Примеры от 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 */ } }
Сообщение отредактировал IgorKossak - Jun 7 2011, 06:35
Причина редактирования: [codebox]!!!
|
|
|
|
|
Jul 14 2011, 12:50
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 26-11-05
Пользователь №: 11 420

|
Уважаемый brag. Цитата(brag @ Jun 2 2011, 05:11)  Либы не юзаю, тк у меня ось своя и оно не совместимо, да и не люблю я эти либы, то,что там прописано,вернее то,что тебе нужно из того что там прописано  прописывается за день-два. В доке все почти хорошо описано, если прочитать ее несколько раз ) пс. в инете примеров для OTG_FS stm32f1xx не нашел ) вот мой кодик. код местами блокирует систему - в прерывании есть циклические ожидания, писалось чтобы освоить otg_fs в stm32f1, но и применяю уже. на какое время блокирует не проверял, но пока устраивает. Я так-же делаю otg без фреймворка. У меня так удачно прочитать доки что-то не получилось. Я задал свой вопрос http://electronix.ru/forum/index.php?showtopic=92328. Но потом нашел это обсуждение и решил обратиться к вам в этой ветке. Ваш пример внимательно изучил. Не вижу принципиальной разницы со своим кодом. Тем не менее у меня не работает. Проблема - получаю запрос дескриптора устройства, отправляю этот дескриптор - и все. ни ответа ни привета. Мой кодик.
usb_otg.txt ( 24.66 килобайт )
Кол-во скачиваний: 792 Это очень черновой вариант. Посмотрите пожалуйста, ткните носом, что не так.
|
|
|
|
|
Aug 2 2011, 10:06
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
выложите полный лог, какие прерывания возникают в процессе начиная от коннекта usb. если дескриптор запросило, значт должно запросить еще раз,если что-то не так.
у вас в УSB_DataInStage,USB_WriteEP явно что-то намучено, сравните с моей UsbEp0InXfr и главное, еще раз перепроверьте все ее содержимое согласно документации.
Внимательно пересмотрите обработку прерываний, я думаю, как раз там и застряет. Ну и доку usb2.0 покурите, чтобы было понятно, какое состояние за каким идет, оно примерно так же отражено в юзер-интерфейсе любого контроллера usb. начните, на пример со страницы 226(картинка внизу)
|
|
|
|
|
Dec 23 2011, 21:32
|
Группа: Новичок
Сообщений: 1
Регистрация: 23-12-11
Пользователь №: 69 060

|
Ув. коллеги! Камень 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 - Dec 23 2011, 21:37
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|