TIM2, TIM10번을 이용해 PC5, PC12의 LED를 Toggle하는 동작을 만드려고한다.
TIM10은 APB2에 연결되있고, TIM2는 APB1에 연결되있다.
TIM2와 TIM10을 activated해주고
timer는 주파수가 분주되고 분주된 주파수로 카운트되면서 카운트가 완료되면 TIM interrupt 이벤트가 진행된다. TIM10의 Prescaler와 Counter Period는 16bit로 최대가 제한되있다. 그리고 -1의 의미는 만약 5를 count한다고 할때 1,2,3,4까지 세고 5는 0으로 돌아가 다시 셈을 시작하기 때문이다.
NVIC setting에서 global interrupt도 enable한다.
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim10;
void User_Task1(void){
HAL_TIM_Base_Start_IT(&htim10); // timer10을 interrupt감지 시작
HAL_TIM_Base_Start_IT(&htim2); // timer2를 interrupt감지 시작
while(1){
HAL_Delay(100);
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ // 인터럽트 발동
if (htim->Instance == TIM10) {
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
if (htim->Instance == TIM2) {
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_12);
}
}
1초에 한번 PA5가 toggle하고, 0.1초에 한번 PC12가 toggle한다.
PWM(Pulse Width Modulation)은 디지털 신호를 아날로그 신호와 비슷하게 바꿔주는 방법이다. PWM주파수와 Duty비를 조절하며 LED 또는 모터를 제어할 수 있다.
Clock Source를 Internal Clock, Channel1을 PWM Generation CH1으로 설정한다.
PWM Generation Channel설정에서 Pulse는 카운터의 값이 Pulse의 값과 같아질때까지 HIGH를 출력한다. Pulse는 타이머가 Period중에 몇번의 클럭동안 HIGH를 유지할 지 결정하는 값이다. 따라서 (Pulse / Period) X 100 = DutyCycle(%)이 결정된다.
#include "user.h"
extern TIM_HandleTypeDef htim2;
unsigned char kk = 0;
void User_Task1(void){
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // PWM Mode TIM 시작
while(1){
for (kk = 0; kk < 99; ++kk) { // LED 밝아짐
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, kk);
HAL_Delay(10);
}
for (kk = 99; kk > 0; --kk) { // LED 어두워짐
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, kk);
HAL_Delay(10);
}
}
}
🤔... 이게 머누..? 먹는 건가요? 응@애?