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

关于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 回答时间:2017-6-6 09:02:08
设置什么就是什么吧,这个CAN比特率还会可以自动?
无薪税绵 回答时间:2017-6-6 09:59:10
你把 配置成125K的代码改为 500K 不行吗?
ataudio 回答时间:2017-6-6 10:50:56
没弄过。不明觉厉。
群星闪烁 回答时间: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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版