很早就开始STM32处理器的研究工作了,期间开发了几款设备,使用的外设基本上是SPI、UART、IIC、GPIO,应用还是比较方便灵活的。
后来由于工作需要使用CAN的外设,也就通过ST提供的接口进行测试,比较顺利,CAN收发正确了。编写代码是发现通过配置验收滤波器可以大幅降低系统的负担,提高CPU的使用效率,所以就花时间研究这部分的使用了。
开始时查找资料,进行复制粘贴,不断的测试,一直不好用,不知为何。
进一步上网搜索后发现,网上的说明比较片面,只是说明了CAN的扩展帧铝滤波的实例,我做的是标准帧的测试,两种配置是不一样的,按网上的一片文章验证,可用的,目前只测试标准帧,扩展帧还没测试,按找理解的知识来看,那部分是应该可以通过的,暂时就不测试了。
//can总线 配置滤波器,属于硬件屏蔽,只允许指定的ID可以通过滤波进入到接收存储区
//与软件滤波相比,可以提高CPU的使用效率,
//入口参数:
//CAN_FilterNumber: 滤波器索引,可以设置多个滤波ID 取值范围0-12
//CAN_FilterId: 滤波ID
//CAN_ID_Std_Ext: 帧类别(CAN_ID_STD:11bit标准帧,CAN_ID_EXT:29bit扩展帧)
//无返回参数
void CAN_Config_FilterInit( uint8_t CAN_FilterNumber,u32 CAN_FilterId,u32 CAN_ID_Std_Ext) //can总线 配置
{
CAN_FilterInitTypeDef CAN_FilterInitStructure; //定义can过滤器 结构
u32 tempid;
tempid = CAN_FilterId;
tempid &= 0x1FFFFFFF;
if(CAN_ID_Std_Ext == CAN_ID_STD)
{
tempid <<= 5;
// tempid |= CAN_ID_STD;//CAN_ID_EXT; //扩展ID
// tempid |= CAN_RTR_DATA;
CAN_FilterInitStructure.CAN_FilterNumber = CAN_FilterNumber; //指定了待初始化的过滤器,它的范围是 1到 13。
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //指定了过滤器将被初始化到的模式 CAN_FilterMode_IdMask标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //给出了过滤器位宽
CAN_FilterInitStructure.CAN_FilterIdHigh = tempid;
CAN_FilterInitStructure.CAN_FilterIdLow = 0;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFF8; //RTR 可以为数据帧也可以远帧
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; //
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //使能或者失能过滤器
CAN_FilterInit ( &CAN_FilterInitStructure ); //根据 CAN_FilterInitStruct中指定的参数初始化外设 CAN的寄存器
}
else
{
tempid <<= 3;
tempid |= CAN_ID_EXT; //扩展ID
// tempid |= CAN_RTR_DATA;
CAN_FilterInitStructure.CAN_FilterNumber = CAN_FilterNumber; //指定了待初始化的过滤器,它的范围是 1到 13。
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //指定了过滤器将被初始化到的模式 CAN_FilterMode_IdMask标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //给出了过滤器位宽
CAN_FilterInitStructure.CAN_FilterIdHigh = (tempid>>16)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterIdLow = tempid&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFF8; //RTR 可以为数据帧也可以远帧
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; //
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //使能或者失能过滤器
CAN_FilterInit ( &CAN_FilterInitStructure ); //根据 CAN_FilterInitStruct中指定的参数初始化外设 CAN的寄存器
}
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13771794/viewspace-692373/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13771794/viewspace-692373/