[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 );

}






저작자 표시 비영리 변경 금지
신고

[PIC32MZ EVM] UART 테스트

[Microchip]/PIC32MZ | 2016.12.25 01:21
Posted by nexp

[PIC32MZ EVM] UART 테스트




PIC32MZ에서 UART를 사용하려면 MPLAB Harmony Configurator 를 실행해서 UART를 활성화 하고 설정해 주면 쉽게 사용가능하다.






[PIC32MZ EVM] 보드의 UART는 RD14->TXD, RD15-RXD에 할당되어 있다.

핀 다이어그램 에서 원하는 핀을 클릭해서 설정 할 수 있다.



그러면 아래와 같은 코드들을 자동으로 생성해 준다.

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.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();

}




void SYS_PORTS_Initialize(void)

{

    /* PORT D Initialization */

    PLIB_PORTS_OpenDrainEnable(PORTS_ID_0, PORT_CHANNEL_D, SYS_PORT_D_ODC);

    PLIB_PORTS_Write( PORTS_ID_0, PORT_CHANNEL_D,  SYS_PORT_D_LAT);

    PLIB_PORTS_DirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_D,  SYS_PORT_D_TRIS ^ 0xFFFF);

    PLIB_PORTS_ChangeNoticePerPortTurnOn(PORTS_ID_0, PORT_CHANNEL_D);

    PLIB_PORTS_ChannelModeSelect(PORTS_ID_0, PORT_CHANNEL_D, SYS_PORT_D_ANSEL ^ 0xFFFF, PORTS_PIN_MODE_DIGITAL);

    PLIB_PORTS_ChannelChangeNoticeEnable(PORTS_ID_0, PORT_CHANNEL_D, SYS_PORT_D_CNEN);

    PLIB_PORTS_ChannelChangeNoticePullUpEnable(PORTS_ID_0, PORT_CHANNEL_D, SYS_PORT_D_CNPU);

    PLIB_PORTS_ChannelChangeNoticePullDownEnable(PORTS_ID_0, PORT_CHANNEL_D, SYS_PORT_D_CNPD);

    

    /* 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);



    /* PPS Input Remapping */

    PLIB_PORTS_RemapInput(PORTS_ID_0, INPUT_FUNC_U1RX, INPUT_PIN_RPD14 );


    /* PPS Output Remapping */

    PLIB_PORTS_RemapOutput(PORTS_ID_0, OUTPUT_FUNC_U1TX, OUTPUT_PIN_RPD15 );

}






PIC32MZ UART 송수신 함수


void U0_PutByte (char chr)

{

   PLIB_USART_TransmitterByteSend (DRV_USART_INDEX_0, chr); 

   //U4TXREG = chr;


   while (! PLIB_USART_TransmitterIsEmpty (DRV_USART_INDEX_0));

  //while (! U4STAbits.TRMT); 

}



unsigned char U0_GetByte (char chr)

{

    while(!PLIB_USART_ReceiverDataIsAvailable(DRV_USART_INDEX_0));

    //while(U1STAbits.URXDA == 0);

    

    return PLIB_USART_ReceiverByteReceive(DRV_USART_INDEX_0);

}







XC32 컴파일러에서 printf 함수를 사용하고 싶다면 _mon_putc() 함수를 재정의 해 주면 사용할 수 있다.


void _mon_putc(char c)

{

     U0_PutByte(c);






저작자 표시 비영리 변경 금지
신고
TAG PIC32MZ, UART

PIC32MZ 개발 환경 설정

[Microchip]/PIC32MZ | 2016.12.25 01:20
Posted by nexp

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같은 복잡한 페리를 사용하는데 있어서 자동 코드 생성툴이 상당히 편리 한것 같은데 마이크로 칩에서 제공하는 기본 구조를 지켜야 한다는 제약이 어떤 문제가 있을지 좀더 테스트 해 보아야 할것 같다.


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





저작자 표시 비영리 변경 금지
신고

[PIC32MZ EVM] 보드 제작 - PIC32MZ2048EFM14



마이크로칩사의 PIC32MZ 시리즈 테스트 보드를 제작 했다. 200 MHz/330 DMIPS, microAptiv core 32bit MCU로 PIC시리즈 중 최고 사양의 MCU이다.


[L-Type EVM] 형태로 표준화 된 핀맵으로 제작 하여 여러 확장 보드에서 쉽게 테스트 가능하도록 했다.



L-Type 확장 테스트 보드










[PIC32MZ EVM] 핀맵 회로도











저작자 표시 비영리 변경 금지
신고

PIC32MZ 시리즈 검토

[Microchip]/PIC32MZ | 2016.12.22 23:02
Posted by nexp

마이크로 칩사에서 32 비트 MCU PIC32MZ 시리즈가 출시 되었다.

PIC32MZ 임베디드 연결 기능(EC) 제품군은 330DMIPS와 3.28 CoreMarks/MHz 속도를 지원하고, 최신 애플리케이션 대응을 위해 듀얼 패널, 최대 2MB의 라이브 업데이트 플래시, 512 KB의 대형 RAM을 지원한다.


차량용 인증등급인 AEC-Q100을 지원하는 PIC32MZ EF 시리즈도 동일하게 사용할수 있어서 차량용 제품 개발의  인증문제를 해결 할 수도 있다.

PIC32MZ EF 제품군은 최대 250MHz의 우수한 코어 성능, 부동소수점 유닛(FPU), 다양한 주변장치와 함께 CAN(Controller Area Network) 등의 뛰어난 연결 옵션을 제공한다. 이 확장 온도 지원 제품은 고온에서도 신뢰성 높은 성능과 강건성을 필요로 하는 다양한 주요 자동차 및 산업용 애플리케이션에 적합하다.



PIC32MZ 제품군은 마이크로칩의 MPLAB® Harmony 통합 소프트웨어 프레임워크, MPLAB X 통합 개발 환경(IDE), PIC32용 MPLAB XC32 컴파일러, MPLAB ICD 3 인-서킷 디버거, MPLAB Real ICE™ 인-서킷 에뮬레이션 시스템을 지원한다. 


주요 스펙을 보면 아래와 같다.


200 MHz/330 DMIPS, microAptiv core

Program Memory Size (KB) 2048

RAM (KB) 512

Auxiliary Flash (KB) 160

DSP-enhanced core:

Four 64-bit accumulators

Single-cycle MAC, saturating and fractional math

Dual Panel Flash for live update support

10-bit, 500 KSPS, 48-channel ADC module

CAN, UART, I2C, PMP, EBI, SQI & Analog Comparators

10/100 Mbps Ethernet MAC with MII and RMII interface

Temperature Range: - 40°C to 85°C; - 40°C to 125°C

50 MHz External Bus Interface (EBI)

50 MHz Serial Quad Interface (SQI)

Six UART modules (25 Mbps): Supports LIN 1.2 and IrDA protocols

Six 4-wire SPI modules (50 Mbps)

Five I2C modules (up to 1 Mbaud) with SMBus support

Nine 16-bit Timers/Counters (four 16-bit pairs combine to create four 32-bit timers)

Nine Capture inputs and Nine Compare/PWM outputs




ST사의 STM32F7 시리즈와 비교해 보면 좋을것 같다.

저작자 표시 비영리 변경 금지
신고
TAG PIC32MZ

블로그 이미지

nexp

카테고리

분류 전체보기 (1550)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (128)
[FreeScale] (31)
[MSP430] (139)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (210)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (127)
[SENSOR] (41)
[DATA] (21)
[FPGA] (29)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)

티스토리 툴바