GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure1,CAN_FilterInitStructure2,CAN_FilterInitStructure3,CAN_FilterInitStructure4;
CAN_FilterInitTypeDef CAN_FilterInitStructure5,CAN_FilterInitStructure6;
NVIC_InitTypeDef NVIC_InitStructure;
unsigned short mask;
unsigned short filter_data1[] = {0x500, 0x501, 0x502, 0x503, 0x504, 0x505, 0x506, 0x507, 0x508, 0x509, 0x50A, 0x50B, 0x50C, 0x50D, 0x50E, 0x50F};
unsigned short filter_data2[] = {0x510, 0x511, 0x512, 0x513, 0x514, 0x515, 0x516, 0x517, 0x518, 0x519, 0x51A, 0x51B, 0x51C, 0x51D, 0x51E, 0x51F};
unsigned short filter_data3[] = {0x520, 0x521, 0x522, 0x523, 0x524, 0x525, 0x526, 0x527, 0x528, 0x529, 0x52A, 0x52B, 0x52C, 0x52D, 0x52E, 0x52F};
unsigned short filter_data4[] = {0x530, 0x531, 0x532, 0x533, 0x534, 0x535, 0x536, 0x537, 0x538, 0x539, 0x53A, 0x53B, 0x53C, 0x53D, 0x53E, 0x53F};
unsigned short filter_data5[] = {0x4E0,0x4E3,0x5E8,0x540};
//使能相关时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟
//初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12
//引脚复用映射配置
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11复用为CAN1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN1
//CAN单元设置
CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式
CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理
CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
CAN_InitStructure.CAN_NART=ENABLE; //禁止报文自动传送
CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的
CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由报文标识符决定
CAN_InitStructure.CAN_Mode= CAN_Mode_Normal; //模式设置
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=CAN_BS1_7tq; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;//Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=6; //分频系数(Fdiv)为brp+1
CAN_Init(CAN1, &CAN_InitStructure); // 初始化CAN1
//配置过滤器
CAN_FilterInitStructure1.CAN_FilterNumber=0; //过滤器0
CAN_FilterInitStructure1.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure1.CAN_FilterScale=CAN_FilterScale_32bit; //32位
CAN_FilterInitStructure1.CAN_FilterIdHigh=filter_data1[0] << 5;////32位ID
CAN_FilterInitStructure1.CAN_FilterIdLow=0x0000;
mask =0xff0; //
CAN_FilterInitStructure1.CAN_FilterMaskIdHigh= (mask << 5);//32位MASK
CAN_FilterInitStructure1.CAN_FilterMaskIdLow=0x0000 | 0x02;
CAN_FilterInitStructure1.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure1.CAN_FilterActivation=ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure1);//滤波器初始化
//配置过滤器
CAN_FilterInitStructure2.CAN_FilterNumber=1; //过滤器1
CAN_FilterInitStructure2.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure2.CAN_FilterScale=CAN_FilterScale_32bit; //32位
CAN_FilterInitStructure2.CAN_FilterIdHigh=filter_data2[0] << 5;////32位ID
CAN_FilterInitStructure2.CAN_FilterIdLow=0x0000;
mask =0xff0; //
CAN_FilterInitStructure2.CAN_FilterMaskIdHigh= (mask << 5);//32位MASK
CAN_FilterInitStructure2.CAN_FilterMaskIdLow=0x0000 | 0x02;
CAN_FilterInitStructure2.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure2.CAN_FilterActivation=ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure2);//滤波器初始化
//配置过滤器
CAN_FilterInitStructure3.CAN_FilterNumber=2; //过滤器2
CAN_FilterInitStructure3.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure3.CAN_FilterScale=CAN_FilterScale_32bit; //32位
CAN_FilterInitStructure3.CAN_FilterIdHigh=filter_data3[0] << 5;////32位ID
CAN_FilterInitStructure3.CAN_FilterIdLow=0x0000;
mask =0xff0; //
CAN_FilterInitStructure3.CAN_FilterMaskIdHigh= (mask << 5);//32位MASK
CAN_FilterInitStructure3.CAN_FilterMaskIdLow=0x0000 | 0x02;
CAN_FilterInitStructure3.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure3.CAN_FilterActivation=ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure3);//滤波器初始化
//配置过滤器
CAN_FilterInitStructure4.CAN_FilterNumber=3; //过滤器3
CAN_FilterInitStructure4.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure4.CAN_FilterScale=CAN_FilterScale_32bit; //32位
CAN_FilterInitStructure4.CAN_FilterIdHigh=filter_data4[0] << 5;////32位ID
CAN_FilterInitStructure4.CAN_FilterIdLow=0x0000;
mask =0xff0; //
CAN_FilterInitStructure4.CAN_FilterMaskIdHigh= (mask << 5);//32位MASK
CAN_FilterInitStructure4.CAN_FilterMaskIdLow=0x0000 | 0x02;
CAN_FilterInitStructure4.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure4.CAN_FilterActivation=ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure4);//滤波器初始化
//
//配置过滤器
CAN_FilterInitStructure5.CAN_FilterNumber=4; //过滤器4
CAN_FilterInitStructure5.CAN_FilterMode=CAN_FilterMode_IdList;
CAN_FilterInitStructure5.CAN_FilterScale=CAN_FilterScale_16bit; //32位
CAN_FilterInitStructure5.CAN_FilterIdHigh=filter_data5[0] << 5;////32位ID
CAN_FilterInitStructure5.CAN_FilterIdLow=0x0000 | CAN_ID_STD;
CAN_FilterInitStructure5.CAN_FilterMaskIdHigh= (filter_data5[2] << 5);//32位MASK
CAN_FilterInitStructure5.CAN_FilterMaskIdLow=0x0000 | CAN_ID_STD;
CAN_FilterInitStructure5.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure5.CAN_FilterActivation=ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure5);//滤波器初始化
//配置过滤器
CAN_FilterInitStructure6.CAN_FilterNumber=5; //过滤器5 只要过滤器组大于4,次滤波器组就没有作用了 ?????????????
CAN_FilterInitStructure6.CAN_FilterMode=CAN_FilterMode_IdList;
CAN_FilterInitStructure6.CAN_FilterScale=CAN_FilterScale_32bit; //32位
CAN_FilterInitStructure6.CAN_FilterIdHigh=filter_data5[2] << 5;////32位ID
CAN_FilterInitStructure6.CAN_FilterIdLow=0x0000 | CAN_ID_STD;
CAN_FilterInitStructure6.CAN_FilterMaskIdHigh= (filter_data5[3] << 5);//32位MASK
CAN_FilterInitStructure6.CAN_FilterMaskIdLow=0x0000 | CAN_ID_STD;
CAN_FilterInitStructure6.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure6.CAN_FilterActivation=ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure6);//滤波器初始化
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 主优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 次优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
一周热门 更多>