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

gab

Свой
  • Постов

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

  • Посещение

Весь контент gab


  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 - рабочий.
  15. Согласен. Мой прокол. Запутался при переносе с одной серии на другую.
  16. Алилуйа!!!! Спасибо!!!! Слона-то я и не заметил! Спасибо всем!!
  17. 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
  18. Всёравно вызывает и вываливается. 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
  19. размер 0x400. Всё-равно странно: это не первая вызываемая функция в main. После того как перепутал посадочное место у кварца я уже не знвю куда копать. :(
  20. ChibiOS. arm-none-eabi-gcc-7.2.1. Пробовал на 9-м одинаково. Всё прекрасно работает, моргает светодиодом пока не натыкается на код использующий strlen или strcmp. При этом strcmp падает только при равенстве сравниваемых строк. Убрав все навороты, поставив -O0, получил такой простой код гарантированно вызывающий HardFault: void main(){ ... инициализация периферии { char *s0 = "01234567890"; char *s1 = "01234567890"; char buf[128]; strcpy(buf, s0); // работает int a = strlen(s0); // вылетаем в HardFault int r = strcmp(s0, s1); // тоже вылетаем chprintf(ch_stdout, "%d, %d\n", r, a); } вывод gdb: i loc ctx = {r0 = 0, r1 = 134316136, r2 = 858927408, r3 = 926299444, r12 = 4294967295, lr_thd = 134300015, pc = 134219632, xpsr = 1627389952} faultType = HardFault faultAddress = 3758157112 isFaultPrecise = false isFaultImprecise = false isFaultOnUnstacking = false isFaultOnStacking = false isFaultAddressValid = false Менял клок с HSE на HSI и обратно. Тактовую ядра ставил 60МГц и 120МГц. Ничего не меняется. Если взять код strlen и strcmp из newlib, то они прекрасно работают.
  21. Трафарет заказывать надо. А у нас - по одной плате. Максимум - две. Невыгодно. Поэтому и ручной дозатор. А пасту - только прогреть до комнатной температуты.
  22. Я, конечно, утрировал :). А вообще, большую часть времени занимает разработка технологии как всё это добро паять. Нет у нас технолога :(. Самим приходится учиться. Ручной дозатор, подготовка паяльной пасты, подборка комплектующих из касс, расстановка. А потом - 15 минут - и готово!
  23. Кстати, поддержу. У нас http://www.lpkf.com/products/rapid-pcb-pro...reflow-oven.htm. Пайка 15 минут, а подготовка доходила до 40 часов. Мелкие платы проще вручную паять. Тем более у этой печки такие вентиляторы, что все элементы больше 1206 ставится криво.
  24. Насчёт денег - согласен. Посмотрим на сроки...
×
×
  • Создать...