stm32的时钟和can波特率的奇怪现象

2019-03-23 19:23发布

我用103开发一个can程序,板子上的晶振为16M,时钟配置用的是官方程序SystemInit(),也宏定义了SYSCLK_FREQ_72MHz,理论上系统时钟应该是72M,但实际上我查看SYSCLK寄存器,时钟为36M,此为怪事一;然后如果系统时钟是36M,那么我配置的波特率计算出来应该为125k,运行时在keil里查看can的控制面板,波特率也的确为125k,但实际上出来的波特率却为250k,与can分析仪用250k的速率可以正常通信。大家可以帮我想想问题所在么? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
字字宫商
1楼-- · 2019-03-24 01:53
/ 后来我自己写了个时钟配置程序,结果查看SYSCLK为72M,can波特率的配置按理论是125k,但实际上与分析仪要用250k才能通信,而且通信过程会出现丢失帧id的现象。代码如下:
============================
HSEStartUpStatus = RCC_WaitForHSEStartUp();
        //如果外部晶振启动成功,则进行下一步操作
        if (HSEStartUpStatus==SUCCESS)
        {
                //设置HCLK(AHB时钟)
                RCC_HCLKConfig(RCC_SYSCLK_Div2);

                //PCLK1(APB1) = HCLK/2
                RCC_PCLK1Config(RCC_HCLK_Div2);

                //PCLK2(APB2) = HCLK
                RCC_PCLK2Config(RCC_HCLK_Div2);         //         RCC_HCLK_Div1

                //FLASH时序控制
                //推荐值:SYSCLK = 0~24MHz   Latency=0
                //        SYSCLK = 24~48MHz  Latency=1
                //        SYSCLK = 48~72MHz  Latency=2
                FLASH_SetLatency(FLASH_Latency_2);
                //开启FLASH预取指功能
                FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

                //PLL设置 (最大72MHz?)
               RCC_PLLConfig(0x00010000, RCC_PLLMul_9);
                          //  RCC_PLLConfig(0x00000000, RCC_PLLMul_9);
                //启动PLL
                RCC_PLLCmd(ENABLE);
                //等待PLL稳定
                while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
                //系统时钟SYSCLK来自PLL输出
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
                //切换时钟后等待系统时钟稳定
                while (RCC_GetSYSCLKSource()!=0x08);
damiaa
2楼-- · 2019-03-24 05:29
 精彩回答 2  元偷偷看……
wanghlady
3楼-- · 2019-03-24 05:36
这个问题解决了么

一周热门 更多>