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

STM32F107 CAN

[复制链接]
雪落祁连 发布时间:2015-3-26 10:46
调试STM32F103 与 STM32F407两个板子互相通信都通过了,500k波特率都没什么问题,可以在STM32F107Vc上面就是不能正确设置波特率。
波特率配置代码如下:



//CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_7tq, 1, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps
                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_3tq, 6, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps
                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq, 8, mode);        // 普通模式初始化,普通模式,波特率500Kbps
                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_3tq, CAN_BS1_2tq, 12, mode);//500k
                        CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_1tq, CAN_BS1_4tq, 24, mode);                //36m 1000k
几个都试了,就是不行示波器测量有波形,但与407,103发同样数据,数据周期都不一样。


初始化函数:
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{

        GPIO_InitTypeDef GPIO_InitStructure;
        CAN_InitTypeDef        CAN_InitStructure;
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN1_RX0_INT_ENABLE
           NVIC_InitTypeDef  NVIC_InitStructure;
#endif
        //使能相关时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTA时钟                                                                                                                    

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟       

        //初始化GPIO
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
        GPIO_Init(GPIOB, &GPIO_InitStructure);                //初始化PB8

        /* Configure CAN pin: TX */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
          GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE );//重影射CAN IO脚到 PB8,PB9       

        //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= mode;         //模式设置
        CAN_InitStructure.CAN_SJW=tsjw;                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
        CAN_InitStructure.CAN_BS1=tbs1;         //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
        CAN_InitStructure.CAN_BS2=tbs2;                //Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq
        CAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1       
        CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1

        //配置过滤器
        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 = 0;        //过滤器0关联到FIFO0
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                                 //激活过滤器0
        CAN_FilterInit(&CAN_FilterInitStructure);                                                        //滤波器初始化
               
#if CAN1_RX0_INT_ENABLE
       
        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    

        NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
#endif
        return 0;
}

收藏 评论5 发布时间:2015-3-26 10:46

举报

5个回答
雪落祁连 回答时间:2015-3-26 10:50:42
补充问一下波特率计算公式:APB CLK /(CAN_SJW + CAN_BS1 + CAN_BS2)/CAN_Prescaler这个公式对于
STM32F103时APB CLK = 36M
对于STM32F107是多少
雪落祁连 回答时间:2015-3-26 10:52:20
两个板子103的板子CANL与CANH电压差有数据时是2.0V
另一个107的板子电压差是1.0V,怎么会事?
bit 回答时间:2015-3-26 14:11:15
1V是不对的
雪落祁连 回答时间:2015-3-30 12:09:11
问题解决了,应该是时钟设计的问题,应用D:\Keil\ARM\Boards\Keil\MCBSTM32C\RL\CAN
keil自带的例程中系统时钟配置文件应该OK了,
注明STM32F103时APB CLK = 42M,怎么配置的没看明白,待有时间的了仔细再看看。
APB CLK = 42M

CAN1_Mode_Init(CAN_SJW_4tq, CAN_BS2_5tq, CAN_BS1_12tq, 4, mode);
yangquandan 回答时间:2020-6-20 17:19:17
楼主你好,我想问你103和107VCT6的时钟是不是不一样

所属标签

相似分享

官网相关资源

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