어쩌다 피에조 부저가 있는데 써본적이 없어서 함 써봤다. PWM으로 소리를 내봤다.

배선

배선은 별로 어려울꺼 없이 피에조 부저의 ‘-‘를 GND에 연결하고, ‘+’는 PA5 Pin에 연결한다. PA5는 TIM2 PWM Channel1으로 사용한다. Piezzo Wire

STM32CubeMX

CubeMX로 그림과 같이 TIM2의 PWM을 설정하고 Code를 생성해준다. Piezzo Wire

Code

CubeMX에서 생성 된 코드의 main()함수에 아래 코드를 넣어준다. CubeMX에서 생성 된 코드 중 사용자 코드는 /* USER CODE BEGIN XXX */ 이런 식으로 위치가 정해져 있으니 해당 위치에 잘 넣어주면 된다.

  /* USER CODE BEGIN 2 */

  /* TIM2를 시작 */
  HAL_TIM_Base_Start(&htim2); 

  /* TIM2 PWM Channel 1 시작 */
  if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

  /* TIM2에 공급되는 Clock Speed */
  int PCLK1_Freq = HAL_RCC_GetPCLK2Freq();

  /* 소숫점을 사용하지 않기 위해 100을 곱한 값 사용 */
  enum notes {
    C4 = 26163, // 도(261.63Hz)
    D4 = 29366, // 래(293.66Hz)
    E4 = 32963, // 미(329.63Hz)
    F4 = 34923, // 파(349.23Hz)
    G4 = 39200, // 솔(392.00Hz)
    A4 = 44000, // 라(440.00Hz)
    B4 = 49388, // 시(493.88Hz)
    C5 = 52325  // 도(523.25Hz)
  };

  /* 학교종 
   * 솔 솔 라 라 솔 솔 미 솔 솔 미 미 래
   * 솔 솔 라 라 솔 솔 미 솔 미 래 미 도*/
  enum notes A[] = {G4,G4,A4,A4,G4,G4,E4,G4,G4,E4,E4,D4,
                    G4,G4,A4,A4,G4,G4,E4,G4,E4,D4,E4,C4};

  while (1) {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

    for (int i = 0 ; i < sizeof(A)/sizeof(enum notes) ; i++) {
      __HAL_TIM_SET_AUTORELOAD(&htim2, PCLK1_Freq / A[i] * 100);
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, PCLK1_Freq / A[i] * 100 / 2);
      HAL_Delay(500);

      /* 각 Note 소리 내고 10 Millisecond 끊어주기 */ 
      HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1) ;
      HAL_Delay(10);
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) ;
    }

    /* 음악 끝나면 5초 후 반복 */
    HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1) ;
    HAL_Delay(5000);
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) ;

  }
  /* USER CODE END 3 */