Setting of CAN filter for STM8 microcontroller
Hedy

Hedy @carolineee

About: Publish some interesting electronic articles

Joined:
Dec 18, 2023

Setting of CAN filter for STM8 microcontroller

Publish Date: Jun 18
0 0

To set up the CAN filter on an STM8 microcontroller (like STM8S or STM8AF series with CAN capability), you need to configure the CAN filter registers to determine which messages the MCU should accept or ignore.

Image description

Here’s a structured overview of how to configure the CAN filter:

1. Understand the STM8 CAN Peripheral

  • STM8 CAN peripheral is based on the bxCAN (Basic Extended CAN) core.
  • The CAN filter allows mask-based or list-based filtering.
  • You can filter on standard (11-bit) or extended (29-bit) IDs.

2. Key Filter Registers
These are the main registers involved in CAN filtering on STM8:

  • CAN_FMR – Filter Master Register
  • CAN_FA1R – Filter Activation Register
  • CAN_FS1R – Filter Scale Configuration
  • CAN_FM1R – Filter Mode Register
  • CAN_FiR – Filter ID/Mask Registers

On STM8, filters are typically accessed using:

  • CAN->sFilterRegister[i].FR1 (Filter bank register 1)
  • CAN->sFilterRegister[i].FR2 (Filter bank register 2)

3. Steps to Configure CAN Filter
Step 1: Enter Filter Init Mode

c

CAN->FMR |= CAN_FMR_FINIT;  // Enter filter initialization mode
Enter fullscreen mode Exit fullscreen mode

Step 2: Set Filter Parameters
Select filter bank (example: filter 0)

c

uint8_t filter_bank = 0;
Enter fullscreen mode Exit fullscreen mode

Choose Filter Scale (32-bit or 16-bit)

c

CAN->FS1R |= (1 << filter_bank);  // 32-bit scale
Enter fullscreen mode Exit fullscreen mode

Choose Filter Mode

  • Mask mode: Use ID and Mask (accept all IDs that match the mask)
  • List mode: Match specific IDs exactly
c

CAN->FM1R &= ~(1 << filter_bank); // Mask mode
// OR
// CAN->FM1R |= (1 << filter_bank); // List mode
Enter fullscreen mode Exit fullscreen mode

Set Filter ID and Mask
For standard ID (11-bit) in 32-bit format:

c

CAN->sFilterRegister[filter_bank].FR1 = (your_ID << 21);      // Filter ID
CAN->sFilterRegister[filter_bank].FR2 = (your_mask << 21);    // Mask
Enter fullscreen mode Exit fullscreen mode

For extended ID (29-bit):

c

CAN->sFilterRegister[filter_bank].FR1 = (your_EXT_ID << 3);
CAN->sFilterRegister[filter_bank].FR2 = (your_EXT_MASK << 3);
Enter fullscreen mode Exit fullscreen mode

Activate Filter

c

CAN->FA1R |= (1 << filter_bank);
Enter fullscreen mode Exit fullscreen mode

Step 3: Exit Filter Init Mode

c

CAN->FMR &= ~CAN_FMR_FINIT;  // Exit filter init mode
Enter fullscreen mode Exit fullscreen mode

Example: Accept Only Standard ID 0x123

c

CAN->FMR |= CAN_FMR_FINIT;

CAN->FM1R &= ~(1 << 0);      // Mask mode
CAN->FS1R |= (1 << 0);       // 32-bit scale
CAN->sFilterRegister[0].FR1 = (0x123 << 21);  // ID
CAN->sFilterRegister[0].FR2 = (0x7FF << 21);  // Full mask

CAN->FA1R |= (1 << 0);       // Enable filter 0

CAN->FMR &= ~CAN_FMR_FINIT;
Enter fullscreen mode Exit fullscreen mode

Notes:

  • Filter match occurs when: (Incoming_ID & MASK) == (Filter_ID & MASK)
  • You can define multiple filters for different IDs or ranges.
  • STM8 CAN supports up to 14 filter banks (depends on the model).

Comments 0 total

    Add comment