gab
-
Постов
377 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные gab
-
-
15 hours ago, AHTOXA said:
Есть, в TIM1 и TIM8. В расширенных таймерах.
У вас в инициализации вроде бы всё нормально, но надо ножки включить в режим Alternate output.
Есть ремэп:
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?
-
1 hour ago, x893 said:
STM32Cube_FW_F1_V1.8.4\Projects\STM3210E_EVAL\Examples\TIM\TIM_PWMOutput
Отлично. А без 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МГц.
-
Никак не получается вывести сигнал с таймера на вывод МК. До этого не работал с 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
------ -
Проблема, кажется, решена.
нужна строка в board.h
#define STM32F302xC
для этого типа чипа.Ком-порты определились. Работает.
-
Через MXCube выяснил, что есть 302CBT. Там 128к. флеша. Списывать на подделку уже трудно.
-
У меня большое подозрение, что чип - поддельный. у 302, кажется, нет версии с 128К флеша.
17 minutes ago, Сергей Борщ said:Чему равен этот DADDR_EF?
А, нагуглил. Криминала не видно.
Подумаю еще. Больше всего похоже на проблемы с линией D- (но вы пишете, что DFU у вас определяется) или, как писал VladislavS, на проблемы с тактированием. Проверьте на всякий случай еще раз - делитель точно на 1.5 устанавливается?
В Chibios жёстко с этим. На стадии компиляции проверяется соответствие констант тактирования.
-
Не работает. Почти.
Если поставить ld-скрипт от 303, то загружается, моргает светодиодом и не определяется.
ld-скрипт от 302 - не влезает.
На чипе написано STM32F302C8T6 или CBT6, трудно разглядеть. OpenOCD пишет:
Info : device id = 0x10036422
Info : flash size = 128kbytesОтрубил тесты. Влезло. Моргает и не определяется.
8 hours ago, Сергей Борщ said:Давайте смотреть, что делает _usb_reset(usbp)
/** * @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); }
-
На A8 вытащил MCO. PCLK/2 = 36МГц. Точнее 35,999. USB прескалер - 1,5.
-
Вывод 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
-
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
-
Вот определение:
/** * @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, но он не вызывается.
-
Так не доходит до конфигурации. Точка останова стоит на "usb_event".
Ещё один момент. на чипе написано STM32F302C8T6 или CBT6, трудно разглядеть. А пишет:
Info : device id = 0x10036422
Info : flash size = 128kbytes -
Нет. Мэйкфайлы.
-
Собственно, вот и вся проблема. :(
Внешний кварц 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 - рабочий.
-
44 minutes ago, jcxz said:
Систему команд используемого МК нужно знать. Чтобы понимать - где код, а где - мусор.
Согласен. Мой прокол. Запутался при переносе с одной серии на другую.
-
5 minutes ago, VladislavS said:
Какой же F215 и -mcpu=cortex-m4 ?
Алилуйа!!!! Спасибо!!!! Слона-то я и не заметил! Спасибо всем!!
-
11 minutes ago, AHTOXA said:
А тот, что не работает - он откуда?
Возможно, линкуется не та библиотека (-mcpu=? -mthumb). Покажите полную командную строку компилятора и линкера.
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
-
1 minute ago, VladislavS said:
Самое прикольное, что компилятор даже на минимальной оптимизации вычисляет a=11 и r=0 как константы.
Всёравно вызывает и вываливается.
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
-
31 minutes ago, jcxz said:
Переполнение стека?
Интересно - зачем? Из разряда "и колёса пинал и стёкла протёр, а всё равно не заводится".
размер 0x400. Всё-равно странно: это не первая вызываемая функция в main.
После того как перепутал посадочное место у кварца я уже не знвю куда копать. :(
-
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, то они прекрасно работают.
-
ручной дозатор ? почему не трафарет ? подготовка пасты-это что вы с ней делаете?..
Трафарет заказывать надо. А у нас - по одной плате. Максимум - две. Невыгодно. Поэтому и ручной дозатор. А пасту - только прогреть до комнатной температуты.
-
скажите:а 40 часов на что уходит? при 8-ми часовом рабочем дне-это НЕДЕЛЯ...может я не прав?
Я, конечно, утрировал :).
А вообще, большую часть времени занимает разработка технологии как всё это добро паять. Нет у нас технолога :(. Самим приходится учиться. Ручной дозатор, подготовка паяльной пасты, подборка комплектующих из касс, расстановка. А потом - 15 минут - и готово!
-
Мелкая серия дома вполне реально! Но в виде ручного монтажа .....
собираю по 100 -150 плат в месяц ,разных (- одного вида 10-20шт)
в зависимости от спроса. совершенно без напряга.
(Правда у меня станция Ersa со всеми возможными паяльниками , насадками , и местной вытяжкой)
Вот думал облегчить себе жизнь - но в реале получилось наоборот:
монтаж на пасте получился дольше из-за подготовки - нанесения пасты и установки элементов в ручную
качество хуже ( из-за отсутствия у меня опыта и должного оборудования )
+ проблемы с проветриванием квартиры .
Так что мысли о печке убрал подальше ...
Если нужно будет делать большее количество - отдам на производсво
Кстати, поддержу. У нас http://www.lpkf.com/products/rapid-pcb-pro...reflow-oven.htm. Пайка 15 минут, а подготовка доходила до 40 часов. Мелкие платы проще вручную паять. Тем более у этой печки такие вентиляторы, что все элементы больше 1206 ставится криво.
-
Недавно, несколько месяцев назад были аналогичные косяки с электроконтролем многослоек. Отчёт хороший, а замыкания имеются.
И сроки всё время затягиваются. Проще у Китайцев, у них у.е. равен 30руб. а не 47руб. как в ТабеРУ, по ценам даже с посредником дешевле выходит, сроки Китайцы не нарушают (если на новый год не попадать), а качество очень хорошее - ещё не одного косяка за ними не замечено.
Насчёт денег - согласен. Посмотрим на сроки...
stm32f103 и выход таймера
в STM
Опубликовано · Пожаловаться
Отвечаю сам себе:
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 появился.