本次调试使用的是珠海鼎芯科技(D-Chip)的STM32核心板。这块核心板上包含了一个CAN总线驱动器。可以很方便的同时与多个种工业设备连接通讯。
STM32处理器的CAN总线有多种工作模式,本次测试的是正常模式。要在正常模式下使用首先需要初始化寄存器和使能相关的功能部件。
第一步是初始化GPIO和时钟,STM32F103C的CAN总线GPIO是GPIOA_PIN_11和GPIOA_PIN_12。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//使能PORTA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
//使能CAN1时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化IOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化IO
配置完GPIO后,需要配置的是CAN总线 【STM32的CAN总线使用】
//CAN单元设置
CAN_InitStructure.CAN_TTCM=DISABLE;
//非时间触发通信模式
CAN_InitStructure.CAN_ABOM=ENABLE;
//软件自动离线管理
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= mode;
//模式设置: mode:0,普通模式;
1,回环模式;
//设置波特率
CAN_InitStructure.CAN_SJW=tsjw;
//重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位
CAN_InitStructure.CAN_BS1=tbs1;
//Tbs1=tbs1+1个时间单位
CAN_InitStructure.CAN_BS2=tbs2;
//Tbs2=tbs2+1个时间单位
CAN_InitStructure.CAN_Prescaler=brp;
//分频系数(Fdiv)为brp+1
CAN_Init(CAN1, &CAN_InitStructure);
//初始化CAN1
CAN总线还需要配置接收ID和过滤器
CAN_FilterInitStructure.CAN_FilterNumber=0;
//过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
//屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
//32位宽
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
//32位ID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
//32位MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
//过滤器0关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
//激活过滤器0CAN_FilterInit(&CAN_FilterInitStructure);
//滤波器初始化
最后是设置CAN中断服务
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
//FIFO0消息挂号中断允许.NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// 主优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
// 次优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
本人测试1Mhz的速度通信没问题。而且开了自动离线管理短接CAN总线两脚也不会卡死的。
推荐阅读
- 开源OpenSDA烧写CMSIS-DAP
- LinkMap|LinkMap分析
- linux内核编程|4章
- js|vue调试工具vue-devtools安装及使用
- 调试
- activemq|调试activemq源码