#技术资源# #申请原创# **背景
在上篇**中有提及——“......原ST标准库中,CAN_FilterInit()“只做了CAN1的filter配置”(为什么ST平台可以这样?为什么这里打了双引号?)......”
认真看完上篇**的道友,相信大部分的人都可以用上APM32的CAN2功能了(不会的来留言找我们),但难免还有如下几个疑问:
- ST作为通用MCU的行业老大哥,其CAN外设标准库函数,为什么“只会”配置CAN1的filter?老大哥真的会犯这么低级的错误吗?
- 为什么在STM32F105平台上可以这样用CAN_FilterInit(),但是移植到APM32平台后CAN2的配置就失效了?
- STM老大哥的filter是0~27总共28个过滤器组,那这28个filter是怎么分配给到CAN1、CAN2的呢?还是说他们都是混合使用、等用到的时候才使能/关联CAN1/CAN2?怎么工程里不见关联配置这28个filter的操作,反而是简单粗暴地使用起来了(冥冥之中有默认配置)?
抱着“知其然 知其所以然”的态度,我们继续往下剖析下APM32F103/E103和STM32F105的CAN2差异。
二者差异
1、让我们先回到代码层面来分析CAN_FilterInit()这个关键函数
可见14~28这14个filter,只存在于STM32F105这种互联型产品里(F103没有!)
2、在STM32F105的平台上,貌似只要配置了以CAN1为偏移值的某部分寄存器(FMR、FA1R),CAN2外设的filter也会同时生效?
关键王炸来了(来自STM32 Reference Manuel):
ST的F105,对应偏移地址为0x200-0x31C,也即激活配置filter相关的寄存器,只存在于CAN1!这也就解释了,为什么STM老大哥的标准库,在CAN_FilterInit()中只需要管CAN1即可(老大哥还是权威的)。
3、我们再查看下APM32对CAN1 CAN2的描述
——意思就是,APM32的CAN1、CAN2,都有其单独关联、激活filter相关的寄存器,有独立的寄存器。
4、额外补充——关于STM32F105的filter号分配
并非”指腹为婚“地被定死了,其实也可以后期“逆天改命”进行修改配置的。跟CAN_FMR寄存器里的CAN2SB[5:0]位有关
代码实测
基于APM32 SDK的双CAN例程,仿真实测——实际CAN2对应filter偏移地址的寄存器,是被赋值了,跟上述推论一样:
“APM32的CAN1、CAN2,都有其单独关联、激活filter相关的寄存器,有独立的寄存器。”
|