stm32f103c8에는3개의 범용타이머와 1개의 고급타이머가 있어, 총 4개의 타이머를 사용할 수 있습니다.
각각의 기능은 다음과 같습니다.
1. 범용 타이머 (General purpose Timer) 3개 - TIM2, TIM3, TIM4
1개의 16비트 카운터를 가짐
16비트 캡쳐/비교 기능
6개의 독립적인 IRQ/DMA 요청 신호를 발생
엔코더 및 홀 센서 인터페이스 가능
Trigger/Clock 제어기
16bit 프리스케일러
16bit up/Down 카운터
오토리로드 레지스터
캡쳐/컴패어
입력4개
출력4개
up counting 모드
Down counting 모드
업/다운 카운팅
입력 캡쳐 모드
출력 비교 모드
PWM 모드
2. 고급 제어 타이머 (Advanced-Control Timer) 1개 - TIM1
APB2 bus 연결
72MHz 외부클럭
범용 타이머 일반기능 + 모터 제어 기능
8개의 독립적인 IRQ/DMA 요청 신호 발생
이번 예제에서는 2번 타이머를 이용하여, 타이머 인터럽트를 발생시키고 Timer 2의 CH1 을 열어 compare match가 발생함에 따른 파형을 출력시키는 것이 목표입니다.
<CUBEMX>

channel1을 열어보면 몇가지 mode가 나온다.
-disable > TCNT값이 오버플로에 의해 0이 될때 인터럽트가 걸림
-input capture > 외부입력신호의 주기 측정을 위해 사용
-output compare > TCNT값이 특정한 레지스터의 값(CCRx)과 일치할때 인터럽트가 걸림
-pwm
-forced output

클럭(64000000)을 분주비(prescaler)인 64000으로 나누기 때문에1000hz의 클럭을 타이머가 입력받게 됩니다. 즉 0.001초마다 클럭이 발생하게 됩니다.
해당 클럭을 100개 받을때마다 인터럽트가 발생하므로 0.1초마다 인터럽트가 발생하게 됩니다.


타이머2의 interrupter 를 enable해줍니다




<truestudio>
1. main.c
타이머2를 시작합니다.
/* USER CODE BEGIN 2 */
HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_1);//타이머를 시작하고, ch1을 enable한다.
//HAL_TIM_Base_Start_IT(&htim2) ;
/* USER CODE END 2 */
2. "stm32f1xx_it.h"
타이머2의 ISR코드입니다,
toggle을 위한 코드를 넣어두었습니다,
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
HAL_GPIO_TogglePin(internal_led_GPIO_Port, internal_led_Pin) ;//설정한 GPIO핀을 TOGGLE시킴
/* USER CODE END TIM2_IRQn 1 */
}
추가로, 타이머코드에 부가적으로 CDC 통신 코드를 생성해 준 후 ISR내부에 cnt ++를 해줍니다.
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
uint8_t buffer[256];
extern int cnt;
sprintf(buffer,"%d\r\n",cnt);
CDC_Transmit_FS((uint8_t*)buffer, strlen((const char*)buffer));
}
while문을 다음과 같이 수정하면, 타이머의 동작을 시리얼통신을 통해 확인할 수도 있습니다.
잘은 모르지만, CDC통신은 문자열을 전송하기 때문에 ADC값등을 PC를 통해 확인하고 싶은 경우에는 정수형을 문자열로 바꿔주는 작업이 필요한데, 여기에 sprintf함수를 사용하였습니다.
'Programming > Embedded' 카테고리의 다른 글
[STM32F103C8] PWM-주파수, Duty 변화 (0) | 2022.02.19 |
---|---|
[STM32F103C8] Basic PWM (0) | 2022.02.19 |
[STM32F103C8] USB Serial 통신(CDC 통신) (0) | 2022.02.19 |
[STM32F103C8] Basic GPIO(led blinking) (0) | 2022.02.19 |
[stm32f103c8] 학습 (0) | 2022.02.19 |