GD芯片替换ST芯片时,ST的CAN过滤器程序不可用
下面是CANopen中常用CANID的过滤器
运行环境:
#include “gd32f10x.h”
#include <stdio.h>
#include “gd32f10x_can.h”
#include “gd32f10x_gpio.h”
/*-------------------------------------------
//函数名:CAN_Set_Filter
//描述:
CAN0过滤器,默认配置符合CANopen基本指令
过滤规则1 CAN ID的低七位必须与Addr一致,其他位不关心
过滤规则2 CAN ID的第7位必须为1,即只有0x80可以通过
过滤规则3 CAN ID的低八位必须为0x00
//参数:uint8_t Addr CANopen的本机nodeID
//返回值:无
//函数调用列表:
---------------------------------------------*/
void CAN_Set_Filter(uint8_t Addr)
{
CAN_FCTL(CAN0)|=1<<0; //过滤器组工作在初始化模式
/*过滤规则1 CAN ID的低七位必须与Addr一致,其他位不关心 */
CAN_FW(CAN0)&=~(1<<0); //过滤器0不激活
CAN_FSCFG(CAN0)|=1<<0; //过滤器位宽为32位.
CAN_FMCFG(CAN0)&=~(1<<0); //过滤器0工作在标识符屏蔽位模式
CAN_FAFIFO(CAN0)&=~(1<<0); //过滤器0关联到FIFO0
CAN_F0DATA0(CAN0)=Addr<<21;//32位ID
CAN_F0DATA1(CAN0)=(0x7F<<21);//32位MASK
CAN_FW(CAN0)|=1<<0; //激活过滤器0
/*过滤规则2 CAN ID的第7位必须为1,即只有0x80可以通过*/
CAN_FW(CAN0)&=~(1<<1); //过滤器1不激活
CAN_FSCFG(CAN0)|=1<<1; //过滤器1位宽为32位.
CAN_FMCFG(CAN0)|=(1<<1); //过滤器1工作在标识符列表模式
CAN_FAFIFO(CAN0)&=~(1<<1); //过滤器1关联到FIFO0
CAN_F1DATA0(CAN0)=0x80<<21;//32位ID
CAN_F1DATA1(CAN0)=(0x80<<21);//32位MASK
CAN_FW(CAN0)|=1<<1; //激活过滤器1
/*过滤规则3 CAN ID的低八位必须为0x00*/
CAN_FW(CAN0)&=~(1<<2); //过滤器2不激活
CAN_FSCFG(CAN0)|=1<<2; //过滤器2位宽为32位.
CAN_FMCFG(CAN0)&=~(1<<2); //过滤器2工作在标识符屏蔽位模式
//CAN1->FM1R|=1<<2; //过滤器2工作在标识符列表模式
CAN_FAFIFO(CAN0)&=~(1<<2); //过滤器2关联到FIFO0
CAN_F2DATA0(CAN0)=0x00<<21;//32位ID
CAN_F2DATA1(CAN0)=(0xFF<<21);//32位MASK
CAN_FW(CAN0)|=1<<2; //激活过滤器2
CAN_FCTL(CAN0)&=~(1<<0); //过滤器组进入正常模式
}