ComputerScience & Embedded/NUCLEO & CAN Tranceiver
CAN normal mode
leecrossun
2025. 3. 1. 20:41
CAN normal mode Introduction
- CAN normal mode 를 사용하여 두 개의 노드 연결
- 노드 1(N-1)과 노드 2(N-2) 두 개의 보드 필요
- N1은 1초마다 LED 번호를 CAN 데이터 프레임으로 N2에 전송
- 이를 위해 타이머를 사용하여 1초마다 인터럽트를 발생시키고, 인터럽트 핸들러에서 N1에서 N2로 데이터를 전송
- N2는 수신된 메시지에 따라 해당하는 LED ON
- N2 보드에 연결된 4개의 외부 LED(LED1, LED2, LED3, LED4)가 각각 다른 GPIO 핀에 연결
- N1은 또한 4초마다 리모트 프레임을 보내 2바이트 데이터를 요청
- N2는 리모트 프레임을 수신한 후, 2바이트 데이터를 데이터프레임으로 N1에 응답
- N1은 데이터를 수신하고 화면에 표시
CAN normal mode Exercise - Tx
메인 코드 (main.c)
- GPIO_Init, UART2_Init, TIMER6_Init, CAN1_Init, Filter_config는 이전과 동일하게 설정
- 새로운 부분은 TIMER6_Init이며, 타이머 핸들을 설정하여 1초 간격으로 타이머가 동작하도록 구성
- CAN1_Init에서 Loopback 모드를 Normal 모드로 변경
- CAN bit timing은 500Kbps로 설정, 이후 1Mbps로 변경 테스트 예정
- Filter Config는 현재 변경 없음, 이후 특정 프레임을 필터링할 예정
- CAN_Start 실행 후, CAN TX 및 CAN RX 처리는 타이머 인터럽트 핸들러에서 수행
타이머 인터럽트 핸들러 (IT.c)
- Timer6 IRQ Handler → 타이머 주기 경과 콜백(Timer Period Elapsed Callback)을 트리거
- 1초마다 CAN TX 실행 (CAN1_TX 함수 호출)
CAN TX 구현
- TX header 설정 후 1바이트 메시지 전송 (LED 번호 전송)
- DLC는 1, Standard ID 설정 (임의 값 선택)
- LED 번호를 전역 변수로 설정하고, 전송 후 1씩 증가
- LED 번호가 4가 되면 다시 0으로 초기화
- CAN TX API를 사용해 메시지 전송
- 즉, 1초마다 LED 번호를 전송하는 기능 구현
버튼 인터럽트 처리
- 타이머 시작을 버튼 인터럽트에서 수행.
- EXTI15_10_IRQHandler를 사용해 버튼 인터럽트 처리.
- HAL_GPIO_EXTI_IRQHandler API를 호출하여 EXTI 인터럽트 처리.
- 사용 보드(Nucleo or Discovery)에 따라 EXTI 핸들러가 다를 수 있음 → 적절한 ISR 구현 필요.
GPIO Init
- N1 측 (노드 1)
- 애플리케이션은 버튼을 눌렀을 때 실행됨
- 버튼은 PC13 핀에 연결됨
- 따라서 PC13을 GPIO 입력(Input) 모드 + 인터럽트(Interrupt) 모드로 설정해야 함
- N2 측 (노드 2)
- 4개의 LED를 제어하기 위해 4개의 GPIO 핀 사용
- 해당 GPIO 핀들은 출력(Output) 모드로 설정해야 함
코드 구현
- main.c의 기존 GPIO_Init 함수에서 초기화 수행
- 기존 GPIO_Init 함수에는 온보드 LED 초기화 코드가 있음
- 여기에 N1의 버튼 핀(PC13) 설정 및 인터럽트 활성화 코드 추가
- 그리고 N2의 4개 GPIO를 출력 모드로 설정하는 코드 추가
- GPIO 초기화는 N1과 N2 공통 함수로 작성
반응형