CAN/CAN Open

CANOpen 노드 구현 (STM32CubeIDE 및 HAL 활용)

임베디드 친구 2025. 8. 5. 19:55
728x90
반응형

CANOpen 노드 구현 (STM32CubeIDE 및 HAL 활용)

개요

CANOpen은 산업 자동화 및 임베디드 시스템에서 널리 사용되는 프로토콜로, STM32F429를 활용하여 CANOpen 노드를 구현할 수 있습니다. 본 장에서는 STM32CubeIDE와 HAL 라이브러리를 이용하여 CANOpen 노드를 개발하는 방법을 설명합니다.

개발 환경 구성

CANOpen 노드 구현을 위해 다음과 같은 개발 환경이 필요합니다:

  • 하드웨어
    • STM32F429 보드
    • CAN 트랜시버 (MCP2551 또는 TJA1050 등)
    • CAN Bus 연결을 위한 하드웨어 (케이블, 종단 저항 120Ω)
  • 소프트웨어
    • STM32CubeIDE
    • STM32CubeMX
    • CANOpenNode 또는 CANFestival 라이브러리
    • HAL (Hardware Abstraction Layer)

STM32CubeIDE에서 CAN 설정

  1. STM32CubeMX 프로젝트 생성

    • STM32CubeIDE를 실행하고 새 프로젝트를 생성합니다.
    • STM32F429 칩을 선택하고 프로젝트를 생성합니다.
  2. CAN 주변 장치 활성화

    • Peripherals 메뉴에서 CAN1 또는 CAN2를 활성화합니다.
    • ModeNormal 또는 Loopback으로 설정합니다 (테스트 목적).
    • CAN의 Baud Rate를 설정합니다 (예: 125kbps, 250kbps, 500kbps 등).
    • Filter Configuration을 기본값으로 설정하거나 필요에 맞게 조정합니다.
  3. GPIO 설정

    • CAN1 또는 CAN2의 TX, RX 핀을 확인하고 적절한 핀으로 설정합니다.
    • Alternate FunctionCAN_TX, CAN_RX로 설정합니다.
  4. 코드 생성

    • Project Manager에서 프로젝트 이름과 경로를 설정합니다.
    • Generate Code 버튼을 클릭하여 코드를 생성합니다.

CANOpenNode 라이브러리 통합

  1. CANOpenNode 다운로드 및 프로젝트에 추가

    • CANOpenNode GitHub에서 라이브러리를 다운로드합니다.
    • 프로젝트의 Core 디렉터리 아래에 CANOpenNode 폴더를 추가합니다.
  2. CAN 드라이버 인터페이스 작성

    • CO_driver_STM32.c 파일을 생성하고 CAN HAL 드라이버를 사용하여 전송 및 수신을 처리하는 코드를 작성합니다.
    • HAL_CAN_AddTxMessageHAL_CAN_GetRxMessage API를 활용하여 CAN 메시지를 송수신합니다.
  3. CANOpenNode 초기화 및 실행

    • CO_CANinit() 함수를 호출하여 CAN 모듈을 초기화합니다.
    • CO_CANopenInit()를 호출하여 CANOpen 스택을 초기화합니다.
    • while 루프에서 CO_process()를 호출하여 CANOpen 프로토콜을 실행합니다.

CAN 메시지 송수신 예제

void CAN1_Tx(void) {
    CAN_TxHeaderTypeDef TxHeader;
    uint8_t TxData[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
    uint32_t TxMailbox;

    TxHeader.StdId = 0x123;
    TxHeader.ExtId = 0x01;
    TxHeader.RTR = CAN_RTR_DATA;
    TxHeader.IDE = CAN_ID_STD;
    TxHeader.DLC = 8;
    TxHeader.TransmitGlobalTime = DISABLE;

    if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox) != HAL_OK) {
        // Transmission Error
    }
}

void CAN1_Rx(void) {
    CAN_RxHeaderTypeDef RxHeader;
    uint8_t RxData[8];

    if (HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK) {
        // Process received CAN message
    }
}

결론

이 장에서는 STM32CubeIDE와 HAL을 활용하여 CANOpen 노드를 구현하는 방법을 설명하였습니다. CANOpenNode 라이브러리를 활용하여 CAN 메시지를 송수신하고, CANOpen 프로토콜을 적용하는 과정을 살펴보았습니다.

728x90
반응형