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 |