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.
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
Step 2: Set Filter Parameters
Select filter bank (example: filter 0)
c
uint8_t filter_bank = 0;
Choose Filter Scale (32-bit or 16-bit)
c
CAN->FS1R |= (1 << filter_bank); // 32-bit scale
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
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
For extended ID (29-bit):
c
CAN->sFilterRegister[filter_bank].FR1 = (your_EXT_ID << 3);
CAN->sFilterRegister[filter_bank].FR2 = (your_EXT_MASK << 3);
Activate Filter
c
CAN->FA1R |= (1 << filter_bank);
Step 3: Exit Filter Init Mode
c
CAN->FMR &= ~CAN_FMR_FINIT; // Exit filter init 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;
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).