dionos



Ответы в темах

Просмотр 1 сообщения - с 1 по 1 (всего 1)
  • Автор
    Сообщения
  • в ответ на: Программирование МК STM32 #21728
    dionos
    Участник

    Доброго время суток. Помогите найти ошибку. Пытаюсь настроить ultrasonic us100 на stm32f103c8t6 на TIM4 CH1 на OnePulse Mode с последующем переключением на Input Capture Mode.

    RCC APB1 APB2 настроины на 48 Mhz

    Сброс настроек таймера и установка его на One pulse Mode:
    5 us пульс для запуска ultrasonic
    void TIM4_OnePulsModeInit()
    {
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

    TIM4->CR1 &= ~TIM_CR1_CEN;

    //Setup GPIO B6 as Alt func
    GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO State

    GPIOB->CRL |= GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_CNF6_1;
    GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);

    //Init Timer 40 Hz
    TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
    TIM4->ARR = 25000; // 0,025sec(period)
    CLEAR_REG(TIM4->CR1);
    CLEAR_REG(TIM4->CCER);
    CLEAR_REG(TIM4->EGR);
    CLEAR_REG(TIM4->CCMR1);

    TIM4->CR1 |= /*TIM_CR1_URS | */ TIM_CR1_OPM | TIM_CR1_ARPE; // Enable Update request source, One-pulse mode, Auto-reload preload enable
    TIM4->CCER |= TIM_CCER_CC1E; // Channel 1, CC1 channel configured as output
    TIM4->EGR |= TIM_EGR_UG; // Enable Update generation

    TIM4->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_2); //Enable Output compare 1 mode
    TIM4->CCMR1 |= (TIM_CCMR1_OC1PE); //Output compare 1 preload enable
    TIM4->CCR1 = 5000;
    TIM4->CR1 |= TIM_CR1_CEN;
    }

    Сбос настроек таймена и установка его на Input Capture Mode
    void Tim4_InputCaptureModeInit()
    {
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

    TIM4->CR1 &= ~TIM_CR1_CEN;

    //Setup GPIO B6 Input floating
    GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO State

    GPIOB->CRL |= GPIO_CRL_CNF6_0;
    //GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);

    CLEAR_REG(TIM4->CR1);
    CLEAR_REG(TIM4->CCER);
    CLEAR_REG(TIM4->EGR);
    CLEAR_REG(TIM4->CCMR1);

    //Init Timer 40 Hz
    TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
    TIM4->ARR = 25000; // 0,025sec(period)

    TIM4->CR1 |= TIM_CR1_URS;

    TIM4->CCMR1 |= TIM_CCMR1_CC1S_0; //CC1 channel is configured as input, IC1 is mapped on TI1
    TIM4->CCER |= TIM_CCER_CC1P; //1: inverted: capture is done on a falling edge of IC1
    TIM4->CCMR1 &= ~ TIM_CCMR1_IC1PSC;
    TIM4->CCER |= TIM_CCER_CC1E; //Enable capture from the counter into the capture register by setting the CC1E

    TIM4->CR1 |= TIM_CR1_CEN;
    }

    void main()
    {

    while(1)
    {
    TIM4_OnePulsModeInit();
    while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
    TIM4->SR &= ~TIM_SR_UIF;

    Tim4_InputCaptureModeInit();
    while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
    TIM4->SR &= ~TIM_SR_UIF;

    TIM4->SR &= ~TIM_SR_CC1IF;
    TIM4->SR &= ~TIM_SR_CC1OF;
    pulse = TIM4->CCR1;

    len = (uint32_t)((pulse * 331 / 2) / 1000);

    }
    }

    но pulse(TIM4->CCR1) переменная постоянно имеет значение 5000, которое было установлено в TIM4_OnePulsModeInit.

  • Автор
    Сообщения
  • в ответ на: Программирование МК STM32 #21728

    dionos
    Участник
    • Оффлайн

    Доброго время суток. Помогите найти ошибку. Пытаюсь настроить ultrasonic us100 на stm32f103c8t6 на TIM4 CH1 на OnePulse Mode с последующем переключением на Input Capture Mode.

    RCC APB1 APB2 настроины на 48 Mhz

    Сброс настроек таймера и установка его на One pulse Mode:
    5 us пульс для запуска ultrasonic
    void TIM4_OnePulsModeInit()
    {
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

    TIM4->CR1 &= ~TIM_CR1_CEN;

    //Setup GPIO B6 as Alt func
    GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO State

    GPIOB->CRL |= GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_CNF6_1;
    GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);

    //Init Timer 40 Hz
    TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
    TIM4->ARR = 25000; // 0,025sec(period)
    CLEAR_REG(TIM4->CR1);
    CLEAR_REG(TIM4->CCER);
    CLEAR_REG(TIM4->EGR);
    CLEAR_REG(TIM4->CCMR1);

    TIM4->CR1 |= /*TIM_CR1_URS | */ TIM_CR1_OPM | TIM_CR1_ARPE; // Enable Update request source, One-pulse mode, Auto-reload preload enable
    TIM4->CCER |= TIM_CCER_CC1E; // Channel 1, CC1 channel configured as output
    TIM4->EGR |= TIM_EGR_UG; // Enable Update generation

    TIM4->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_2); //Enable Output compare 1 mode
    TIM4->CCMR1 |= (TIM_CCMR1_OC1PE); //Output compare 1 preload enable
    TIM4->CCR1 = 5000;
    TIM4->CR1 |= TIM_CR1_CEN;
    }

    Сбос настроек таймена и установка его на Input Capture Mode
    void Tim4_InputCaptureModeInit()
    {
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;

    TIM4->CR1 &= ~TIM_CR1_CEN;

    //Setup GPIO B6 Input floating
    GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO State

    GPIOB->CRL |= GPIO_CRL_CNF6_0;
    //GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);

    CLEAR_REG(TIM4->CR1);
    CLEAR_REG(TIM4->CCER);
    CLEAR_REG(TIM4->EGR);
    CLEAR_REG(TIM4->CCMR1);

    //Init Timer 40 Hz
    TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
    TIM4->ARR = 25000; // 0,025sec(period)

    TIM4->CR1 |= TIM_CR1_URS;

    TIM4->CCMR1 |= TIM_CCMR1_CC1S_0; //CC1 channel is configured as input, IC1 is mapped on TI1
    TIM4->CCER |= TIM_CCER_CC1P; //1: inverted: capture is done on a falling edge of IC1
    TIM4->CCMR1 &= ~ TIM_CCMR1_IC1PSC;
    TIM4->CCER |= TIM_CCER_CC1E; //Enable capture from the counter into the capture register by setting the CC1E

    TIM4->CR1 |= TIM_CR1_CEN;
    }

    void main()
    {

    while(1)
    {
    TIM4_OnePulsModeInit();
    while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
    TIM4->SR &= ~TIM_SR_UIF;

    Tim4_InputCaptureModeInit();
    while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
    TIM4->SR &= ~TIM_SR_UIF;

    TIM4->SR &= ~TIM_SR_CC1IF;
    TIM4->SR &= ~TIM_SR_CC1OF;
    pulse = TIM4->CCR1;

    len = (uint32_t)((pulse * 331 / 2) / 1000);

    }
    }

    но pulse(TIM4->CCR1) переменная постоянно имеет значение 5000, которое было установлено в TIM4_OnePulsModeInit.

Просмотр 1 сообщения - с 1 по 1 (всего 1)