'STM32F0'에 해당되는 글 2건

  1. 2017.06.03 STM32 CubeMX - PWM HAL Code 테스트
  2. 2017.06.01 STM32F0 성능 테스트 - STM32CubeMX HAL Code
[ST_MICRO]/STM32F0x2017. 6. 3. 03:01

STM32 CubeMX - PWM HAL Code 테스트

STM32 CubeMX - PWM HAL Code 테스트






STM32F0의 TIMx 클럭은 PCLK가 소스가 된다. 쵀대 48Mhz로 설정 가능













STM32CubeMX 를 이용하여 TIM1, TIM3 설정탭에서 PWM을 설정한다.






파라 미터 설정은 적정한 값으로 설정한다.


10khz 주파수로 PWM 출력을 하려면 어떻게 설정 해야 할까?
10Khz는 100us 이므로 ARR 레지스터에 100us가 되는 값을 설정하면 된다.

먼저 48Mhz를 48로 나누어 1Mhz -> 1us로 되도록 하고 ARR값에 100을 넣으면 100us 가 된다. (주의 사항은 0부터 시작하므로 1을 빼준 값을 설정해야 한다.)







  //프리스케이일
  TIM1->PSC = 48-1;

  //주파수 편경
  freq = 100;// 100us
  TIM1->ARR = freq-1;

  //펄스폭 가변
  TIM1->CCR1 = freq/2-1;





이렇게 설정하고 구동 시켜보면 10khz 주파수로 PWM 출력 되는것을 확인 할 수 있다.





그럼 STM32F0에서 최대 PWM 주파수는 얼마 까지 가능할까?

48Mhz -> 0.20833333ns 이므로 100단계 PWM을 생각 한다면 480Khz 정도 될것 같다.



1Mhz로 PWM출력을 내려고 하면 50단계도  되지 않는 수준이다.

8비트 해상도 256단계 정도로 설정한다면 최대 187.5Khz정도 이다.




STM32 PWM출력 Start

//PWM CH1 Start

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);




STM32 펄스폭 및 주파수 설정

  //펄스폭 가변

  TIM1->CCR1 = 50-1;



  //주파수 변경

  TIM1->ARR = 100-1;





STM32F0 PWM 테스트 코드

int main(void)

{


  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration----------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* Configure the system clock */

  SystemClock_Config();


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  MX_TIM1_Init();


  /* USER CODE BEGIN 2 */


  /* USER CODE END 2 */


  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);


  //펄스폭 가변

  TIM1->CCR1 = 50-1;


  //주파수 변경

  TIM1->ARR = 100-1;


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

  /* USER CODE END WHILE */


  /* USER CODE BEGIN 3 */


  }

  /* USER CODE END 3 */


}





Posted by nexp
TAG PWM, STM32F0

댓글을 달아 주세요

[ST_MICRO]/STM32F0x2017. 6. 1. 03:44

STM32F0 성능 테스트 - STM32CubeMX HAL Code


STM32F0 성능 테스트 - STM32CubeMX HAL Code




STM32F0는 Cortex-M0코어 1$이하의 저렴한 MCU로 가격에 민감한 제품에 사용하기 좋은 제품이다.

GPIO On/Off 주기를 측정해 MCU 성능 체크 해 보고 있는데 [STM32F0-SS EVM] 보드를 이용해서 테스트 해 보았다.


[참고]STM32 MCU 성능 측정 테스트



우선 최대 클럭 48Mh로 설정하고 STM32CubeMX 기본 초기화 코드 생성하고 PB1 을 토글했다. 


static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

  /*Configure GPIO pin : PB1 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}




포트 토글 함수 수행 해 보면 476ns(1Mhz) 정도 측정된다. HAL_Code를 사용하면 좀 느린것 같다.

  while (1)
  {
         HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
  }






함수를 사용하지 않고 레지스터를 접근해서 포트 토글 해 보면 186ns(2.6Mhz) 정도 측정이 된다.

  while (1)
  {
         GPIOB->ODR ^= GPIO_PIN_1;
  }






비트 제어 명령으로 제어 해 보면 40ns(6Mhz) 로 측정된다.
  while (1)
  {
         //HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
         GPIOB->BSRR = GPIO_PIN_1;
         GPIOB->BRR = GPIO_PIN_1;
  }







좀더 보기 편하게 하기위해 Delay를 주었다.

  while (1)
  {
         //HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
         GPIOB->BSRR = GPIO_PIN_1;
         GPIOB->BRR = GPIO_PIN_1;
         HAL_Delay(1);
  }



그런데 속도가 40ns에서 60ns 로 느려졌다.

왜 그렇지?
어셈 코드를 확인 해 보니 HAL_Delay() 가 두번 호출 되는듯 한데...
개발환경의 설정 문제인가?

      GPIOB->BSRR = GPIO_PIN_1;
80011f4:    2402          movs    r4, #2
80011f6:    4d04          ldr    r5, [pc, #16]    ; (8001208 <main+0xb0>)
80011f8:    61ac          str    r4, [r5, #24]
      HAL_Delay(1);
80011fa:    2001          movs    r0, #1
      GPIOB->BRR = GPIO_PIN_1;
80011fc:    62ac          str    r4, [r5, #40]    ; 0x28
      HAL_Delay(1);
80011fe:    f7ff f869     bl    80002d4 <HAL_Delay>

8001202:    e7f9          b.n    80011f8 <main+0xa0>





HAL_Delay를 위쪽에 넣으니 어셈코드도 정상적으로 나오고 속도도 40ns로 측정이 된다.

  while (1)
  {
         //HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
         HAL_Delay(1);
         GPIOB->BSRR = GPIO_PIN_1;
         GPIOB->BRR = GPIO_PIN_1;
  }


      HAL_Delay(1);
80011f8:    2001          movs    r0, #1
80011fa:    f7ff f86b     bl    80002d4 <HAL_Delay>
      GPIOB->BSRR = GPIO_PIN_1;
80011fe:    61ac          str    r4, [r5, #24]
      GPIOB->BRR = GPIO_PIN_1;
8001200:    62ac          str    r4, [r5, #40]    ; 0x28

8001202:    e7f9          b.n    80011f8 <main+0xa0>






Posted by nexp

댓글을 달아 주세요