>

STM32F407VGT6 를 사용하고 있습니다   CubeMX 와 함께
그래서 저는 범용 타이머로 시작했고 프리 스케일과주기 값으로 고착되었습니다.

기본적으로 모든 n 에 타이머 인터럽트를 생성하고 싶습니다 (여기서 n = 1,2,3 ..) ms이고 일부 작업을 수행합니다.
기간 및 프리 스케일 값을 계산하는 수식에는 많은 변형이 있습니다

일부 버전의 수식은 다음과 같습니다.

와이즈 비즈

그래서 질문에 와서, 내 핵심 시계는

TIMupdateFreq(HZ) = Clock/((PSC-1)*(Period-1))
Update Event = TIM clk/((PSC+1)*(ARR+1)*(RCR+1))
Prescaler = ((((ClockSpeed) / ((period) / (1 / frequency))) + 0.5) - 1)

에서 실행 중입니다.  하지만 타이머가 168 MHz 에 연결된 것을 볼 수 있습니다   APB1 Bus 에서 실행되는 .

1ms 지연을 생성하는 코드를 시도했지만 (저자에 의해) 프리 스케일 및 기간에 해당 값을 사용한 후 1ms 지연을 생성하는 코드를 생성했습니다 (직관적으로-범위 없음).

이 코드는 프리 스케일 값 41999와 1999 기간을 사용합니다.

그러므로
PSC-41999
ARR-1999
이것을 두 번째 공식에 추가

84 MHz

Update Event = TIM clk/((PSC+1)*(ARR+1)*(RCR+1))  (이것은 1ms 지연입니까 ??)

알았어. 이제 나는이 Update Event = 84000000/(42000*2000) = 1 를 어떻게 이해하려고 노력하고있다  그리고 PSC = 41999  선택 ?? 그것은 내가 사용하는 모든 수식에서와 같이 가정을 기반으로합니까? 하나의 변수를 가정해야합니다. ?? 정확한 타이밍과 같은 1.5 또는 2.3 또는 4.9를 원한다면 프리 스케일과주기를 계산하는 방법. ??

수정

내가 Period = 1999 를 사용했을 때의

 업데이트 이벤트 값은 2입니다.

PSC=41999 and Period =999

그러나 나의 지연은 매초마다 두 번이다. 즉 500ms

그리고 Update Event = 84000000/(42000*1000) = 2 를 사용할 때  업데이트 이벤트 값은 0.5입니다.

PSC=39999 and Period =4199

지체가 2 밀리 초입니다

미리 감사합니다

Update Event = 84000000/(40000*4200) = 0.5

  • 답변 # 1

    와이즈 비즈

    이것은 분명히 틀렸다. 카운터는 0에서 레지스터 값 (포함)으로 이동합니다. 레지스터 값보다 사이클이 항상 1 회 이상 있습니다.

    와이즈 비즈

    이것이 더 좋지만 범용 타이머에는

    TIMupdateFreq(HZ) = Clock/((PSC-1)*(Period-1))

    가 없습니다.  레지스터. 당신은

    Update Event = TIM clk/((PSC+1) * (ARR+1) * (RCR+1))

    를 가정 할 수 있습니다 RCR 를 생략하고  공식에서.

    와이즈 비즈 정수 솔루션이 불가능한 경우 결과를 반올림합니다. 나중에 자세히 알아보십시오.

    와이즈 비즈 와이즈 비즈  (이것은 1ms 지연입니까 ??)

    아니요, 1 초 지연 또는 1Hz 주파수입니다.

    와이즈 비즈 와이즈 비즈  그리고 RCR=0  선택 되었습니까?

    간단한 공식을 취하십시오

    *(RCR+1)
    
    

    로 재정렬

    Prescaler = ((((ClockSpeed) / ((period) / (1 / frequency))) + 0.5) - 1)

    그런 다음 오른쪽에는 알려진 값이 있지만 왼쪽에는 두 개의 미지수가 있습니다. 사소한 해결책은 그중 하나를 설정하는 것입니다. 와이즈 비즈  

    로 및 Update Event = 84000000/(42000*2000) = 1  오른쪽 값-1

    불행히도 대부분의 타이머에는 16 비트 레지스터 만 있으므로

    how this 에서는 작동하지 않습니다. .와이즈 비즈  그리고 PSC = 41999  0과 65535 사이 여야합니다.이러한 제약 조건을 만족하는 인수 분해를 찾아야합니다.

    예를 들어 2.3 초 지연을 원할 것입니다. 2.3s는주기가 아니라주기이므로 공식에 역수를 넣어야합니다.

    Period = 1999

    마지막으로 많은 0이 있습니다. 예를 들어 와이즈 비즈  프리스케일러 ( Updatefrequency = TIM clk/((PSC+1)*(ARR+1)) ) ) 및 (PSC+1)*(ARR+1) = TIMclk/Updatefrequency   PSC 가된다 . 원하는 비율이 좋은 숫자가 아닌 경우 정수 인수 분해를 사용하거나 가능한 모든 제수 ( 0 )를 찾기위한 작은 프로그램을 작성해야합니다. ).

    정확한 정수 솔루션이 전혀없는 경우에도 가능한 모든 프리스케일러 값을 반복하여 어느 것이 가장 작은 오류인지 확인할 수 있습니다.

    와이즈 비즈 와이즈 비즈

         

    그러나 나의 지연은 매초마다 두 번이다. 즉 500ms

    크기에 유의하십시오. 공식에서주파수를 사용하고 있으며 84MHz 입력 주파수를 일부 값으로 나누고 결과적으로2Hz를 얻습니다. 2Hz 주파수는 초당 2 개의 이벤트를 의미하므로 이벤트는 실제로 500ms 간격입니다.

    ARR

  • 이전 python - 웹 스크래핑 중에 특정 국가에있는 척하는 방법은 무엇입니까?
  • 다음 java - 최신 Jetty 버전을 실행하면 빌드가 중단됩니다