[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

댓글을 달아 주세요

[ST_MICRO]/STM32F0x2016. 5. 30. 03:10

STM32F030 UART2 테스트 오동작

STM32F030 UART2 테스트 오동작



STM32F030 을 이용하여 USART2를 테스트 중에 이상한 점을 발견 했다.

USART1 을 사용 할 때도 문제가 전혀 없었고  STM32F103 , STM32F 테스트 할때도 문제가 없었는데... 잘 사용하던 코드인데 동작을 하지 않는다.


컴파일러 문제가 인지 스텍 크기 문제 인지?


아무튼 USART_Cmd() 함수를 초기화 설정 함수내에서 호출 하면 문제가 없는데... 다른 함수에서 호출 하면 문제가 되고 있다.



void U1_SetBaud(unsigned char baud)

{

         :


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);


GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

// USART1 Tx: PA9; Rx: PA10.

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

    

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Init(GPIOA, &GPIO_InitStructure);    


    

USART_InitStructure.USART_BaudRate = baud_rate;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_Init(USART2, &USART_InitStructure);  


        USART_Cmd(USART2,ENABLE);  

}



기존 코드에서 USART초기화 부분을 수정하니 잘 동작한다.

void U1_Init(unsigned char baud)

{

U1_SetBaud(baud);

//USART_Cmd(USART2, ENABLE);

}




Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F0x2015. 9. 6. 02:47

[STM32F030-S EVM] 보드 제작 - STM32F030F4P6TR 테스트

[STM32F030-S EVM] 보드 제작 - STM32F030F4P6TR 테스트




ST의 Cortex-M0 코어중 가장 저렴한 STM32F030F4P6TR 를 테스트 할수 있는 소형 테스트 보드를  s-Type 형태로 제작 했다.

0.5$ 정도에 구매 할수 있으므로 저렴하면서 어느정도 성능이 필요한 프로젝트에 적용하면 좋을것 같다. 특히 기존 STM32 코드를 약간의 수정으로 작성 가능하다. (ST에서 프로모션 하는 가격은 32센트 이다. 32센트 하는 32bit MCU로 선전하고 있다.)


Architecture : ARM Cortex-M0

CPU Speed : 48MHz

Program Memory Size : 16KB

RAM Memory Size : 4KB

No. of Pins : 20

MCU Case Style : TSSOP

No. of I/O's : 15

Embedded Interface Type : I2C, SPI, USART

Supply Voltage Min : 2.4V

Supply Voltage Max : 3.6V

Packaging : Cut Tape

MSL : MSL 3 -168 hours





보드는 기존 핀맵을 유지하면서 가능한 간단하게 제작 했다.





S-Type EVM 형태의 핀맵으로 기존 확장 테스트 보드에서 쉽게 테스트 가능하다.






STM32F030-S EVM 핀맵 회로도







S-Type EVM 의 다앙한 확장 보드에 연결하여 테스트 가능하다. (WiFi 테스트 모듈 연결하여 테스트 중)














Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F0x2015. 5. 24. 00:38

[STM32F050 EVM] - STM32F050, STM32F030 보드 제작

[STM32F050 EVM] - STM32F050, STM32F030 보드 제작



Cortex-M0 코어의 소형 패키지 STM32F050K 칩이 저렴하게 판매해서 테스트 보드겸 만들어 보았다.

소형 패키지에 맞는 s-Type EVM형태로 보드를 제작해 여러 확장 보드애서다양한 테스트가 가능하다.

소형이고 저렴한 가격이라 여러 어플리케이션에 적용하면 좋을것 같다. 비슷한 가격대의 NXP사의 LPC1112 와 비교해 볼만 하다.


- Coretex-M0+

- 16k Flash/4k Ram

- 48Mhz

- 27 IO





s-Type EVM형태의 확장 테스트 보드에 연결





Posted by nexp

댓글을 달아 주세요