TIM 초기화 함수

void TIM_Configuration()

{

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_OCInitTypeDef  TIM_OCInitStructure;

  uint16_t PrescalerValue = 0;

  

  /* Compute the prescaler value */

  PrescalerValue = (uint16_t) (SystemCoreClock / 50000) - 1;

  

  /* Time base configuration */

  TIM_TimeBaseStructure.TIM_Period = 1000-1;

  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  

  TIM_PrescalerConfig(TIM4, PrescalerValue, TIM_PSCReloadMode_Immediate);

  

  /* PWM1 Mode configuration: Channel3 */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

  TIM_OC3Init(TIM4, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

  

  TIM_ARRPreloadConfig(TIM4, ENABLE);

  

  /* TIM4 Update DMA Request enable */

  TIM_DMACmd(TIM4, TIM_DMA_CC3, ENABLE);

  

  /* TIM4 enable counter */

  TIM_Cmd(TIM4, ENABLE);

  

  /* Main Output Enable */

  TIM_CtrlPWMOutputs(TIM4, ENABLE);

}


Frequency, cycle을 결정하는 부분


TIM_TimeBaseStructure.TIM_Period = 1000-1;

TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;


stm32는 기본적으로 sysclk이 존재하고 TIM는 이것을 Presclaer로 분주한 후 분주된 CK_CNT으로 INT를 발생 시킨다. 여기서 TIM_TimeBaseStructure.TIM_Period의 단위도 Hz다.


Freq와 Cycle 계산 방법


Cycle은 TIM_TimeBaseStructure.TIM_Prescaler로 분주된 값(CK_CNT)으로 TIM_TimeBaseStructure.TIM_Period를 나누어주면 된다. 의미는 CK_CNT이 TIM_TimeBaseStructure.TIM_Period를 수행하기 위해서 몇 초 걸리는가. 예를 들어서 CK_CNT는 50kHz 이고, TIM_TimeBaseStructure.TIM_Period는 1000Hz 일 때 한번 INT발 생하는데에 20ms 가 걸린다.


Freq는 TIM_TimeBaseStructure.TIM_Period으로 CK_CNT를 나누어주면 된다. 여기서 잠깐 TIM_TimeBaseStructure.TIM_Period만큼 clock 발생하면 flag가 발생한다. 따라서 TIM_TimeBaseStructure.TIM_Period로 CK_CNT를 나누는 의미는 CK_CNT동안에 몇번 flag가 발생하느냐로 볼 수 있다. 예를 들어서  CK_CNT는 50kHz이고, TIM_TimeBaseStructure.TIM_Period는 1000Hz 일 때 1초 동안 50kHz를 진동하는 동안 (50kHz/1000Hz) 번 flag가 발생한다.

'MCU > ARM' 카테고리의 다른 글

ADC independent DMA (2)  (0) 2016.08.14
ADC main feature(1)  (0) 2016.08.13
SPI 통신 (3)  (0) 2016.08.11
SPI 통신 (2)  (0) 2016.08.11
SPI 통신 (1)  (0) 2016.08.11
Posted by 나무길 :