Jump to content

    

gab

Свой
  • Content Count

    373
  • Joined

  • Last visited

Community Reputation

0 Обычный

About gab

  • Rank
    Местный
  • Birthday 07/21/1979

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

2282 profile views
  1. Проблема, кажется, решена. нужна строка в board.h #define STM32F302xC для этого типа чипа. Ком-порты определились. Работает.
  2. Через MXCube выяснил, что есть 302CBT. Там 128к. флеша. Списывать на подделку уже трудно.
  3. У меня большое подозрение, что чип - поддельный. у 302, кажется, нет версии с 128К флеша. В Chibios жёстко с этим. На стадии компиляции проверяется соответствие констант тактирования.
  4. Не работает. Почти. Если поставить ld-скрипт от 303, то загружается, моргает светодиодом и не определяется. ld-скрипт от 302 - не влезает. На чипе написано STM32F302C8T6 или CBT6, трудно разглядеть. OpenOCD пишет: Info : device id = 0x10036422 Info : flash size = 128kbytes Отрубил тесты. Влезло. Моргает и не определяется. /** * @brief USB reset routine. * @details This function must be invoked when an USB bus reset condition is * detected. * * @param[in] usbp pointer to the @p USBDriver object * * @notapi */ void _usb_reset(USBDriver *usbp) { unsigned i; /* State transition.*/ usbp->state = USB_READY; /* Resetting internal state.*/ usbp->status = 0; usbp->address = 0; usbp->configuration = 0; usbp->transmitting = 0; usbp->receiving = 0; /* Invalidates all endpoints into the USBDriver structure.*/ for (i = 0; i <= (unsigned)USB_MAX_ENDPOINTS; i++) { #if USB_USE_WAIT == TRUE /* Signaling the event to threads waiting on endpoints.*/ if (usbp->epc[i] != NULL) { osalSysLockFromISR(); if (usbp->epc[i]->in_state != NULL) { osalThreadResumeI(&usbp->epc[i]->in_state->thread, MSG_RESET); } if (usbp->epc[i]->out_state != NULL) { osalThreadResumeI(&usbp->epc[i]->out_state->thread, MSG_RESET); } osalSysUnlockFromISR(); } #endif usbp->epc[i] = NULL; } /* EP0 state machine initialization.*/ usbp->ep0state = USB_EP0_STP_WAITING; /* Low level reset.*/ usb_lld_reset(usbp); /* Notification of reset event.*/ _usb_isr_invoke_event_cb(usbp, USB_EVENT_RESET); } /** * @brief USB low level reset routine. * * @param[in] usbp pointer to the @p USBDriver object * * @notapi */ void usb_lld_reset(USBDriver *usbp) { uint32_t cntr; /* Post reset initialization.*/ STM32_USB->BTABLE = BTABLE_ADDR; STM32_USB->ISTR = 0; STM32_USB->DADDR = DADDR_EF; cntr = /*CNTR_ESOFM | */ CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM | /*CNTR_ERRM | CNTR_PMAOVRM |*/ CNTR_CTRM; /* The SOF interrupt is only enabled if a callback is defined for this service because it is an high rate source.*/ if (usbp->config->sof_cb != NULL) cntr |= CNTR_SOFM; STM32_USB->CNTR = cntr; /* Resets the packet memory allocator.*/ usb_pm_reset(usbp); /* EP0 initialization.*/ usbp->epc[0] = &ep0config; usb_lld_init_endpoint(usbp, 0); }
  5. На A8 вытащил MCO. PCLK/2 = 36МГц. Точнее 35,999. USB прескалер - 1,5.
  6. Вывод dmesg в линуксе: [117379.864359] usb 1-1: new full-speed USB device number 18 using xhci_hcd [117379.992115] usb 1-1: device descriptor read/64, error -71 [117380.227595] usb 1-1: device descriptor read/64, error -71 [117380.335552] usb usb1-port1: attempt power cycle [117380.985577] usb 1-1: new full-speed USB device number 19 using xhci_hcd [117380.985719] usb 1-1: Device not responding to setup address. [117381.193652] usb 1-1: Device not responding to setup address. [117381.401082] usb 1-1: device not accepting address 19, error -71 [117381.528772] usb 1-1: new full-speed USB device number 20 using xhci_hcd [117381.528990] usb 1-1: Device not responding to setup address. [117381.736693] usb 1-1: Device not responding to setup address. [117381.736778] debugfs: Directory '05' with parent 'devices' already present! [117381.943880] usb 1-1: device not accepting address 20, error -71 [117381.944062] usb usb1-port1: unable to enumerate USB device
  7. OSAL_IRQ_HANDLER(STM32_USB1_LP_HANDLER) { uint32_t istr; USBDriver *usbp = &USBD1; OSAL_IRQ_PROLOGUE(); istr = STM32_USB->ISTR; /* USB bus reset condition handling.*/ if (istr & ISTR_RESET) { STM32_USB->ISTR = ~ISTR_RESET; _usb_reset(usbp); } /* USB bus SUSPEND condition handling.*/ if (istr & ISTR_SUSP) { STM32_USB->CNTR |= CNTR_FSUSP; #if STM32_USB_LOW_POWER_ON_SUSPEND STM32_USB->CNTR |= CNTR_LP_MODE; #endif STM32_USB->ISTR = ~ISTR_SUSP; _usb_suspend(usbp); } /* USB bus WAKEUP condition handling.*/ if (istr & ISTR_WKUP) { uint32_t fnr = STM32_USB->FNR; if (!(fnr & FNR_RXDP)) { STM32_USB->CNTR &= ~CNTR_FSUSP; _usb_wakeup(usbp); } #if STM32_USB_LOW_POWER_ON_SUSPEND else { /* Just noise, going back in SUSPEND mode, reference manual 22.4.5, table 169.*/ STM32_USB->CNTR |= CNTR_LP_MODE; } #endif STM32_USB->ISTR = ~ISTR_WKUP; } /* SOF handling.*/ if (istr & ISTR_SOF) { _usb_isr_invoke_sof_cb(usbp); STM32_USB->ISTR = ~ISTR_SOF; } /* Endpoint events handling.*/ while (istr & ISTR_CTR) { usb_serve_endpoints(usbp, istr & ISTR_EP_ID_MASK); istr = STM32_USB->ISTR; } OSAL_IRQ_EPILOGUE(); } Вот весь обработчик. За время связи вызывается 3 раза. Флаги ISTR: 1. RESET 2. ESOF | RESET | SUSP 3. ESOF
  8. Вот определение: /** * @name Low level driver helper macros * @{ */ /** * @brief Common ISR code, usb event callback. * * @param[in] usbp pointer to the @p USBDriver object * @param[in] evt USB event code * * @notapi */ #define _usb_isr_invoke_event_cb(usbp, evt) { \ if (((usbp)->config->event_cb) != NULL) { \ (usbp)->config->event_cb(usbp, evt); \ } \ } event_cb и есть этот usb_event. Ещё есть usb_serve_endpoints, но он не вызывается.
  9. Так не доходит до конфигурации. Точка останова стоит на "usb_event". Ещё один момент. на чипе написано STM32F302C8T6 или CBT6, трудно разглядеть. А пишет: Info : device id = 0x10036422 Info : flash size = 128kbytes
  10. Собственно, вот и вся проблема. :( Внешний кварц 16МГц. Осциллограф показывает 16МГц. Через mcuconf.h настроил тактирование. Вроде всё верно. #define STM32_NO_INIT FALSE #define STM32_PVD_ENABLE FALSE #define STM32_PLS STM32_PLS_LEV0 #define STM32_HSI_ENABLED TRUE #define STM32_LSI_ENABLED TRUE #define STM32_HSE_ENABLED TRUE #define STM32_LSE_ENABLED FALSE #define STM32_SW STM32_SW_PLL #define STM32_PLLSRC STM32_PLLSRC_HSE #define STM32_PREDIV_VALUE 2 // 16MHZ HSE -> 72MHZ SYSCLK #define STM32_PLLMUL_VALUE 9 #define STM32_HPRE STM32_HPRE_DIV1 // 72MHz AHB #define STM32_PPRE1 STM32_PPRE1_DIV2 // 36MHz APB1 #define STM32_PPRE2 STM32_PPRE2_DIV2 // 72MHz APB2 #define STM32_MCOSEL STM32_MCOSEL_NOCLOCK #define STM32_ADC12PRES STM32_ADC12PRES_DIV1 Программа стартует, отрабатывает следующий код: sduObjectInit(&SDU1); sduStart(&SDU1, &serusbcfg); usbDisconnectBus(serusbcfg.usbp); chThdSleepMilliseconds(1500); usbStart(serusbcfg.usbp, &usbcfg); usbConnectBus(serusbcfg.usbp); И навечно остаётся в следующем коде, моргая светодиодом: while (SDU1.config->usbp->state != USB_ACTIVE) { led_toggle(STATUS_LED); chThdSleepMilliseconds(500); } в обработчике: static void usb_event(USBDriver *usbp, usbevent_t event) { extern SerialUSBDriver SDU1; switch (event) { case USB_EVENT_ADDRESS: return; case USB_EVENT_CONFIGURED: chSysLockFromISR(); /* Enables the endpoints specified into the configuration. Note, this callback is invoked from an ISR so I-Class functions must be used.*/ usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config); usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config); /* Resetting the state of the CDC subsystem.*/ sduConfigureHookI(&SDU1); chSysUnlockFromISR(); return; case USB_EVENT_RESET: /* Falls into.*/ case USB_EVENT_UNCONFIGURED: /* Falls into.*/ case USB_EVENT_SUSPEND: chSysLockFromISR(); /* Disconnection event on suspend.*/ sduSuspendHookI(&SDU1); chSysUnlockFromISR(); return; case USB_EVENT_WAKEUP: chSysLockFromISR(); /* Connection event on wakeup.*/ sduWakeupHookI(&SDU1); chSysUnlockFromISR(); return; case USB_EVENT_STALLED: return; } return; } несколько раз дёргается USB_EVENT_RESET, после USB_EVENT_SUSPEND и всё. Событие USB_EVENT_CONFIGURED никогда не приходит. Операционка говорит, что не может прочитать дескриптор устройства. Резистор подтяжки есть. По шине что-то дёргается. Уже не знаю куда копать. :( Update: В режиме DFU определяется системой нормально. Т.е. физический канал USB - рабочий.
  11. Согласен. Мой прокол. Запутался при переносе с одной серии на другую.
  12. Алилуйа!!!! Спасибо!!!! Слона-то я и не заметил! Спасибо всем!!
  13. gcc -mcpu=cortex-m4 -mthumb -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -Wall -Wextra -Wstrict-prototypes -Wa,-alms=./build/lst/ -DUAVCAN_TOSTRING=0 -DUAVCAN_DEBUG=0 -DUAVCAN_STM32_NUM_IFACES=1 -DUAVCAN_STM32_TIMER_NUMBER=3 -DUAVCAN_STM32_CHIBIOS=1 -DUAVCAN_CPP_VERSION=UAVCAN_CPP11 -DCORTEX_USE_FPU=FALSE -DDEBUG_BUILD -DCRT1_AREAS_NUMBER=0 -MD -MP -MF ./.dep/PRE_MAKE_ALL_RULE_HOOK.d g++ -mcpu=cortex-m4 -mthumb -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -fno-rtti -std=gnu++11 -fno-exceptions -Wall -Wextra -Wundef -Wa,-alms=./build/lst/ -DUAVCAN_TOSTRING=0 -DUAVCAN_DEBUG=0 -DUAVCAN_STM32_NUM_IFACES=1 -DUAVCAN_STM32_TIMER_NUMBER=3 -DUAVCAN_STM32_CHIBIOS=1 -DUAVCAN_CPP_VERSION=UAVCAN_CPP11 -DCORTEX_USE_FPU=FALSE -DDEBUG_BUILD -DCRT1_AREAS_NUMBER=0 -MD -MP -MF ./.dep/PRE_MAKE_ALL_RULE_HOOK.d ld -mcpu=cortex-m4 -mthumb -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -nostartfiles -Wl,-Map=./build/riyo-sw.map,--cref,--no-warn-mismatch,--library-path=../chibios203/os/common/startup/ARMCMx/compilers/GCC/ld,--script=linker/STM32F207xG.ld,--gc-sections,--defsym=__process_stack_size__=0x800,--defsym=__main_stack_size__=0x800
  14. Всёравно вызывает и вываливается. 197 int a = strlen(s0); 08014108: ldr r0, [sp, #164] ; 0xa4 0801410a: bl 0x8000740 <strlen> 0801410e: mov r3, r0 08014110: str r3, [sp, #156] ; 0x9c ----------- strlen: 08000740: pld [r0] 08000744: strd r4, r5, [sp, #-8]! 08000748: bic.w r1, r0, #7 0800074c: mvn.w r12, #0 08000750: ands.w r4, r0, #7 08000754: pld [r1, #32] 08000758: bne.w 0x80007ee <strlen+174> 0800075c: mov.w r4, #0 08000760: mvn.w r0, #7 08000764: ldrd r2, r3, [r1] 08000768: pld [r1, #64] ; 0x40 0800076c: add.w r0, r0, #8 08000770: uadd8 r2, r2, r12 ------- вот тут вываливается!!!! 08000774: sel r2, r4, r12 08000778: uadd8 r3, r3, r12 0800077c: sel r3, r2, r12 08000780: cbnz r3, 0x80007d6 <strlen+150> 08000782: ldrd r2, r3, [r1, #8] 08000786: uadd8 r2, r2, r12 0800078a: add.w r0, r0, #8 0800078e: sel r2, r4, r12 08000792: uadd8 r3, r3, r12 08000796: sel r3, r2, r12 0800079a: cbnz r3, 0x80007d6 <strlen+150> 0800079c: ldrd r2, r3, [r1, #16] 080007a0: uadd8 r2, r2, r12 080007a4: add.w r0, r0, #8 080007a8: sel r2, r4, r12 080007ac: uadd8 r3, r3, r12 080007b0: sel r3, r2, r12 080007b4: cbnz r3, 0x80007d6 <strlen+150> 080007b6: ldrd r2, r3, [r1, #24] 080007ba: add.w r1, r1, #32 080007be: uadd8 r2, r2, r12 080007c2: add.w r0, r0, #8 080007c6: sel r2, r4, r12 080007ca: uadd8 r3, r3, r12 080007ce: sel r3, r2, r12 080007d2: cmp r3, #0 080007d4: beq.n 0x8000764 <strlen+36> 080007d6: cmp r2, #0 080007d8: itt eq 080007da: addeq r0, #4 080007dc: moveq r2, r3 080007de: rev r2, r2 080007e0: clz r2, r2 080007e4: ldrd r4, r5, [sp], #8 080007e8: add.w r0, r0, r2, lsr #3 080007ec: bx lr 080007ee: ldrd r2, r3, [r1] 080007f2: and.w r5, r4, #3 080007f6: rsb r0, r4, #0 080007fa: mov.w r5, r5, lsl #3 080007fe: tst.w r4, #4 08000802: pld [r1, #64] ; 0x40 08000806: lsl.w r5, r12, r5 0800080a: orn r2, r2, r5 0800080e: itt ne 08000810: ornne r3, r3, r5 08000814: movne r2, r12 08000816: mov.w r4, #0 0800081a: b.n 0x8000770 <strlen+48> 0800081c: movs r0, r0 0800081e: movs r0, r0