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

gab

Свой
  • Постов

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

  • Посещение

Сообщения, опубликованные gab


  1. 2 hours ago, gab said:

    Есть ремэп:

     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?

     

    Отвечаю сам себе:

      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. 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?

     

  3. 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МГц.

  4. Никак не получается вывести сигнал с таймера на вывод МК. До этого не работал с 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. У меня большое подозрение, что чип - поддельный. у 302, кажется, нет версии с 128К флеша.

    17 minutes ago, Сергей Борщ said:

    Чему равен этот DADDR_EF?

    А, нагуглил. Криминала не видно.

    Подумаю еще.  Больше всего похоже на проблемы с линией D- (но вы пишете, что DFU у вас определяется) или, как писал VladislavS, на проблемы с тактированием. Проверьте на всякий случай еще раз - делитель точно на 1.5 устанавливается?

    В Chibios жёстко с этим. На стадии компиляции проверяется соответствие констант тактирования.

  6. Не работает. Почти.

    Если поставить 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);
    }

     

  7. Вывод 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
     

  8. 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

     

  9. Вот определение:

    /**
     * @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, но он не вызывается.

  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.  

    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
     

  12. 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

     

  13. 31 minutes ago, jcxz said:

    Переполнение стека?

    Интересно - зачем?  Из разряда "и колёса пинал и стёкла протёр, а всё равно не заводится".  :sarcastic:

    размер 0x400. Всё-равно странно: это не первая вызываемая функция в main.

     

    После того как перепутал посадочное место у кварца я уже не знвю куда копать. :(

  14. 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, то они прекрасно работают.

  15. ручной дозатор ? почему не трафарет ? подготовка пасты-это что вы с ней делаете?..

     

    Трафарет заказывать надо. А у нас - по одной плате. Максимум - две. Невыгодно. Поэтому и ручной дозатор. А пасту - только прогреть до комнатной температуты.

  16. скажите:а 40 часов на что уходит? при 8-ми часовом рабочем дне-это НЕДЕЛЯ...может я не прав?

    Я, конечно, утрировал :).

    А вообще, большую часть времени занимает разработка технологии как всё это добро паять. Нет у нас технолога :(. Самим приходится учиться. Ручной дозатор, подготовка паяльной пасты, подборка комплектующих из касс, расстановка. А потом - 15 минут - и готово!

  17. Мелкая серия дома вполне реально! Но в виде ручного монтажа .....

    собираю по 100 -150 плат в месяц ,разных (- одного вида 10-20шт)

    в зависимости от спроса. совершенно без напряга.

    (Правда у меня станция Ersa со всеми возможными паяльниками , насадками , и местной вытяжкой)

    Вот думал облегчить себе жизнь - но в реале получилось наоборот:

    монтаж на пасте получился дольше из-за подготовки - нанесения пасты и установки элементов в ручную

    качество хуже ( из-за отсутствия у меня опыта и должного оборудования )

    + проблемы с проветриванием квартиры .

    Так что мысли о печке убрал подальше ...

    Если нужно будет делать большее количество - отдам на производсво

     

    Кстати, поддержу. У нас http://www.lpkf.com/products/rapid-pcb-pro...reflow-oven.htm. Пайка 15 минут, а подготовка доходила до 40 часов. Мелкие платы проще вручную паять. Тем более у этой печки такие вентиляторы, что все элементы больше 1206 ставится криво.

  18. Недавно, несколько месяцев назад были аналогичные косяки с электроконтролем многослоек. Отчёт хороший, а замыкания имеются.

    И сроки всё время затягиваются. Проще у Китайцев, у них у.е. равен 30руб. а не 47руб. как в ТабеРУ, по ценам даже с посредником дешевле выходит, сроки Китайцы не нарушают (если на новый год не попадать), а качество очень хорошее - ещё не одного косяка за ними не замечено.

    Насчёт денег - согласен. Посмотрим на сроки...

×
×
  • Создать...