개정내역 버전개정내역일자 0.1.0 첫번째릴리즈 2011/08/29 사용된 Tool 버전 Tool IAR EWARM Kickstart Edition Version 5 또는이후버전 참고문서 번호 회사명 문서명 1 STMicroelectronics RM0008 STM32 Reference manual 2 IAR Systems EWARM_IDEGuide.ENU.pdf 3 4 5 소개 STM32 의 Peripheral 중 BxCAN 에대한이해를돕기위해작성되었습니다. 지원디바이스 STM32F103/105/107 BxCAN 을내장한 STM32 MCU 시작하기에앞서 CAN 통신에대한기초지식은있다는가정하에설명을진행합니다. yskim@saemichips.co.kr 02-2026-5140-1 -
bxcan 1. bxcan 특징 RM0008 문서에자세히나와있으나정리하자면, CAN 2.0A/B 지원 최대 1M bps 전송속도 Time triggered communication 지원 세개의 Tx Mail box 전송우선순위설정가능 Time stamp 기능 두개의 Rx FIFO ID List / ID Range Filter 설정단점으로는 STM32 Connectivity Line을제외한 F1 시리즈 STM32들은 USB와 CAN을동시에사용하지못합니다. 이유는데이터송 / 수신에사용되는 512바이트 RAM을 USB와 CAN이공유하기때문이라고합니다. CAN과 USB를동시에사용해야한다면 STM32F105/7이나 F2 시리즈의 STM32를사용하시기바랍니다. 2. bxcan Block diagram 블록은위그림에나타낸바와같이 Control/Status/Configuration 부, Tx Mailbox 부, Rx FIFO 부, Filter 부로나누어집니다. yskim@saemichips.co.kr 02-2026-5140-2 -
STM32F Connectivity Line 디바이스들의경우 CAN Slave 가추가되어있으며 Filter 와 MAC 만공유하고 다른부분은따로가지고있습니다. 그리고 Filter 개수도다른디바이스에비해 2 배로가지고있습니다. 3. CAN Bit timing 설정예제프로젝트에서는 STM32의 SYSCLK을 72Mhz, CAN Clock 36Mhz 에서 CAN 통신속도 1Mhz 일경우로설정되어있습니다. STM32의 bxcan은 APB1으로부터 Clock을공급받으므로 CAN에공급되는 Clock 주파수는 36Mhz입니다. CAN BIT TIME 1Tq 1 8Tq 1 8Tq 1 8Tq Sync Prop Segment Phase segment1 Phase segment2 TSEG1 TSEG2 Sampling point 아래사이트를참조하면 Bit Time 설정에도움이되리라생각됩니다. http://www.kvaser.com/en/support/bit timing calculator.html 4. CAN Message 전송 CAN Message 를전송하는방법은생각보다간단합니다. CAN TSR(Transmit status register) 의 TME(Transmit Mailbox Empty) bit를확인해서비어있는 Mailbox를찾은다음비어있는 Mailbox에 ID, Frame type, DLC 및데이터를셋팅하고 TX mailbox id regster의 TXRQ(Transmit Mailbox Request) bit를 SET하면설정된 Message가전송됩니다. 예제프로젝트의 can_drv.c 파일의 can_tx_msg 함수를참조바랍니다. yskim@saemichips.co.kr 02-2026-5140-3 -
CAN TX STATE MACHINE 전송우선순위 : bxcan은세개의 Tx Mailbox를가지고있으며전송의우선순위를 ID로할지아니면 Tx를요청한순서대로전송할지를선택할수있습니다. CAN MCR(Master control register) 레지스터의 TXFP(Tx Fifo priority) 비트가 1이면전송을요청한순서로 Message가전송되며 0이면 ID가낮은순서로 Message가전송됩니다. 이비트는전송을요청한순서로나가도록예제프로그램에서는설정되어있습니다. 대부분의애플리케이션에서보내는메시지가 Pending되는일은없을것입니다. 전송중지 Mailbox0의 Message 전송을중지하려면 TSR의 ABRQ0비트를 SET 합니다. Pending이나 Scheduled 상태면즉시전송이중지되며 Transmit 상태인동안에는두가지경우로나누어집니다. 만약전송이성공하면 Mailbox는 TXOK비트를 SET으로하고 Empty상태로되며전송에실패하면전송은중지되고 Scheduled상태에서 Empty상태로되며 TXOK비트는 RESET됩니다. 자동재전송 MCR레지스터의 NART(No automatic retransmission) 비트가 0이면 CAN Hardware는 Message전송이성공할때까지재전송을시도하게됩니다. Time triggered communication option이아니면자동재전송모드를선택해야합니다. 5. CAN Filter 설정 CAN은 Message를 ID단위로수신을할지아니면버릴지를 Hardware적으로결정을합니다. 이판단의기준이되는것이 Filter인데요. Filter설정에따라서 CAN Network에돌아다니는메시지를받을지버릴지를결정합니다. bxcan의 Filter는두개의 32비트레지스터로이루어져있으며네가지로셋팅할수있습니다. 아래의그림은 Filter설정을그림으로나타낸것입니다. yskim@saemichips.co.kr 02-2026-5140-4 -
그리고각 Filter마다두개의 Receive FIFO중하나를선택해서 Filter를통과한 Message를선택된 FIFO로보낼수있습니다. CAN RDTR(Receive FIFO mailbox data length control and time stamp register) 의 Filter match index field에현재 FIFO에수신된 Message의 Filter match index가들어갑니다. ID List mode ( ID Filtering mode ) Filter bank register 에 ID List 가들어가며이 ID List 와동일한 ID 를갖는 Message 는이 Filter 를통과해서 Rx FIFO 에들어갑니다. 예제소스에서 16 bit ID list mode 로 Filter 를 setting 하는부분입니다. const t_can_filter_init can_filter0 = { /* FMI 0~3 */ 0, // Filter number kcanfm_16bitidlist,// e_filt_mode kcanfa_fifo0, // kcanfa_fifo0 or kcanfa_fifo1 kmake16bitidlistvalue(0x111, kframetypedata, 0x112, kframetypedata), kmake16bitidlistvalue(0x113, kframetypedata, 0x114, kframetypedata) }; 위와같이설정하면 0x111, 0x112, 0x113, 0x114 ID가 Filter0을통과할수있습니다. ID Mask mode ( Range filtering mode ) 예를들어 0x300 ~ 0x30F 의 Message 를수신하고자할때사용하는모드입니다. 즉특정범위의 Message 를모두수신하고싶을때사용합니다. yskim@saemichips.co.kr 02-2026-5140-5 -
예제소스에서 16 bit ID mask mode로 Filter를 setting하는부분입니다. const t_can_filter_init can_filter4 = { /* FMI 0~1 */ // ID 0x61x, 0x510 ~ 0x51F까지메시지수신 // ID 0x71x, 0x520 ~ 0x52F까지메시지수신 /* FMI 28~29 */ 4, // Filter number kcanfm_16bitidmask, kcanfa_fifo1, kmake16bitidmaskvalue(0x510, 0x7F0, kframetypedata), kmake16bitidmaskvalue(0x520, 0x7F0, kframetypedata) }; ID와 Filter를설정하는방법은아래와같습니다. ID 0x510 0101,0001,0000 Mask 0x7F0 0111,1111,0000 Mask bit 가 1 이면 Must match, 0 이면 Don t care 이므로 위의적색화살표를기준으로왼쪽은 mask bit가 1이므로 ID 0x51부분과일치해야하며오른쪽은 mask bit가 0이므로 ID부분의하위 4개의비트와는무관하게 Filter를통과합니다. 이렇게해서 0x510~0x51F까지의 ID를가진 Message가 Filter를통과하게됩니다. 이모드를사용하면하나의필터로 11비트 ID 모두를수신할수도있습니다. 그러나이렇게 Range filtering을사용하면 Message가수신될때 Software에서 ID를모두확인해서 Message버퍼에저장해야하기때문에 CPU 로드가발생합니다. 수신할 ID가많아서 Filter가모자랄경우가아니면사용하는것을권장하지않습니다. Filter match Index 각 FIFO의 RDTR에는 Filter match index field가있습니다. 이는수신된 Message가어떤 filter 를통과했는지를나타내주는 Index 입니다. Filter의 mode에따라서 Filter에번호가붙게되는데아래그림과같습니다. 아래그림에서 Filter bank는 Filter Register번호이며 Filter Num이 FMI Field에들어가는 index 번호입니다. Message가수신되면 ID를비교하지않고 FMI를확인해서 Message 버퍼에저장할수있어서 ID를비교하는것보다빠릅니다. yskim@saemichips.co.kr 02-2026-5140-6 -
예제프로젝트에서는 FIFO0 는 ID List 모드로설정되는필터를할당했으며 FIFO1 에는 ID Mask 모드 로설정되는필터를할당했습니다. 그러나꼭그럴필요는없으며위그림과같이혼합해서할당해 도문제는없습니다. Filter start bank STM32F105/7 디바이스와같이 CAN이 2개인디바이스에해당됩니다. Filter start bank에 Filter Register number가들어가야하며이번호이후의필터는 CAN2에할당됩니다. Reset value는 14이므로변경을하지않으면 14번 ~27번까지의 Filter가 CAN2에할당됩니다. 6. CAN Message 수신 Filter설정을잘했다면 Network에돌아다니는 Message를수신하는방법은쉽습니다. 수신인터럽트를활성화해놓으면돌아다니는 Message가 Filter를통과하고자동으로 FIFO에 ID, DLC등의데이터가저장된후인터럽트가발생합니다.. 그러므로수신인터럽트가발생하면어떤 FIFO가 Interrupt를발생시켰는지확인후 FIFO에저장된 Message data를가져오면됩니다. CAN Rx 인터럽트는 FIFO0, FIFO1각각할당되어있습니다. 먼저 RX state machine 을살펴보겠습니다. yskim@saemichips.co.kr 02-2026-5140-7 -
위 state machine 에서 Valid message 는 Filter 를통과한 message 입니다. Receive FIFO0, 1 에는각각 3 개의 Mailbox 를가지고있습니다. PENDING : EMPTY상태에서 Message가 Filter를통과하면 RFxR(x=0 or 1) register의 FMP field가하나씩증가하며 PENDING상태가됩니다.Mailbox의 Message를저장하고 RFxR의 RFOMx(Release FIFOx Output Mailbox) 비트를 Set하면 FMP field가하나씩감소합니다. 수신된 Message모두저장하고 mailbox를모두 Release시키면 EMPTY상태가됩니다. OVERRUN : Mailbox를 release하지않고 4번째 Message가수신되면 Overrun상태 (Receive FIFOx Register의 FOVRx bit가 Set됨 ) 가됩니다. Overrun 상태에서계속 Message가수신되면 MCR(Master Control Register)register 의 RFLM 비트의상태에따라두가지로동작합니다. RFLM = 0 : 4번째수신된 Message를 Overwrite합니다. RFLM = 1 : 4번째수신된 Message를버립니다. 세번째까지받은메시지유지합니다. CAN Rx Interrupt Interrupt Enable/Disable은 IER(Interrupt Enable Register) 의 Enable bit를통해서할수있습니다. FIFO mailbox에 Message가수신되었을때 Interrupt가발생되게하려면 FMPIEx 비트를 SET하면됩니 yskim@saemichips.co.kr 02-2026-5140-8 -
다. 그리고소프트웨어에서 void CAN1_RX0_IRQHandler(void) 함수를추가하고코딩을하면됩니다. 자 세한내용은예제프로젝트를참조하세요. 예제프로젝트 프로젝트폴더구조및설명예제프로젝트에는 Data frame/remote frame에대한예제및 ID List/ID Mask에대한 Tx/Rx예제가있습니다. 예제프로젝트에서는 Remote frame을수신하면그에해당하는자신의 Message를 Data frame으로보냅니다. 소스코드에대한설명은주석으로대체합니다. 프로젝트의압축파일을풀면아래의그림과같은트리로구성되어있음을확인할수있습니다. Application : CAN Test 소스파일및프로젝트파일등이있습니다. BootLoader : USART통신으로펌웨어를업그레이드할수있는부트로더프로젝트폴더입니다. EWARMv5.4 : EWARM ver5.4용 Workspace파일이있는폴더입니다. EWARMv6.1 : EWARM ver6.1용 Workspace파일이있는폴더입니다. Libraries : STMicroelectronics에서제공하는라이브러리파일이있는폴더입니다. Uploader_win : Windows 응용프로그램이있는폴더입니다. Utility : STM32 C 소스파일이있는폴더입니다. 본예제프로젝트는 2 가지방법으로테스트를할수있습니다. 첫째두개의 STM3210B_EVAL 보드또 는 STM3210E_EVAL 보드를사용하는방법과하나의 STM3210C_EVAL 를사용하는방법이있습니다. 두개의 STM3210E_EVAL 보드또는 STM3210B_EVAL 보드를사용하는방법 1) [ STM32_CSP_CAN v1.x ]\EWARMv5.4 폴더에서 bl_can_app_ewarm v5.4.eww 을엽니다. yskim@saemichips.co.kr 02-2026-5140-9 -
2) Configuration drop down 메뉴에서 STM32F10X_MD 또는 STM32F10X_MD_NOBOOT 를선택합니다. 차이는부트로더를사용여부이며 CAN 테스트에서는 Bootloader 는상관이없으므로 STM32F10X_MD_NOBOOT 를선택하십시오. 3) 둘중의하나의타켓보드에 J LINK 나 ST LINK 를사용해서펌웨어를업로드합니다. 4) [ STM32_CSP_CAN v1.x ]\EWARMv6.1 폴더에서 boot_can_appl_ewarm_project.eww Workspace 파일을엽니다. 5) Configuration drop down 메뉴에서 STM32F10X_MD_HD_NoBL 을선택한후프로젝트를빌드하고 다른하나의보드에펌웨어를업로드합니다. 디버깅상태에서통신이잘되는지 Watch 창을통해 서 st_can1_rx_msg0, st_can1_rx_msg1 을확인합니다. STM3210C_EVAL 보드를사용해서 CAN1,CAN2 로서로통신하는방법 1) [ STM32_CSP_CAN v1.x ]\EWARMv6.1 폴더에서 boot_can_appl_ewarm_project.eww Workspace yskim@saemichips.co.kr 02-2026-5140-10 -
파일을엽니다. 2) Configuration drop down 메뉴에서 STM32F10X_CL_NoBL 을선택합니다. 3) 프로젝트를빌드하고펌웨어를업로드한후디버그상태에서 Watch 창을통해서 st_can1_rx_msg0, st_can1_rx_msg1 을확인합니다. yskim@saemichips.co.kr 02-2026-5140-11 -
1 라인으로 Transceiver 없이통신하기 STM32 의 GPIO pin mode 중에 Alternate Function open drain mode 덕분에 1 라인 CAN 통신이가능합 니다. 타회사의 MCU 도 Open drain 설정이있으면될것으로생각됩니다. 일반적으로 CAN통신에는 SN65HVD230과같은 CAN Transceiver가필요합니다만 Board내에서 MCU끼리통신한다거나비교적노이즈가없는환경에서가까운거리의통신이라면 Transceiver가없어도 CAN 통신이가능합니다. CAN Transceiver를사용하는경우라면 CAN Tx pin은 Alternate Function push pull로설정을합니다만, 1라인통신을위해서는 Alternate Function open drain 으로설정하고아래의그림과같이 MCU끼리연결을하면통신이가능합니다 3.3V 680 STM32_1 STM32_2 Other CAN MCU 1 Other CAN MCU n Tx와 Rx사이의연결저항은 100K옴정도를사용. CAN BUS LINE의 Pull up저항은거리가멀수록작아야하나 GPIO Pin의구동전류도생각해야하므로실험을통해서에러가나지않는범위내에서정하면됩니다. yskim@saemichips.co.kr 02-2026-5140-12 -