여기서는 STM32CubeMX 5.6.1 버전을 기준으로 할 것이다.
(어짜피 버전이 달라도 UI 또는 편의성 정도의 차이일 것이기에 크게 문제될 것은 없을 것 같다.)
MCU는 STM32103C8Tx(LQFP 48) 기준으로 작업할 것이다.
이것 또한 MCU가 다르다고 크게 다를 것은 없다.
여기서 MCU의 10번 핀을 PWM 핀으로 사용해볼 것이다.
데이타시트에 보면 확인할 수 있듯이 LQFP48에 대한 10번은 TIM2_CH1 기능을 사용할 수 있도록 되어있다.
타이머 채널들은 모두 PWM이 사용 가능하다고 보면 된다.
이제 STM32CubeMX를 실행하여 MCU의 기본적인 세팅을 해준다.(크리스탈, 디버거 설정 등)
나의 경우 8MHZ 크리스탈이 달려있고 ST-LINK를 사용할 것이기에 RCC_OSC 설정을 해주었고,
PA13, PA14쪽의 SWCLK와 SWDIO 설정도 같이 해주었다.
이제 10번 핀(PA0)을 PWM 핀으로 설정해보도록 하겠다 해당 핀을 클릭하면 아래와 같은 메뉴가 뜬다.
여기서 TIM2_CH1을 클릭한다.
이와 같이 노란색으로 바뀌었으며 이 상태는 핀을 사용하겠다고는 했지만 디테일한 세팅이 되어있지 않은 것이다.
위와 같이 TIM2에서 Channel1을 선택한 후 PWM Generation CH1을 선택해준다.
이와 같이 설정이 완료된 상태로 변경되었다.
이제 가장 중요한 설정을 할 차례다.
원하는 PWM 주파수를 만들기 위해 Prescaler와 주기 값 등을 지정해주어야 한다.
아래 파라미터 설정을 보고 설명하도록 하겠다.
가장 중요한 세가지 값이 있다.
Prescaler와 Counter Period로 PWM 주기를 지정하고 Pulse 값으로 Duty를 지정할 수 있다.
먼저 주기를 설정하기 위해서는 나의 타이머가 얼마의 클럭으로 돌아가는가를 알아야 한다.
STM32CubeMX의 Clock Configuration 탭을 확인하면 다음과 같이 클럭을 확인할 수 있다.
위와 같이 APB1 Timer clocks과 APB2 timer clocks를 확인하면 된다.
자신이 어떤 타이머를 사용할지에 따라 위, 아래의 클럭 중 어떤 것을 사용하는지가 결정된다.
이 또한 아래의 데이타시트 Clock tree에서 확인할 수 있다.
이는 MCU마다 차이가 있을 수 있으므로 반드시 Datasheet를 확인해야 한다.
TIM1은 APB2를 쓰고 TIM2,3,4는 APB1을 쓴다.
나는 여기서 TIM2_CH1을 쓸 것이니 APB1 클럭만 신경쓰면 된다.
200hz의 50% Duty의 PWM 파형을 만들어보도록 하겠다.
Prescaler = 799
Counter Period = 49
PWM Pulse = 99
이렇게 지정하였다.
여기서 각 값들이 800, 50, 100도 아니고 1씩 떨어져있는 것을 볼 수 있는데,
이것은 각 값들이 0부터 시작하므로 실제 적용할 값에서 -1을 해주어야 한다.
이제 위 값들이 어떻게 계산되는지 알아보도록 하겠다.
APB Clock 이 8Mhz였으므로, 먼저 해당 클럭이 프리스케일링된다.
8,000,000 / 800 (Prescaler) = 10,000 Hz(10Khz)
여기서 Counter Period에 의해 200Hz로 조정된다.
10,000 Hz / 50 (Counter Priod) = 200Hz
이제 200Hz 주기인 PWM의 Duty를 50% 로 지정한다.
200 / 100 (Pulse) = 2 (50% Duty)
CubeMX 에서의 모든 설정은 마쳤다고 볼 수 있다.
여기서 모두 값을 지정해주었지만, 얼마든지 코드 상에서 값을 수정할 수도 있다.
이제 우측 상단의 GENERATE CODE를 눌러서 코드를 생성하고 해당 코드를 불러오도록 한다.
PWM 파형을 동작시키는 코드를 작성해보겠다.
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); 한줄만 추가해주면 되므로 매우 간단하다.
코드를 보면 유추할 수 있듯이 TIM2의 CH1의 PWM을 동작하도록 하는 코드이다.
이제 컴파일 후에 실행하여 결과를 확인해보면 정상적으로 PWM 파형이 발생하고 있을 것이다.
(참고로 Unknown Target 과 같은 컴파일 오류가 발생한다면 프로젝트 옵션에서 Target MCU 설정을 해주어야 한다.)
'프로그래밍 > 임베디드' 카테고리의 다른 글
IAR STM32- ST-Link, No MCU device found (다운로드 실수로 인한 문제 복구) (2) | 2019.07.01 |
---|---|
TW2836을 GPIO I2C로 통신하기 (4) | 2015.04.25 |