Ответ в теме: Программирование МК 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.