MCU: PIC18F45K20

IDE: MPLAB X IDE v6.00

Compiler: XC8

 

안녕하세요.

MCC를 이용하여 제가 가지고 있는 PIC18F45K20의 GPIO를 제어하도록 해 보겠습니다.

 

보드의 정보는 아래 링크에서 확인 할 수 있습니다.

DM164130-4 - PICKIT 44-PIN DEMO BOARD (PIC18F45K20) | Microchip Technology

 

Dynamic Dev Tool Page | Microchip Technology

Part Number: Quantity: Price per Unit (in USD): Total Amt:

www.microchip.com

 

회로도는 아래와 같습니다.

RD0~ RD7핀에 LED가 연결되어 있는것을 확인했습니다.

이것을 제어하도록 해 보겠습니다.

 

 

File->New Project 메뉴를 선택하여 프로젝트를 생성합니다.

 

Microchip Embedded 카테고리에 Standalone Project 프로젝트를 선택하고 Next >

 

 

Device 를 PIC18F45K20으로 선택하고 Tool은 알맞은 것으로 선택하고 Next >

 

 

설치된 XC8 컴파일러를 선택하고 Next > 

 

 

프로젝트 명과 위치를 선택하고, Encoding을 UTF-8로 설정하고 Finish. 

 

 

그럼 위와 같이  main.c 파일도 없는 프로젝트가 생성됩니다.

 

 

MCC 아이콘을 눌러 아래 페이지가 나타나면 Select MCC Classic을 클릭합니다.

 

 

Finish를 눌러줍니다.

 

 

조금 기다리다 보면 아래와 같은 화면이 나타납니다.

 

 

시스템 클럭 설정을 위해 왼쪽 메뉴에서 System Module을 눌러줍니다.

제가 가지고 있는 보드는 크리스탈이 달려있지 않아 내부 오실레이터(INTOSC)를 사용하도록 설정하고,

PLL을 사용하여 16MHz Current System clock으로 설정하도록 하겠습니다.

 

 

Pin Module에 PORT D에 output에 해당하는 자물쇠를 클릭하여 설정합니다.

 

이제 Generate 버튼을 눌러 프로젝트를 생성합니다.

 

 

Project 탭을 누르면 아래 화면과 같이 파일이 생성된 것을 볼 수 있습니다.

 

이제 main.c를 열어 1초마다 PORTD가 토글되도록 프로그래밍 해줍니다.

 

#include "mcc_generated_files/mcc.h"

/*
                         Main application
 */
void main(void)
{
    // Initialize the device
    SYSTEM_Initialize();

    // If using interrupts in PIC18 High/Low Priority Mode you need to enable the Global High and Low Interrupts
    // If using interrupts in PIC Mid-Range Compatibility Mode you need to enable the Global and Peripheral Interrupts
    // Use the following macros to:

    // Enable the Global Interrupts
    //INTERRUPT_GlobalInterruptEnable();

    // Disable the Global Interrupts

    // Enable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptEnable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    while (1)
    {
        PORTD ^= 0xFF;    // PORTD 토글
        __delay_ms(1000); // 1초 딜레이
        
        // Add your application code
    }
    //INTERRUPT_GlobalInterruptDisable();
}
/**
 End of File
*/

 

 

작성이 끝났다면 프로그래머(PICKIT4)를 회로 P1에 연결하고,

아래 버튼을 눌러 컴파일 &  PIC18F45K20에 다운로드 해 줍니다.

 

 

성공적으로 다운로드 되었다면 아래와 같이 Programming/Verify complete 메세지가 나타납니다.

 

 

이제 보드 PORTD에 연결되어있는 LED가 1초마다 깜빡이는것을 확인할 수 있습니다.

반응형

HAL Driver 중에 GPIO에 대해서 소개하겠습니다.

 

 

stm32f1xx_hal_gpio.c

 

 

  • void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

      CubeMX로 생성한 코드는 아래와 같이 GPIOx 페리페럴을 초기화한다.

 

      GPIO Mode

          GPIO_MODE_INPUT: 입력모드

          GPIO_MODE_OUTPUT_PP: 출력 (Push Pull) 모드

          GPIO_MODE_OUTPUT_OD: 출력 (Open Drain) 모드

          GPIO_MODE_AF_PP: 대체 기능(Alternate Function), (Push Pull)모드

          GPIO_MODE_AF_OD: 대체 기능(Alternate Function), (Open Drain)모드

 

          GPIO_MODE_ANALOG: 아날로그 모드

 

          GPIO_MODE_IT_RISING: 외부 인터럽트(External Interrupt)모드, Rising Edge

          GPIO_MODE_IT_FALLING: 외부 인터럽트(External Interrupt)모드, Falling Edge

          GPIO_MODE_IT_RISING_FALLING: 외부 인터럽트(External Interrupt)모드, Rising & Falling Edge

          

          GPIO_MODE_EVT_RISING: 외부 이벤트(External Event)모드, Rising Edge

          GPIO_MODE_EVT_FALLING: 외부 이벤트(External Event)모드, Falling Edge

          GPIO_MODE_EVT_RISING_FALLING: 외부 이벤트(External Event)모드, Rising & Falling Edge

            * Event모드는 인터럽트 발생시키지 않고 저전력모드에서 Wake-up하는데 사용된다.

          

      GPIO Pull

          GPIO_NOPULL

          GPIO_PULLUP

          GPIO_PULLDOWN

 

      GPIO Speed

          GPIO_SPEED_FREQ_LOW

          GPIO_SPEED_FREQ_MEDIUM

          GPIO_SPEED_FREQ_HIGH

/* GPIO 초기화 */
void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIOD APB2 Clock ENABLE */
    __HAL_RCC_GPIOD_CLK_ENABLE();
    
    /* Configure GPIO pins : PD13 PDPin */
    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
    
    /* 외부 인터럽트(EXTI) 설정 */
    HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}

 

  • void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)

      GPIO 설정을 초기화 한다

 

  • void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

      GPIOx의 Pin의 상태를 설정한다.

      GPIO_PinState에는 GPIO_PIN_RESET(0) 과 GPIO_PIN_SET(1) 이 있다.     

/* HAL_GPIO_WritePin 예시 */
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); // GPIO OUTPUT LOW
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);   // GPIO OUTPUT HIGH

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, 0); // GPIO OUTPUT LOW
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, 1); // GPIO OUTPUT HIGH

 

  • GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

      GPIOx의 GPIO_Pin의 상태를 가져온다. 이때 GPIO Pin의 mode는 GPIO_MODE_INPUT 이어야 한다.

GPIO_PinState state;

state = HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_5); // GPIOE5 의 상태를 읽는다

 

  • void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

      GPIO의 상태를 반전(Toggle)시킨다.

HAL_GPIO_TogglePin(GPIOE, GPIO_Pin_5); // GPIOE5 핀의 출력 상태를 반전시킨다.

 

  • HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

      GPIO Pin의 설정을 고정시킨다.

반응형

+ Recent posts