微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 CAN通信 滤波器配置总结

STM32 CAN通信 滤波器配置总结

时间:11-17 来源:互联网 点击:

STM32使用以下规则对过滤器编号:
(1)FIFO_0和FIFO_1的过滤器分别独立编号,均从0开始按顺序编号。
(2)所有关联同一个FIFO的过滤器,不管有没有被激活,均统一进行编号。
(3)编号从0开始,按过滤器组的编号从小到大,按顺序排列。
(4)在同一过滤器组内,按寄存器从小到大编号。FxR1配置的过滤器编号小,FxR2配置的过滤器编号大。
(5)同一个寄存器内,按位序从小到大编号。[15-0]位配置的过滤器编号小,[31-16]位配置的过滤器编号大。
(6)过滤器编号是弹性的。当更改了设置时,每个过滤器的编号都会改变。
但是在设置不变的情况下,各个过滤器的编号是相对稳定的。

这样,每个过滤器在自己在FIFO中都有编号。
在FIFO_0中,编号从0--(M-1),其中M为它的过滤器总数。
在FIFO_1中,编号从0--(N-1),,其中N为它的过滤器总数。

一个FIFO如果有很多的过滤器,,可能会有一条报文,在几个过滤器上均能通过,这时候,,这条报文算是从哪儿过来的呢?
STM32在使用过滤器时,按以下顺序进行过滤:
(1)位宽为32位的过滤器,优先级高于位宽为16位的过滤器。
(2)对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式。
(3)位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高。

按这样的顺序,报文能通过的第一个过滤器,就是该报文的过滤器编号,被存入接收邮箱中。

二、下面是我的代码:

/*时钟初始化*/

void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
// RCC system reset(for debug purpose)
RCC_DeInit();

// Enable HSE
RCC_HSEConfig(RCC_HSE_ON);

//Enable HSI for Flash Operation
RCC_HSICmd(ENABLE);

// Wait till HSE is ready
HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)
{
// HCLK = SYSCLK AHB时钟为系统时钟 72MHz
RCC_HCLKConfig(RCC_SYSCLK_Div1);

// PCLK2 = HCLK APB2时钟为系统时钟 72MHz
RCC_PCLK2Config(RCC_HCLK_Div1);

// PCLK1 = HCLK/2 APB1时钟为系统时钟 72MHz/2=36MHz
RCC_PCLK1Config(RCC_HCLK_Div2);

// Flash 2 wait state
FLASH_SetLatency(FLASH_Latency_2);
// Enable Prefetch Buffer
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

// PLLCLK = 8MHz * 9 = 72 MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

// Enable PLL
RCC_PLLCmd(ENABLE);

// Wait till PLL is ready
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}

// Select PLL as system clock source
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

// Wait till PLL is used as system clock source
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |
RCC_APB2Periph_GPIOA |
RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC |
RCC_APB2Periph_USART1 |
RCC_APB2Periph_SPI1
, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG |
RCC_APB1Periph_USART2 |
RCC_APB1Periph_USART3 |
RCC_APB1Periph_TIM3 |
RCC_APB1Periph_TIM4 |
RCC_APB1Periph_CAN1
// RCC_APB1Periph_CAN2
, ENABLE);
}

/*NVIC配置*/

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM
// Set the Vector Table base location at 0x20000000
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
// Set the Vector Table base location at 0x08000000
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

// Configure one bit for preemption priority
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top