OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5422|回复: 10

请问硬件debug时如何查看系统时钟和CAN时钟,用于设置CAN的通讯波特率

[复制链接]

2

主题

17

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-3-13
在线时间
12 小时
发表于 2016-5-19 13:25:08 | 显示全部楼层 |阅读模式
30金钱
高手你们好,请问在程序里或硬件debug时如何查看系统时钟和CAN时钟,用于设置CAN的通讯波特率。目前此程序里没有单独编写时钟配置程序。

最佳答案

查看完整内容[请看2#楼]

没用过can总线和keil5,debug的话,keil4是在peripheral里的power reset里面,最下面可以看到sysclk,就可以看到系统时钟。如果用了system_stm32f10x.c这个文件的话,单片机会在启动文件中将时钟初始化为72M,感觉can总线的时钟应该在peripheral会有的,如果实在没有,至少会有寄存器配置,根据寄存器的值换算一下也可以。 至于can总线的时钟配置,根据时钟框图来吧,然后看下can总线的寄存器,这个没有做过,无法帮到楼主了。 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-5-19 13:25:09 | 显示全部楼层
本帖最后由 东北小辉辉 于 2016-5-19 16:41 编辑

没用过can总线和keil5,debug的话,keil4是在peripheral里的power reset里面,最下面可以看到sysclk,就可以看到系统时钟。如果用了system_stm32f10x.c这个文件的话,单片机会在启动文件中将时钟初始化为72M,感觉can总线的时钟应该在peripheral会有的,如果实在没有,至少会有寄存器配置,根据寄存器的值换算一下也可以。

至于can总线的时钟配置,根据时钟框图来吧,然后看下can总线的寄存器,这个没有做过,无法帮到楼主了。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-5-19 13:37:35 | 显示全部楼层
在线等。。。。。
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-5-19 14:39:51 | 显示全部楼层
问题描述:板子是咱们原子的,但外部晶振改成16MHz,程序是从上一个同事留下的,用原来CAN转usb的可以通讯,但最近买的那个CAN转usb的模块通讯速率非常低无法通讯,只能在程序里更改通讯速率,但目前不清楚程序里CAN的时钟,请问如何获取CAN时钟?谢谢了
回复

使用道具 举报

0

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2016-3-17
在线时间
95 小时
发表于 2016-5-19 15:06:07 | 显示全部楼层
//设置波特率
//Fpclk1的时钟在初始化的时候设置为36M
//则波特率为:36M/((1+8+9)*4)=500Kbps
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;                                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq         CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
        CAN_InitStructure.CAN_BS1=CAN_BS2_8tq;                         //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq
        CAN_InitStructure.CAN_BS2=CAN_BS1_9tq;                                //Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~        CAN_BS2_8tq
        CAN_InitStructure.CAN_Prescaler=4;        //分频系数(Fdiv)为brp+1       
        CAN_Init(CAN1, &CAN_InitStructure);                //初始化CAN1
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-5-19 15:26:29 | 显示全部楼层
slsdz 发表于 2016-5-19 15:06
//设置波特率
//Fpclk1的时钟在初始化的时候设置为36M
//则波特率为:36M/((1+8+9)*4)=500Kbps

谢谢了,无法通讯,有可能CAN时钟不是36M吗?在哪能查到CAN时钟
回复

使用道具 举报

0

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2016-3-17
在线时间
95 小时
发表于 2016-5-19 15:29:10 | 显示全部楼层
标配是外接8Mhz,内部9倍频
你看看SetSysClockTo72的倍频设置吧,超频不稳定,对CAN也没有意义
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-5-19 15:55:27 | 显示全部楼层
slsdz 发表于 2016-5-19 15:29
标配是外接8Mhz,内部9倍频
你看看SetSysClockTo72的倍频设置吧,超频不稳定,对CAN也没有意义

static void SetSysClock(void)
{
/******************************************************************************/
/*            PLL (clocked by HSE) used as System clock source                */
/******************************************************************************/
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* Enable HSE */
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }

  if (HSEStatus == (uint32_t)0x01)
  {
    /* HCLK = SYSCLK / 1*/
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK / 2*/
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
   
    /* PCLK1 = HCLK / 4*/
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV1;

    /* Configure the main PLL */
    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

    /* Enable the main PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till the main PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_3WS;

    /* Select the main PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= RCC_CFGR_SW_PLL;

    /* Wait till the main PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }

}


你好,谢谢你的回复,程序里没有SetSysClockTo72函数,只有上面的函数,
/** @addtogroup STM32F2xx_System_Private_Variables
  * @{
  */

  uint32_t SystemCoreClock = 112000000;
这个是是系统时钟频率吗?还有/**
* @brief In the following line adjust the value of External High Speed oscillator (HSE)
   used in your application
   
   Tip: To avoid modifying this file each time you need to use different HSE, you
        can define the HSE value in your toolchain compiler preprocessor.
  */           
#define HSE_VALUE            ((uint32_t)16000000) /*!< Value of the External oscillator in Hz */
回复

使用道具 举报

0

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2016-3-17
在线时间
95 小时
发表于 2016-5-19 16:10:39 | 显示全部楼层
本帖最后由 slsdz 于 2016-5-19 16:25 编辑


你按56M试一下吧
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-5-19 17:46:09 | 显示全部楼层
slsdz 发表于 2016-5-19 16:10
你按56M试一下吧

不行,谢谢了!
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-3-13
在线时间
12 小时
 楼主| 发表于 2016-5-19 17:47:02 | 显示全部楼层
东北小辉辉 发表于 2016-5-19 16:39
没用过can总线和keil5,debug的话,keil4是在peripheral里的power reset里面,最下面可以看到sysclk,就可 ...

谢谢了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-8 23:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表