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

gab

Свой
  • Постов

    377
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о gab

  • Звание
    Местный
    Местный
  • День рождения 21.07.1979

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Посетители профиля

2 684 просмотра профиля
  1. stm32f103 и выход таймера

    Отвечаю сам себе: AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1 | AFIO_MAPR_TIM3_REMAP_PARTIALREMAP; //ch1 / pb4 Вот как правильно! PB4 по умолчанию завязан на JTAG. Нужно выставить вот этот режим: "001: Full SWJ (JTAG-DP + SW-DP) but without NJTRST" ШИМ на PB4 появился.
  2. stm32f103 и выход таймера

    Есть ремэп: AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_PARTIALREMAP; //ch1 / pb4 Вывод PB4 сконфигурирован как alternate push/pull (0xB) регистры GPIO1: (GPIOB) CRL: 33BBB338 CRH: B4B833FF IDR: 000053FD BSRR: 00000000 BRR: 00000000 LCKR: 00000000 регистры AFIO: EVCR: 00000000 MAPR: 00000802 EXTICR[0]: 00000000 [1]: 00000000 [2]: 00000000 [3]: 00000000 MAPR2: 00000000 тактовая AF разрешена: rccEnableAPB2(RCC_APB2ENR_AFIOEN, true); Замыканий на плате нет. Проверял и свою и китайскую BluePill, благо по схемотехнике и кварцам почти одинаковы. Если вывод перевести в обычный push/pull и просто им дёргать - дёргается. На alternate push/pull - просто стоит в высоком состоянии. В общем, таймер крутится, а на выходе единица. Соседние каналы (TIM3CH2, TIM3CH3) - тоже стабильная единица ------------------- Сделал AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_NOREMAP GPIO0: CRL: 8B884B84 CRH: 888F44BB IDR: 0000B7F3 BSRR: 00000000 BRR: 00000000 LCKR: 00000000 AFIO: EVCR: 00000000 MAPR: 00000002 EXTICR[0]: 00000000 [1]: 00000000 [2]: 00000000 [3]: 00000000 MAPR2: 00000000 И на PA6 появился ШИМ. Как теперь это перенести на PB4?
  3. stm32f103 и выход таймера

    Отлично. А без HAL? У меня просто: ---- TIM3->PSC=72-1; TIM3->ARR = 100-1; TIM3->CCMR1 |= TIM_CCMR1_OC1PE; TIM3->CCMR1 |= TIM_CCMR1_OC2PE; TIM3->CCMR2 |= TIM_CCMR2_OC3PE; TIM3->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1);//OC1M = 110 - PWM mode 1 TIM3->CCMR1 |= (TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1);//OC2M = 110 - PWM mode 1 TIM3->CCMR2 |= (TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1); // 110 - PWM mode 1 TIM3->CCR1 = 50; TIM3->CCR2 = 50; TIM3->CCR3 = 50; TIM3->CCER |= TIM_CCER_CC3E | TIM_CCER_CC2E | TIM_CCER_CC1E; TIM3->CCER |= TIM_CCER_CC1P; TIM3->CR1 |= TIM_CR1_CEN; ----- Тактовая - 72МГц.
  4. stm32f103 и выход таймера

    Никак не получается вывести сигнал с таймера на вывод МК. До этого не работал с 1хх серией. Таймер считает (CNT считает до ARR и сбрасывается). При желании даже прерывания с него ловятся (UG), но вывод (PB4) остаётся в высоком состоянии. Регистра BDTR, как я понял, в 103-м нет. Вот состояния регистров: ---- TIM3: CR1: 0001 CR2: 0000 SMCR: 0000 DIER: 0000 SR: 001F EGR: 0000 CCMR1: 6868 CCMR2: 0068 CCER: 0113 CNT: 00B5 PSC: 0047 ARR: 00C8 RCR: 0000 CCR[0]: 0032 [1]: 0032 [2]: 0032 [3]: 0000 BDTR: 0000 DCR: 0000 DMAR: 0001 OR: 0000 CCMR3: 0000 CCXR[0]: 0000 [1]: 0000 ------ GPIO1: CRL: 33BBB338 CRH: B4B833FF IDR: 00005BFD BSRR: 00000000 BRR: 00000000 LCKR: 00000000 ------ AFIO: EVCR: 00000000 MAPR: 00000802 EXTICR[0]: 00000000 [1]: 00000000 [2]: 00000000 [3]: 00000000 MAPR2: 00000000 ------
  5. Проблема, кажется, решена. нужна строка в board.h #define STM32F302xC для этого типа чипа. Ком-порты определились. Работает.
  6. Через MXCube выяснил, что есть 302CBT. Там 128к. флеша. Списывать на подделку уже трудно.
  7. У меня большое подозрение, что чип - поддельный. у 302, кажется, нет версии с 128К флеша. В Chibios жёстко с этим. На стадии компиляции проверяется соответствие констант тактирования.
  8. Не работает. Почти. Если поставить 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); }
  9. На A8 вытащил MCO. PCLK/2 = 36МГц. Точнее 35,999. USB прескалер - 1,5.
  10. Вывод 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
  11. 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
  12. Вот определение: /** * @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, но он не вызывается.
  13. Так не доходит до конфигурации. Точка останова стоит на "usb_event". Ещё один момент. на чипе написано STM32F302C8T6 или CBT6, трудно разглядеть. А пишет: Info : device id = 0x10036422 Info : flash size = 128kbytes
  14. Не заводится USB на STM32F302. Chibios

    Собственно, вот и вся проблема. :( Внешний кварц 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 - рабочий.
×
×
  • Создать...