Skip to content

taejin-seong/STM32F103VET6-bxCAN-Test-With-UART

Repository files navigation

본 프로젝트에서는 STM32의 내장되어있는 bxCAN을 사용하여 두 개의 STM32F103VET6 MCU 간 CAN 통신을 주고 받는 송수신 테스트를 진행하였으며 이를 PC 터미널 창에 띄어서 확인해보는 과정을 나타냅니다.



참고로 STM32 Connectivity Line을 제외한 F1 시리즈 STM32들은 데이터 송수신에 사용되는 512byte RAM을 USB와 CAN이 공유하기 때문에 USB와 CAN을 동시에 사용하지 못합니다. 따라서 CAN과 USB를 동시에 사용해야 한다면 STM32F105/7이나 F2 시리즈 등 다른 시리즈의 STM32를 사용하시길 바랍니다.

해당 프로젝트는 CAN 통신에 대한 기본적인 이해와 CAN 통신을 위한 기본적인 설정법에 대한 학습이 필요합니다.
아래 사이트를 참고하여 학습하는 것을 추천합니다.


CAN/CAN-FD 통신의 자세한 이론적 소개와 8bit AVR MCU에서의 CAN 통신을 위한 레지스터 설정법을 다뤄줍니다. [이론부분 매우 추천]


CAN 통신의 이론적 소개와 32bit STM32F4 MCU에서의 CAN 통신을 위한 설정법을 다뤄줍니다.


CAN 통신의 이론적 소개와 2bit STM32F0 MCU에서의 CAN 통신을 위한 레지스터 설정법을 다뤄줍니다.


개발 환경

IDE

  • STM32CubeIDE 1.6.0
  • STM32CubeMX

터미널 프로그램

  • Tera Term

개발 보드

  • STM32F103VET6 Custom Development Board
    • 📌 이미지 링크 및 구매처

    • 📌 개발보드 회로도

      • 제공되는 개발보드 회로도를 확인해 본 결과, 회로도에 표기되어있는 커넥터 및 핀 헤더명이 실제 보드의 커넥터 및 핀 헤더명과 서로 다른 것을 확인하였습니다. 이를 주의하시고 회로도를 보시길 바랍니다.

CAN 트랜시버 모듈


하드웨어 구성






bxCAN 설정

Baud Rate 설정

  • CAN 통신의 Baud Rate를 설정할 때는 1 bit를 전송하는데 걸리는 시간을 설정해야함.
  • Baud Rate = 500kbps 으로 설정하기 위한 과정.

(1). Prescaler 설정

  • Baud Rate는 초당 500k bit이므로 1bit 당 2us가 소요.
  • STM32F103VET6의 CAN은 APB1 페리페럴 클럭 버스에 달려있음.
  • APB136MHz 일 때, 이에 따라 Prescaler를 9 로 설정함. 즉, 9/36MHz = 0.25us.
  • 0.25us 단위가 1개의 타임퀀텀(TQ : Time Quantum (plural: Quanta)) 시간 단위가 됨.

(2). 1 Bit Time에 TQ를 몇 개 배치할 것인가?

  • 1 Bit Time에 8개의 TQ를 배치하면 0.25us x 8 = 2us가 됨.
  • 즉, 1 Bit Time에 8개의 TQ를 배치하도록 설정함.
  • 여기까지 통신속도 500kbps가 결정됨.

(3). 1 Bit Time에 TQ를 어떻게 배치할 것인가?

  • 8개의 TQ를 SYNC_SEG, BIT SEGMENT 1 (BS1), BIT SEGMENT 2 (BS2) 에 각각 나눠서 배정.
  • SYNC_SEG1TQ로 고정.
  • 나머지 7개의 TQBS1BS2에 각각 배정해야함.
  • 먼저 SAMPLE POINT75%로 만들기로 결정하고, SAMPLE POINT는 다음과 같은 공식으로 정해짐.
    • Sample Point = (SYNC_SEG + BS1) / Total TQ
  • 따라서 위의 공식을 이용하면 75/100 = (1 + BS1) / 8 이므로 이를 BS1에 대하여 풀면 BS1=5, 저절로 BS2=2
  • 그러므로 SYNC_SEG = 1, BS1 = 5, BS = 2의 TQ를 배정받게 됨.
  • 이와 함께 SJW (Re-Synchroniztion Jump Width)1로 설정
  • 여기까지 TQ 배치에 따른 Sample Point가 결정되고 1 Bit Time이 완성됨.

(4). 사이트를 이용하여 쉽게 계산하기




Filter Mask ID와 Filter ID 설정

  • STM32F103VET6의 bxCAN (Basic Extended CAN)CAN의 2.0A와 B 둘 다 지원함.
    • 즉, CAN 2.0B 버전이므로 하위호환 때문에 2.0A도 지원이 가능.
  • 본 프로젝트에서는 11 bit Standard ID, 16 bit Filter Scale, Filter ID Mask 모드를 사용함.

(1). MCU 1의 Filter Mask ID와 Filter ID



(2). MCU 2의 Filter Mask ID와 Filter ID



그 외 설정

  • 본 프로젝트에서의 모든 디바이스는 마스터 모드로 작동함.
  • Filter를 거쳐 수신된 메세지들을 처리하기 위해 FIFO0을 사용함.
  • CAN 통신을 위한 Filter 정보들은 Bank 0번에 저장되며 하나의 Bank만 사용함.
  • CAN 통신의 수신 부분은 폴링방식이 아닌 인터럽트 방식을 채택하였음.
  • CAN 통신의 송신 부분의 Data Field 크기는 8byte로 설정함.

STM32CubeMX 설정

Clock Configuration

📌




Pinout

📌





Peripheral & Core Configuration

1. UART1

📌


2. CAN

📌


3. GPIO

📌
• PC6 (LED2), PC7 (LED1)은 개발 보드 내에 연결된 2개의 LED Pin을 의미합니다.



4. DMA

📌
USART1 DMA Request Setting
     - [USART1_RX] :  Mode → Circular
     - [USART1_TX] :  Mode → Normal (All Default)




5. NVIC

📌




테스트 파일

구성 및 경로

  • 기본적으로 구현한 테스트 함수는 다음과 같습니다

    • stm32f103vet6_fsmc_can_test → src → ap → ap.c → void apMCU1CanTest(void){...}
    • stm32f103vet6_fsmc_can_test → src → ap → ap.c → void apMCU2CanTest(void){...}
  • apMCU1CanTest() 함수와 apMCU2CanTest() 함수를 각각 다른 타겟 MCU에 다운로드하여 CAN 통신을 테스트 해볼 수 있습니다.

  • ap.c 함수에서 제공하는 테스트 외에 다양한 테스트 케이스를 응용하여 구현할 수 있습니다.



실행 방법

  • 기본 테스트 함수를 빌드하고 실행시키기 위해서는 stm32f103vet6_fsmc_can_test → src → main.c에서 빌드 시킬 테스트 함수의 주석을 해제해야합니다.
#include "main.h"

int main(void)
{
   hwInit();
   apInit();
   
// apBoardLedTest();
// apUartTest();
   apMCU1CanTest(); //0x7F3
// apMCU2CanTest(); //0x7F6
   
   return 0;
}

테스트 결과

(1). 터미널창 초기화면



(2). MCU 1에서 MCU 2로 해당 ID의 데이터를 송신하는 경우

  • Filter 설정으로 인해 MCU 2에서는 0x104, 0x10C ID를 가지는 메세지를 수신하지 않고 0x100, 0x108 ID를 가지는 메세지만 수신함.


(3). MCU 2에서 MCU 1으로 해당 ID의 데이터를 송신하는 경우

  • MCU 1에서는 MCU 2가 가질 수 있는 0x100, 0x108 ID의 메세지를 모두 수신할 수 있음.


(4). 0x100 Std ID로 데이터 1을 송신할 때의 CAN 메세지의 Data Frame 파형 측정

  • Data Field는 8 byte로 설정됨.
  • 마지막 7 bits는 End Frame 의미.

  • Data Frame 포멧


참고

프로젝트를 빌드할 때는 다음 경로에 있는 폴더를 빌드 및 디버그 항목에서 제외해야 정상적으로 프로젝트가 빌드됩니다.

  • stm32f411ceu6_fw_module → src → lib → Core

How to exclude

📌
• Core 폴더를 클릭하고 다음 단계를 진행합니다.

   



• 최종적으로 아래와 같은 폴더 상태가 됩니다.





About

STM32F103VET6 Dev Board, Perform bxCAN test through Uart.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages