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

关于stm32F105 can波特率配置问题

[复制链接]
wdjz 提问时间:2017-4-7 17:43 /
研究stm32的双can有段时间了 一直有个问题一直没搞定,我初始化设置成500K,当 can总线上为500K时程序不会自动配置成相同的波特率.当总线上为125K是就会自动配置成125K       请大神们看看要怎么弄,
以下是我的部分代码:
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "can.h"


int main(void)
{            
    Bsp_Init();
         
  while(1)
        {
            
        c1Sendc2Data();
        c2Sendc1Data();
            
            if (CAN_MessagePending(CAN1,CAN_FIFO0)==0) 检测有没有报文 没有就配置成125K
            {
        CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_16tq,CAN_BS2_1tq,8,CAN_Mode_Normal);
            Delay(1);
              }
        IWDG_ReloadCounter();
         }
}


void Bsp_Init(void)
{
  Delay_Init();
    Delay(3);                      //ÑÓʱ3Ãë  µÈ´ýµçÔ´ÉϵçÎȶ¨ºó µ¥Æ¬»úÔÙÕý³£¹¤×÷¡£
  LED_Init();
  BEEP_Init();
    KEY_Init();
  SFQpw=1;
    LED=1;
    BEEP=1;
    SFQout=1;
    SFQin=1;
//    USART_Configuration();
    CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_16tq,CAN_BS2_1tq,4,CAN_Mode_Normal);    这里初始化设置can波特率设为500K
//    NVIC_Configuration();
//    CAN_Filter_config();
//        IWDG ...
    IWDG_Configuration();

}



收藏 2 评论8 发布时间:2017-4-7 17:43

举报

8个回答
alisa123 回答时间:2017-6-6 08:38:23
没有用过can,不懂帮顶!
yklstudent-1794 回答时间:2017-6-6 09:02:08
设置什么就是什么吧,这个CAN比特率还会可以自动?
无薪税绵 回答时间:2017-6-6 09:59:10
你把 配置成125K的代码改为 500K 不行吗?
ataudio 回答时间:2017-6-6 10:50:56
没弄过。不明觉厉。
15616384352 回答时间:2017-6-6 11:04:35
帮顶
huaiqiao 回答时间:2017-6-6 21:36:19
配置成多大的,这个要靠CAN初始化的这几个参数计算的。125k这个是算出来的,这个你不懂的话,去看正点原子怎么教你计算的。

如果检测不到,报文然后配置成125k。这个完全是由程序控制啊。

评分

参与人数 1ST金币 +3 收起 理由
zero99 + 3

查看全部评分

赵工123 回答时间:2017-9-5 16:36:54
贴上源程序:
  GPIO_InitTypeDef       GPIO_InitStructure;
  CAN_InitTypeDef        CAN_InitStructure;
//  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
        NVIC_InitTypeDef        NVIC_InitStructure;

    /* 打开GPIO时钟、AFIO时钟,CAN时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);


        /* CAN1 RX PB8 */
        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);
        /* CAN1 TX PB9 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        //使用PA8 9引脚的第二功能
        GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);  // CAN1 remap

    /* CAN1 Enabling interrupt */                                                                          
    NVIC_InitStructure.NVIC_IRQChannel=CAN1_RX0_IRQn;
                //STM32有2个3级深度的接收缓冲区:FIFO0和FIFO1
                //如果是来自FIFO0的接收中断,则用CAN1_RX0_IRQn中断来处理。
                //与这个 对应  CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);  // 启动 CAN1_RX0_IRQn
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);                                                                       
                                                                 
    /* CAN  BaudRate = RCC_APB1PeriphClock/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler */
        CAN_DeInit(CAN1);
    CAN_StructInit(&CAN_InitStructure);   

    CAN_InitStructure.CAN_TTCM=DISABLE;
    CAN_InitStructure.CAN_ABOM=ENABLE;//ABOM 自动离线管理
    CAN_InitStructure.CAN_AWUM=DISABLE;
    CAN_InitStructure.CAN_NART=DISABLE;
    CAN_InitStructure.CAN_RFLM=DISABLE;
    CAN_InitStructure.CAN_TXFP=DISABLE;
    CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;   
        //CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
//        #define    SET_CAN_SJW   CAN_SJW_1tq
//#define    SET_CAN_BS1   CAN_BS1_4tq        // 8
//#define    SET_CAN_BS2   CAN_BS2_4tq        // 7
    CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
    CAN_InitStructure.CAN_BS1=CAN_BS1_4tq;  
    CAN_InitStructure.CAN_BS2=CAN_BS2_4tq;       
                //#define    SET_CAN_PRES  8                                // 波特率分频器 9-250K 18-125K
    //CAN_InitStructure.CAN_Prescaler=pres;
                //CAN波特率  BaudRate = 36MHz/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler
    //CAN波特率  BaudRate = 4MHz/CAN_Prescaler
        switch(BRtXK)//通信速度:1000K,500K,250K,125K,100K,50K,20K,10K,5K_//11C14:10K_5K不行,1768_5K不行
        {
//uQuantumPrescaler为 6bit 所以应该<63
                case 1000:
                  CAN_InitStructure.CAN_Prescaler=4;   //4000K/4
                break;
                case 500:
                  CAN_InitStructure.CAN_Prescaler=8;   //4000k/8
                break;
                case 250:
                  CAN_InitStructure.CAN_Prescaler=16;   //4000k/16
                break;
                case 125:
                  CAN_InitStructure.CAN_Prescaler=32;  //4000k/32
                break;
                case 100:
                  CAN_InitStructure.CAN_Prescaler=40;  //4000k/40
                break;
                case 50:
                  CAN_InitStructure.CAN_Prescaler=80;  //4000k/80
                break;
                case 20:
                  CAN_InitStructure.CAN_Prescaler=200; //4000k/200
                break;
                case 10:               
                  CAN_InitStructure.CAN_Prescaler=400; //4000k/400
       
                break;
                case 5:               
                  CAN_InitStructure.CAN_Prescaler=800; //4000k/800
       
                break;               
               
               
//                uQuantumPrescaler=80;  //1768无 CANBAUD_25k
//                uQuantumPrescaler=800; //1768无 CANBAUD_2k5  
        }   

    CAN_Init(CAN1,&CAN_InitStructure);        // CAN1                                                                                       



    CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);  // 启动 CAN1_RX0_IRQn

冗余双CAN现场总线STM32F105开发板KeilC++源程序
https://www.stmcu.org.cn/module/forum/thread-612916-1-1.html

任风吹吹 回答时间:2017-9-6 17:32:53
看来你还没有弄懂CAN波特率是怎么计算出来的:
1> 首先你得知道的所使用到的CAN控制器外设挂载的APB总线频率多少?APB1/APB2?多少M??  30M?
2> CAN预分频系数,即CAN_Prescaler值多少?假如是4,那么到CAN控制器外设的实际时钟频率则为30M/4=7.5M=7500 000bps
3> 再看CAN_BS1,CAN_BS2参数,假如BS1=6,BS2=8,那么CAN最终的波特率为7.5M/(6+8+1)=7500000/15=500000bps=500Kbps
就是这么来的

楼主代码参数BS1=16,BS2=1,SJW=1,但是实际到达CAN控制的时钟频率多少并不知道,。。因此我也无法判断你是否设置正确。SJW一般固定为1。

所属标签

相似问题

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