你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

F407 CAN2调试

[复制链接]
chiaw 发布时间:2016-12-13 11:01

2016年4月20日
14:03
1.实验过程:将正点原子的STM32F4开发板上的CAN1的例子改为CAN2的例子后,发现CAN不太正常:
1)CAN发送数据不正常(数据错误);
2)CAN不能进入接收中断

2.处理方法:上网收索,在论坛上查找了一下解决办法如下:
1)将CAN_FilterInitStructure.CAN_FilterNumber=14;          //过滤器14;
2)RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1| RCC_APB1Periph_CAN2, ENABLE);//同时使能CAN1时钟和CAN2时钟;

更改完成后,发送和接受都正常。
附初始化源码:
void InitCan(void)
{
        NVIC_InitTypeDef  NVIC_InitStructure;
          GPIO_InitTypeDef GPIO_InitStructure;
        CAN_InitTypeDef        CAN_InitStructure;
          CAN_FilterInitTypeDef  CAN_FilterInitStructure;
       
        /*NVIC CONFIG*/
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;//
       
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
    //使能相关时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能PORTA时钟                                                                                                                    

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 | RCC_APB1Periph_CAN2, ENABLE);//使能CAN1时钟       
       
    //初始化GPIO
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6;
    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_NOPULL;//上拉
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PB5,PB6
       
          //引脚复用映射配置
         GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_CAN2); //GPIOB5复用为CAN2
         GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_CAN2); //GPIOB5复用为CAN2
          
          //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(CAN2, &CAN_InitStructure);                           // 初始化CAN1
                                                                                                        //500K-----> CAN_SJW_1tq+CAN_BS1_7tq+CAN_BS2_6tq   +6
       
        //配置过滤器
        CAN_FilterInitStructure.CAN_FilterNumber=14;          //过滤器14
          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; //激活过滤器0
       
          CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
       
        CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.
       

                    
  
//          NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
//          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;     // 主优先级为3
//          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
//          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//          NVIC_Init(&NVIC_InitStructure);


}   



收藏 评论1 发布时间:2016-12-13 11:01

举报

1个回答
leo121_3006061 回答时间:2016-12-13 12:35:57
谢谢分享,赞一个

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版