最近STM32芯片的价格真是达到宇宙洪荒的地步,前几天刚刚咨询了一下之前一直合作的供货商,报价200元人民币一片,你没有看错,就是200元人民币一片,一片啊。只能用疯了来形容了。 最近有个项目需要同时接收两帧扩展数据帧,想将两帧CAN消息存分别放到FIFO0和FIFO1中,因为之前看STM32手册的时候,确实看到CAN这块内容的时候,提到CAN1有两个3级深度的FIFO,可以通过过滤器设置来关联不同的FIFO。 经过一些测试和资料的查找,程序终于跑通了。下面是一些主要点的汇总: 1,FIFO0和FIFO1的中断设置不一样(这个可以在系统的stm32f10x_conf.h头文件中可以查到相应的宏定义):
USB_LP_CAN1_RX0_IRQn = 20,
CAN1_RX1_IRQn = 21,
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
2,FIFO0和FIFO1的中断回调函数也是不一样的,如下:
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
u8 i;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
for(i=0;i<8;i++) canRx0buf[i]=RxMessage.Data[i];
}
void CAN1_RX1_IRQHandler(void)
{
CanRxMsg RxMessage;
u8 i;
CAN_Receive(CAN1, CAN_FIFO1, &RxMessage);
for(i=0;i<8;i++) canRx1buf[i]=RxMessage.Data[i];
}
3,过滤器的配置也很重要,不然是收不到想要的CAN消息的;但是也可以都设置成0x0000,不做任何的过滤: 更多的过滤器的设置可以参考下面的内容,总结的非常全面: https://blog.csdn.net/jixiangrurui/article/details/39370027
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=(((u32)slave_id<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLo=(((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
经过测试,两个中断回调函数能够同时工作,都能够收到对应设置的ID的CAN消息了。所以总结一点,手册上是没有骗人的。
其他参考的内容: 1,STM32F105双CAN双FIFO通讯心得体会 2,STM32f103 can的两个接收fifo使用方法
|