'PIC32MZ_STUDY'에 해당되는 글 2건

  1. 2016.12.31 [PIC32MZ EVM] 타이머 인터럽트 테스트
  2. 2016.12.25 PIC32MZ 개발 환경 설정
[Microchip]/PIC32MZ2016. 12. 31. 12:17

[PIC32MZ EVM] 타이머 인터럽트 테스트

[PIC32MZ EVM] 타이머 인터럽트 테스트


PIC32MZ 시리즈의 타이머/카운터는 9개가 있고 MPLAB 코드 생성 툴을 이용하면 쉽게 사용 할 수 있다.

한가지 아쉬운점은 기본 16비트 타이머 이고 32비트 타이머를 사용하려면 16비트 타이머2개를 조합해서 사용해야 되는것 같다.

STM32의 경우 별도의 32비트 타이머가 존재해서 편리 했는데...



MPLAB Harmony Configurator  를 이용하여 타이머드라이버 생성 할 수 있고 각종 파라미터를 설정하면 쉽게 초기화 할 수 있다.



자동으로 생성된 코드를 보면 아래와 같이 PIC32MZ의 타이머 설정부분의 코드가 생성된다.

void SYS_Initialize ( void* data )

{

    /* Core Processor Initialization */

    SYS_CLK_Initialize( NULL );

    sysObj.sysDevcon = SYS_DEVCON_Initialize(SYS_DEVCON_INDEX_0, (SYS_MODULE_INIT*)&sysDevconInit);

    SYS_DEVCON_PerformanceConfig(SYS_CLK_SystemFrequencyGet());

    SYS_PORTS_Initialize();


    /* Initialize Drivers */


    sysObj.drvTmr0 = DRV_TMR_Initialize(DRV_TMR_INDEX_0, (SYS_MODULE_INIT *)&drvTmr0InitData);


    SYS_INT_VectorPrioritySet(INT_VECTOR_T1, INT_PRIORITY_LEVEL1);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_T1, INT_SUBPRIORITY_LEVEL0);

 

 

     sysObj.drvUsart0 = DRV_USART_Initialize(DRV_USART_INDEX_0, (SYS_MODULE_INIT *)&drvUsart0InitData);

    SYS_INT_VectorPrioritySet(INT_VECTOR_UART1_TX, INT_DISABLE_INTERRUPT);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_UART1_TX, INT_SUBPRIORITY_LEVEL0);

    SYS_INT_VectorPrioritySet(INT_VECTOR_UART1_RX, INT_PRIORITY_LEVEL1);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_UART1_RX, INT_SUBPRIORITY_LEVEL0);

    SYS_INT_VectorPrioritySet(INT_VECTOR_UART1_FAULT, INT_PRIORITY_LEVEL1);

    SYS_INT_VectorSubprioritySet(INT_VECTOR_UART1_FAULT, INT_SUBPRIORITY_LEVEL0);


    /* Initialize System Services */


    /*** Interrupt Service Initialization Code ***/

    SYS_INT_Initialize();

  

    /* Initialize Middleware */


    /* Enable Global Interrupts */

    SYS_INT_Enable();


    /* Initialize the Application */

    APP_Initialize();

}





PIC32MZ 타이머 기본 설정 이외 인터럽터 핸들러 생성 및  등록은 초기화 코드에서 해 주어야 한다.


SYS_MODULE_OBJ T0Handle ;


void APP_Initialize ( void )

{

    /* Place the App state machine in its initial state. */

    appData.state = APP_STATE_INIT;


    printf("PIC32MZ EVM Timer Test\r\n");


    

   T0Handle = DRV_TMR_Open( DRV_TMR_INDEX_0, DRV_IO_INTENT_EXCLUSIVE );

 

   // calculate the divider value and register the ISR

   uint32_t desiredFrequency = 1000 ; // 1 khertz

   uint32_t actualFrequency = DRV_TMR_CounterFrequencyGet(T0Handle) ;

   uint32_t divider = actualFrequency/desiredFrequency; // cacluate divider value

  

   DRV_TMR_AlarmRegister(T0Handle, divider, true, 0 , T0_ISRHandler);

 

   // Starting the Timer   

   DRV_TMR_Start(T0Handle);    

}





PIC32MZ  타이머 인터럽트 핸들러 함수


void T0_ISRHandler(uintptr_t context, uint32_t alarmCount)

{

   PLIB_PORTS_PinToggle(PORTS_ID_0, PORT_CHANNEL_H, 10 );

}






Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC32MZ2016. 12. 25. 01:20

PIC32MZ 개발 환경 설정

PIC32MZ 개발 환경 설정




PIC32MZ 개발을 위해서는  MCU펌웨어 개발 프레임워크인 MPLAB® Harmony 라는 툴이 필요하다.

이거 언제 또 공부하나?


그런데 막상 사용해 보니 상당히 간단하고 편리한것 같다.


우선 프로그램을 다운로드 하고 설치 해보자

MPLAB

http://www.microchip.com/mplab/mplab-ide-home


하모니 페키지

http://www.microchip.com/mplab/mplab-harmony




MPLABX 프로그램 실행하고 새로운 프로젝트롤 생성한다.

하모니 프로젝트를 선택하고 위자드로 클릭 몇번하면 쉽게 새로운 프로젝트 생성이 가능하다.






디바이스 선택

[PIC32MZ EVM] 보드는 PIC32MZ 시리즈 PIC32MZ2048EFM144 이므로 이 장치를 선택한다.





생성이 되면 기본으로 MPLAB Harmony Configurator 가 실행되고 다양한 페리 설정을 간편하게 할수 있다.




PIC32MZ 구동에 기본이 되는 클럭 설정을 해 보면 아래 그림과 같이 클럭 소스나, 속도 및 다양한 설정을 쉽게 설정 할 수 있다.





이렇게 해서 코드를 생성하면 자동으로 아래와 같은 파일들을 생성해 준다.




생성된 파일중 app.c 파일을 수정하면 원하는 기능을 수행 할 수 있다.

초기화 함수

void APP_Initialize ( void )

{

    /* Place the App state machine in its initial state. */

    appData.state = APP_STATE_INIT;


    /* TODO: Initialize your application's state machine and other

     * parameters.

    */

}





그리고 APP_Tasks() 함수에서 사용자 코드를 작성해 주면 된다. RTOS 같은 구조 인데 실제는 RTOS는 아니고 추후 RTOS를 사용 하더라고 동일한 구조를 사용하기 위해 이런 형태의 코드가 생성되는것 같다.

코드의 호환성은 좋아지겠지만 성능 측면은 양보를 해야 할것 같다. 물론 PIC32MZ 속도가 200Mhz로 구동되기 때문에 큰 차이는 없어 보인다.


간단한 예제로 [PIC32MZ EVM] 보드의 LED를 깜박이는 예제를 작성해 보면 아래와 같다.

void APP_Tasks ( void )

{


    /* Check the application's current state. */

    switch ( appData.state )

    {

        /* Application's initial state. */

        case APP_STATE_INIT:

        {

            bool appInitialized = true;

       

            if (appInitialized)

            {

            

                appData.state = APP_STATE_SERVICE_TASKS;

            }

            break;

        }


        case APP_STATE_SERVICE_TASKS:

        {

            //사용자 코드 작성 부분

            PLIB_PORTS_PinToggle(PORTS_ID_0, PORT_CHANNEL_H, 10 );

            Delay(100);

            break;

        }


        /* TODO: implement your application state machine.*/

        


        /* The default state should never be executed. */

        default:

        {

            /* TODO: Handle error in application's state machine. */

            break;

        }

    }

}




참고로 MPLAB Harmony Configurator에서 GPIO설정을 해 주면 초기화 코드를 생성해 준다.





MPLAB Harmony Configurator 는 Tools 메뉴에서 실행 할 수 있다. (처음에 이창이 사라져서 찾기 힘들었다.)




sys_ports_static.c 파일을 보면 GPIO관련 초기화된 코드가 생성된것을 확인 할 수 있다.


void SYS_PORTS_Initialize(void)

{

    /* PORT H Initialization */

    PLIB_PORTS_OpenDrainEnable(PORTS_ID_0, PORT_CHANNEL_H, SYS_PORT_H_ODC);

    PLIB_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_H,  SYS_PORT_H_LAT);

    PLIB_PORTS_DirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_H,  SYS_PORT_H_TRIS ^ 0xFFFF);

    PLIB_PORTS_ChangeNoticePerPortTurnOn(PORTS_ID_0, PORT_CHANNEL_H);

    PLIB_PORTS_ChannelModeSelect(PORTS_ID_0, PORT_CHANNEL_H, SYS_PORT_H_ANSEL ^ 0xFFFF, PORTS_PIN_MODE_DIGITAL);

    PLIB_PORTS_ChannelChangeNoticeEnable(PORTS_ID_0, PORT_CHANNEL_H, SYS_PORT_H_CNEN);

    PLIB_PORTS_ChannelChangeNoticePullUpEnable(PORTS_ID_0, PORT_CHANNEL_H, SYS_PORT_H_CNPU);

    PLIB_PORTS_ChannelChangeNoticePullDownEnable(PORTS_ID_0, PORT_CHANNEL_H, SYS_PORT_H_CNPD);






마이크로 칩사의 새로운 IDE툴인 MPLABX와 하모니 툴을 이용하여 PIC32MZ 개발 환경을 테슽 해 보았는데...

결론적으로는 상당히 잘 만들어진 툴 같고 편리한것 같다.

특히 USB나 이더넷, TFT LCD같은 복잡한 페리를 사용하는데 있어서 자동 코드 생성툴이 상당히 편리 한것 같은데 마이크로 칩에서 제공하는 기본 구조를 지켜야 한다는 제약이 어떤 문제가 있을지 좀더 테스트 해 보아야 할것 같다.


쉽고 빠르게 기본 구조를 생성 할 수 있다는 점은 상당히 마음에 든다.





Posted by nexp

댓글을 달아 주세요