이번에는 TIM2 PWM Mode 4채널을 IRQ 방식으로 동작시켜봤습니다.
기존 기본 콜백함수를 사용 했습니다.
1. 소스
uint16_t pwm_1 = 0;
uint16_t pwm_2 = 100;
uint16_t pwm_3 = 0;
uint16_t pwm_4 = 50;
// Timer CollBack func
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim -> Instance == TIM7)
{
//1ms
__HAL_TIM_CLEAR_IT(&htim7, TIM_IT_UPDATE);
fnd_595_out(cnt);
// printf("DN Cnt = %4d\r\n", 9999-cnt);
// __NOP();
// GPIOC -> ODR = ~GPIOC -> ODR;
}
else if(htim -> Instance == TIM10)
{
if(cnt_flag == 1)
{
cnt_flag = 0;
lcd_gotoxy_str(9, 1, d_buf);
GPIOC -> ODR = ~my_map(cnt, 0, 9999, 0, 255);
}
}
else if(htim -> Instance == TIM5)
{
__HAL_TIM_CLEAR_IT(&htim5, TIM_IT_UPDATE);
tim5_irq_cnt++;
}
else if(htim -> Instance == TIM2)
{
__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
TIM2 -> CCR1 = (pwm_1 += 100);
TIM2 -> CCR2 = (pwm_2 += 200);
TIM2 -> CCR3 = (pwm_3 += 300);
TIM2 -> CCR4 = (pwm_4 += 400);
}
}
int main(void)
{
// 6. TIM2 ==>> PWM Ch4 PWM OUT
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
// Interrupt ON
HAL_TIM_Base_Start_IT(&htim2);
while(1)
{
}
}
2. 동작
3. CUBE MX 설정