- UID
- 1029342
- 性别
- 男
|
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); } |
|