首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 CAN通信 滤波器配置总结(2)

STM32 CAN通信 滤波器配置总结(2)

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);    }
继承事业,薪火相传
返回列表