CANOpen 스택 포팅 방법(STM32F429)
개요
CANOpen은 산업 자동화 및 임베디드 시스템에서 널리 사용되는 통신 프로토콜입니다. STM32F429에서 CANOpen 스택을 포팅하는 과정은 CANopenNode 또는 CANFestival과 같은 오픈 소스 스택을 활용하여 구현할 수 있습니다. 본 장에서는 CANOpen 스택을 STM32F429에 포팅하는 방법과 그 과정에서 필요한 설정 및 코드 수정 사항을 설명합니다.
CANOpen 스택 선택
현재 오픈 소스로 제공되는 주요 CANOpen 스택은 다음과 같습니다.
- CANopenNode: 경량화된 CANOpen 스택으로, 높은 확장성과 유연성을 제공합니다.
- CANFestival: 다양한 기능을 제공하는 CANOpen 스택으로, 복잡한 네트워크 환경에서도 활용할 수 있습니다.
STM32F429의 리소스와 프로젝트 요구사항을 고려하여 적절한 CANOpen 스택을 선택합니다. 일반적으로 CANopenNode가 가벼운 구조를 가지므로 임베디드 환경에서 더 적합할 수 있습니다.
개발 환경 설정
1. STM32CubeIDE 및 HAL 드라이버 설정
STM32CubeMX를 사용한 CAN 설정
- CAN 모듈을 활성화합니다.
- CAN Baudrate 및 필터 설정을 구성합니다.
- HAL CAN 드라이버를 활성화합니다.
STM32CubeIDE에서 프로젝트 생성
- STM32CubeMX로 생성한 프로젝트를 STM32CubeIDE에서 열고 필요한 설정을 추가합니다.
stm32f4xx_hal_can.c
및stm32f4xx_hal_can.h
파일을 수정하여 CAN 메시지 송수신을 구현합니다.
2. CANOpen 스택 다운로드 및 프로젝트 통합
CANopenNode 다운로드
- GitHub에서 CANopenNode 소스를 다운로드합니다.
Device
폴더에 STM32F429용 드라이버를 추가합니다.
CANFestival 다운로드
- 공식 웹사이트에서 CANFestival을 다운로드합니다.
- 빌드 시스템을 설정하고 STM32F429에 맞게 수정합니다.
CANopenNode 포팅 과정
1. CAN 드라이버 인터페이스 구현
CANopenNode는 하드웨어 독립적인 구조를 가지므로, STM32F429의 HAL 드라이버와 연동하는 인터페이스를 구현해야 합니다.
CO_driver_STM32F4.c
파일을 생성하고, 다음과 같은 함수를 구현합니다.#include "stm32f4xx_hal.h" #include "CO_driver.h" extern CAN_HandleTypeDef hcan1; CO_ReturnError_t CO_CANmodule_init(CO_CANmodule_t *CANmodule, CAN_TypeDef *CANport) { CAN_FilterTypeDef sFilterConfig; // CAN 필터 설정 sFilterConfig.FilterBank = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; sFilterConfig.FilterActivation = ENABLE; HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig); // CAN 모듈 시작 if (HAL_CAN_Start(&hcan1) != HAL_OK) { return CO_ERROR_ILLEGAL_ARGUMENT; } return CO_ERROR_NO; } void CO_CANsend(CO_CANmodule_t *CANmodule, CO_CANtx_t *buffer) { CAN_TxHeaderTypeDef TxHeader; uint32_t TxMailbox; uint8_t data[8]; TxHeader.StdId = buffer->ident; TxHeader.DLC = buffer->DLC; TxHeader.IDE = CAN_ID_STD; TxHeader.RTR = CAN_RTR_DATA; memcpy(data, buffer->data, 8); HAL_CAN_AddTxMessage(&hcan1, &TxHeader, data, &TxMailbox); } void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { CAN_RxHeaderTypeDef RxHeader; uint8_t data[8]; if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, data) == HAL_OK) { // 수신된 데이터 처리 } }
CO_main.c
파일에서 메인 루프를 구성하고 CANOpen 프로토콜을 실행합니다.
2. Object Dictionary (OD) 설정
CANOpen에서 Object Dictionary(OD)는 중요한 역할을 합니다. OD는 EDS(Electronic Data Sheet) 파일을 기반으로 설정할 수 있습니다.
od.h
,od.c
파일을 생성하고 필요한 오브젝트를 추가합니다.- CANopenNode의
CO_OD.h
파일을 수정하여 OD 항목을 정의합니다.
3. 타이머 및 인터럽트 설정
CANopenNode는 주기적으로 실행되는 타이머를 필요로 합니다.
TIMx
를 이용하여 1ms 타이머 인터럽트를 생성합니다.CO_process()
함수를 주기적으로 호출하여 프로토콜이 정상적으로 동작하도록 합니다.
디버깅 및 테스트
1. CAN 메시지 송수신 테스트
- CAN 분석기 또는 다른 CANOpen 장치를 사용하여 STM32F429의 CAN 메시지를 모니터링합니다.
HAL_CAN_Receive_IT()
를 이용하여 수신된 메시지를 디버깅합니다.
2. CANOpen 기능 테스트
- Heartbeat 메시지가 정상적으로 전송되는지 확인합니다.
- Object Dictionary에 정의한 값들이 정상적으로 읽히고 쓰이는지 테스트합니다.
- PDO 및 SDO 통신이 올바르게 동작하는지 점검합니다.
결론
STM32F429에서 CANOpen 스택을 포팅하는 과정은 CAN 드라이버 구현, Object Dictionary 설정, 타이머 구성 등을 포함합니다. CANopenNode는 경량화된 구조로 임베디드 환경에서 적합하며, CANFestival은 기능이 풍부한 대안이 될 수 있습니다. 본 장에서 다룬 내용을 기반으로 STM32F429에서 CANOpen을 성공적으로 적용할 수 있습니다.
'CAN > CAN Open' 카테고리의 다른 글
CANOpen 네트워크 테스트 및 디버깅 (0) | 2025.08.09 |
---|---|
CANOpen SDO/PDO 통신 실습 (STM32F429) (0) | 2025.08.08 |
STM32F429의 CAN 컨트롤러 특징 및 설정 방법 (0) | 2025.08.06 |
CANOpen 노드 구현 (STM32CubeIDE 및 HAL 활용) (0) | 2025.08.05 |
CANOpen 스택 구조 분석 (0) | 2025.08.04 |