[STM32F2] 各位高人 求解 HSE 不启动问题???

[复制链接]
9062|40
 楼主| _dyx_ 发表于 2015-7-13 17:27 | 显示全部楼层 |阅读模式
我做了个板子stm32f205rbt6  8M晶振  上电后中断功能正常  但是不进入主函数main()
经调试 发现是 HSE 不启动 一直启动不成功 求解!!!
 楼主| _dyx_ 发表于 2015-7-13 17:29 | 显示全部楼层
搞了2天了  元件一直补焊多次  8M晶振正常  小弟苦恼。。。
luofeng2g 发表于 2015-7-13 17:35 | 显示全部楼层
_dyx_ 发表于 2015-7-13 17:29
搞了2天了  元件一直补焊多次  8M晶振正常  小弟苦恼。。。

如果软件没问题,最简单的换个片子试试!!
donsbin 发表于 2015-7-13 19:10 | 显示全部楼层
不配置时钟,默认情况下能进主函数吗。
 楼主| _dyx_ 发表于 2015-7-14 08:03 | 显示全部楼层
luofeng2g 发表于 2015-7-13 17:35
如果软件没问题,最简单的换个片子试试!!

恩 我今天打算 重新焊个板子 再试试!全新元件
 楼主| _dyx_ 发表于 2015-7-14 08:06 | 显示全部楼层
donsbin 发表于 2015-7-13 19:10
不配置时钟,默认情况下能进主函数吗。

感谢您的回复  我用的就是 系统默认的始终  代码如下:
/* 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_DIV4;

    /* 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 */
                 //while(1);
  }

}


然后就死在了  最下面这行!
airwill 发表于 2015-7-14 08:16 | 显示全部楼层
HSEStatus 是表征软件测到的振荡器工作状态的.

其实这种情况, 最常见的还是外部的问题. 晶振的质量问题, 还有匹配电容一个不要忽略了,
曾经有人错装了 0.1uF, 折腾了很久.

评论

多谢版主啦!!!0.1uf +1啊,我这边也是一直不起振,找了好长时间原因,看到你的说明就拿下起振电容量了一下,果然0.1uf……换成22pf的好了  发表于 2018-5-28 21:09
 楼主| _dyx_ 发表于 2015-7-14 09:53 | 显示全部楼层
airwill 发表于 2015-7-14 08:16
HSEStatus 是表征软件测到的振荡器工作状态的.

其实这种情况, 最常见的还是外部的问题. 晶振的质量问题,  ...

感谢您的 解答  为了排除硬件问题 我又做了两个板子 试试   晶振电容我用的是30p的 示波器测也是正常波形的。  一小时后 可大概知道硬件是否有问题~我发个原理图 帮我看下对不对
 楼主| _dyx_ 发表于 2015-7-14 09:57 | 显示全部楼层
原理图

外围电路

外围电路

lgq1542380129 发表于 2015-7-14 10:22 | 显示全部楼层
用库函数写的,没有遇到这种情况。楼主看看晶振引脚的电压,是不是1.65V左右。是的话,晶振起振了。如果还是死在哪个地方,楼主跟踪一下。看看是不是那些函数没有调用。
 楼主| _dyx_ 发表于 2015-7-14 10:27 | 显示全部楼层
lgq1542380129 发表于 2015-7-14 10:22
用库函数写的,没有遇到这种情况。楼主看看晶振引脚的电压,是不是1.65V左右。是的话,晶振起振了。如果还 ...

我按照你说的了 测了下电压  一端1.68 一端1.72  应该是正常的
哎 刚做两个板子 还是一样情况 不启动  但是 滴答时钟 是好的, 中断也是好的!
lgq1542380129 发表于 2015-7-14 10:33 | 显示全部楼层
_dyx_ 发表于 2015-7-14 10:27
我按照你说的了 测了下电压  一端1.68 一端1.72  应该是正常的
哎 刚做两个板子 还是一样情况 不启动  但 ...

滴答时钟,您所指的不启动,是死在哪里了吗?
 楼主| _dyx_ 发表于 2015-7-14 10:42 | 显示全部楼层
下面这句 如果 我要把 while(1);放进去 就死在了这里!  不知道如何解决
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 */
                 //while(1);
  }

而且我把下面这个 超时参数 HSE_STARTUP_TIMEOUT扩大10倍 也还是不行
do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

songchenping 发表于 2015-7-14 11:10 | 显示全部楼层
你可以随便下载一个示例代码跑一下,来检验一下。排除软件的问题。
songchenping 发表于 2015-7-14 11:10 | 显示全部楼层
你可以随便下载一个示例代码跑一下,来检验一下。排除软件的问题。
grant_jx 发表于 2015-7-14 11:30 | 显示全部楼层
你去死等失败标志,肯定挂了。

正常情况下,上电不切换时钟,HSI在跑,切完后去查询切换成功标志,你的代码还是在跑的。
这个时候用示波器去看OSC,使用波形的,如果切换成功,切不成功,先去检查比设置的PLL,别超过了限制,问题还是没解决,再去查硬件。

晶振不能随便找一个,最好能有数据手册,看看它是否符合MCU的时钟部分的电器参数。
 楼主| _dyx_ 发表于 2015-7-14 11:38 | 显示全部楼层
songchenping 发表于 2015-7-14 11:10
你可以随便下载一个示例代码跑一下,来检验一下。排除软件的问题。

我用了 库里的 外部中断实例代码,工程需要自己建立! 还是一样问题,我改成内部时钟HSI以后 就可以进入主函数! 不知道外部为什么不行
 楼主| _dyx_ 发表于 2015-7-14 11:41 | 显示全部楼层
grant_jx 发表于 2015-7-14 11:30
你去死等失败标志,肯定挂了。

正常情况下,上电不切换时钟,HSI在跑,切完后去查询切换成功标志,你的代 ...

多谢您的讲解,我加while(1);只是调试的 看是不是每次都死在那里,确定后 我还是把那个去了。。
至于你下面说的  我得去研究下,再试试,还不太会~
grant_jx 发表于 2015-7-14 11:46 | 显示全部楼层
别去信ST的demo,这个Demo只是演示一个操作时钟切换的操作,他的操作不严谨,我的很多客户都栽在上面,正确的做法应该是加上超时等待来判断。因为你无法保证你去处的产品,晶振一定不会坏,测试的时候正常,不表示实际场合不出意外。
songchenping 发表于 2015-7-14 12:24 | 显示全部楼层
_dyx_ 发表于 2015-7-14 11:38
我用了 库里的 外部中断实例代码,工程需要自己建立! 还是一样问题,我改成内部时钟HSI以后 就可以进入 ...

你可以找个Discovery或者nucleo的代码直接跑。不需要建立工程的。这样就避免了软件故障啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

32

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部