WIZnet Developer Forum

SysTick을 1Mhz 이상으로(1Mhz , 2Mhz , 10Mhz , 12Mhz , 14Mhz ) 사용 하고 싶습니다

  1. SysTick 을 1Mhz 이상으로(1Mhz , 2Mhz , 10Mhz , 12Mhz , 14Mhz ) 사용 하고 싶습니다.

    • 현재 사용 중인 Click setting

    #define SYSCLK_EXTERN_OSC

    void SystemInit (void)
    {
    uint8_t M,N,OD;

     (*((volatile uint32_t *)(W7500x_TRIM_BGT))) = (*((volatile uint32_t *)(W7500x_INFO_BGT)));
     (*((volatile uint32_t *)(W7500x_TRIM_OSC))) = (*((volatile uint32_t *)(W7500x_INFO_OSC)));
    
     // Set PLL input frequency
    

    #ifdef SYSCLK_EXTERN_OSC
    CRG->PLL_IFSR = CRG_PLL_IFSR_OCLK;
    #else
    CRG->PLL_IFSR = CRG_PLL_IFSR_RCLK;
    #endif
    OD = (1 << (CRG->PLL_FCR & 0x01)) * (1 << ((CRG->PLL_FCR & 0x02) >> 1));
    N = (CRG->PLL_FCR >> 8 ) & 0x3F;
    M = (CRG->PLL_FCR >> 16) & 0x3F;

    #ifdef SYSCLK_EXTERN_OSC
    SystemFrequency = EXTERN_XTAL * M / N * 1 / OD;
    #else
    SystemFrequency = INTERN_XTAL * M / N * 1 / OD;
    #endif
    }

    • Main.c
      sysclock = GetSystemClock();
      if(SysTick_Config((sysclock/100000)))

    • 요청 : SysTick 을 다음과 같이 사용하려면 셋팅을 어떻게 바꿔야 하나요?
    ○ 위 결과 100Khz 입니다.
    § 1Mhz로 올리기 위해 if(SysTick_Config((sysclock/1000000))) 하면 동작을 안합니다.
    § 내부 클럭을 올려야하는대…
    ○ 사용 하고자 하는 사양은
    § 1Mhz , 2Mhz , 10Mhz , 12Mhz , 14Mhz
    § 위처럼 사용하기 위한 셋팅 값 부탁 드립니다.
    § 아니면 이미 나와 있는 질문이면 답변 링크 부탁 드립니다.

    감사합니다.

Systick을 1Mhz 이상으로 구동하는 것은 추천하지 않습니다.

Systick interrupt 구문 안에 어떤 코드가 들어가 있을지는 모르겠지만 어떤 인터럽트라도 1Mhz의 속도로 걸린다면 시스템이 올바르게 구동할 수 없습니다.

interrupt에서 빠져나올 수 없기 때문입니다. 어떠한 용도로 사용하시려는 지는 잘 모르겠으나 어떠한 interrupt라도 너무 빠르게 설정하시면

시스템이 멈춥니다.

감사합니다.

1Mhz 이상의 클럭을 만들어 주기 위해서 입니다… 중간에 그 속도로 컨트롤도 필요해서 SysTick 안에서 PORT를 토글해서 사용하려 했는대…

그럼 결국 PWM으로 클럭을 만들어 줘야하는군요… 1Mhz 이상을 사용하려면…(지금 W7500 PWM은 1Mhz이상 가능 한것이지요?)

그리고 추가로 PLL 셋팅을 해서 지금 8Mhz 를 48Mhz로 사용하고 싶습니다.

셋팅 좀 부탁 드립니다. 데이터 시트만 봐서는 잘 모르겠습니다.

그리고 내부 클럭을 48Mhz로 올리고 1Mhz 이상 Systick 을 사용 하면 시스템이 먹통이 되는건 잘… 이해가…

요점.

  1. W7500 PWM 최대 동작 속도는 얼마까지 인가요? (8Mhz 외부 클럭 사용)
    • 기존 라이브러리의 소스에서 타임 값만 바꿔서 테스트 해보면 되나요? 아니면 따로 셋팅을 해줘야 하나요?
  2. 8Mhz를 -> 48Mhz로 사용하고 싶습니다. 어떻게 셋팅하는지 샘플 좀 부탁 드립니다.

감사합니다.

저…혹시 PWM도 1Mhz 이상 사용하면… 시스템이 멈추나요… ㅠㅜ

system_W7500x.c 에 보시면 SystemFrequency = EXTERN_XTAL * M / N * 1 / OD; 라고 되있을 겁니다.
해당 부분의 계산법에 따라 SystemFrequency가 결정되는데 M 과 N은 데이터시트의 CRG register 중 PLL_FCR을 보시면 셋팅하실 수 있습니다.

1MHz 이상의 clock을 output으로 내보내고 싶으신것 같습니다. 그렇다면 PWM을 사용하시는게 더 좋을것 같네요.
PWM 최대 동작 속도는 Systemclock / 2 입니다.
이는 PWM으로 들어가는 source clock을 말하는 것이지 PWM out이 아닙니다.

앞서 말씀드린 Systick 역시 동작 source clock이 최대 24MHz clock이 들어간다는 것이지 interrupt가 1MHz의 속도로 발생하는 것은 아닙니다.
1MHz마다 interrupt가 뜰 수 있게 할 순 있지만 위에서도 설명드렸다시피 48MHz의 동작 주파수가 최대인 MCU에서는 1MHz마다 interrupt를 띄운다는건 좀…

reference manual의 PWM 관련 내용을 읽어보시면 PWM으로 들어오는 clock에 따라 prescaler값과 period 셋팅 그리고 limit 값만 원하시는 속도로 셋팅해서 보시면 1MHz의 clock source를 만드실 수 있을 겁니다.

PAD의 Driving Strength에 따라 토글링 속도를 보장하는 timing이 다릅니다. 이는 데이터시트의 PADCON 항목을 보시면 Driving Strength에 따른 rise/fall time, Delay가 나와 있습니다. 참고하시기 바랍니다.

보다보니 해당 페이지 오타가 있네요 Driving Strength의 값이 1이면 Low입니다. 0이면 High이구요

참고해서 사용 바랍니다.

PWM으로는 한 싸이클을 6us 로 만들어 사용 했으나… 동작이 원활하지 않습니다…왜그럴까요…

추가 질문입니다.

  1. 8Mhz 외부 클럭을 사용하며… Machine Code Cycling이 얼마인가요?

  2. GPIO 토글로 최대 얼마까지 클럭을 만들 수 있나요? (외부 8Mhz 사용하면서)

  3. PWM으로 생성된 Clock은 Rising Edge나 Falling Edge를 사용 할 수 없나요?? (샘플 소스 중 “PWMOutput” 을 참고하여 작성 하였습니다.)

답변 부탁 드립니다.

답변 좀 부탁 드립니다!!

답변드립니다.

  1. Machine Code Cycling 은 무엇을 의미하는지요?
  2. 코드로 GPIO 토글을 시켜 낼 수 있는 speed는 compiler마다 틀리겠지만 통상적으로 2Mhz 내외 입니다. 이 때 중간에 다른 코드가 삽입되면 속도는 현저하게 떨어질거라고 예상합니다.
  3. PWM으로 생성된 Clock은 Rising Edge나 Falling Edge를 사용 할 수 없나요?? -> 무슨 의미인지 알 수 없습니다.

내부 클럭을 48Mhz로 사용하시고 Systick을 1Mhz로 설정해도 내부 코드에 따라 시스템이 멈출수도 아닐수도 있습니다.
Systick을 1Mhz로 설정한다고 가정하면 1Mhz의 속도로 인터럽트에 걸리게 됩니다. 해당 인터럽트는 기존 코드를 스택에 쌓는 과정 -> 인터럽트 점프 -> 인터럽트 내부 코드 수행 -> 인터럽트 클리어 -> 기존 코드를 스택에서 내리는 과정을 거치게 됩니다. 계산상으로 이 코드가 48clock 안에 처리 못하면 무조건 시스템 에러입니다. 따라서 1Mhz의 systick으로 GPIO를 흔들어 clock을 발생시키는 것은 지극히 위험한 방식이라고 할 수 있습니다.

PWM은 Match register를 0, Limit register를 1로 설정시 최대 24Mhz까지 사용 가능하나 PWM pulse width의 정확도가 떨어집니다. 1Mhz 이하로 동작시키기를 권장합니다.

이상입니다.

  1. cpu에서 명령어 하나 처리하는 속도로 알고 있습니다.

  2. Systick 에서 토글이 아니라, 그냥 루틴에서 입니다.

void main()
{
:
:
while(1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_15);
GPIO_ResetBits(GPIOA, GPIO_Pin_15);
}
}
테스트 해보면 약 25us 정도 나옴니다. 음…제가 멀 잘 못한건지… 이해가 안갈 정도로 느려서 문의 드린 것입니다.
그래서 W7500의 “General-Purpose Input/Output (GPIOx) Timings” 정보를 유선으로도 문의 드렸습니다. 아무리 찾아도 데이터시트에 없더라고요…

  1. 자꾸 PWM을 사용하면 하강 에지, 상승 에지에 동작하는 IC를 구동 할 수 없다 주장을해서…확인 요청 드렸습니다. 구현된 한 클럭의 길이는 6us입니다. 물런 너무 빠르게 돌리면 파형이 톱이파처럼될쯤이면 안돌 수 있지만…

작업을 하고 있는 장비가 원악 오래된 오실로라… 혹시 가능하면 간단한 코드이니, 위 2,3 번 테스트와 결과 좀 부탁 드립니다.

감사합니다.

아래내용 확인해 주시기 바랍니다.

또한 저희가 W7500에서 사용한 GPIO IP의 DATASheet를 첨부합니다.

확인하시고 원하는 정보를 사용하시면 될 것 같습니다.
DDI0190.pdf (371 KB)

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.