打印
[STM32F2]

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

[复制链接]
7074|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 | 只看该作者
不配置时钟,默认情况下能进主函数吗。

使用特权

评论回复
5
_dyx_|  楼主 | 2015-7-14 08:03 | 只看该作者
luofeng2g 发表于 2015-7-13 17:35
如果软件没问题,最简单的换个片子试试!!

恩 我今天打算 重新焊个板子 再试试!全新元件

使用特权

评论回复
6
_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);
  }

}


然后就死在了  最下面这行!

使用特权

评论回复
7
airwill| | 2015-7-14 08:16 | 只看该作者
HSEStatus 是表征软件测到的振荡器工作状态的.

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

使用特权

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

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

感谢您的 解答  为了排除硬件问题 我又做了两个板子 试试   晶振电容我用的是30p的 示波器测也是正常波形的。  一小时后 可大概知道硬件是否有问题~我发个原理图 帮我看下对不对

使用特权

评论回复
9
_dyx_|  楼主 | 2015-7-14 09:57 | 只看该作者
原理图

使用特权

评论回复
10
lgq1542380129| | 2015-7-14 10:22 | 只看该作者
用库函数写的,没有遇到这种情况。楼主看看晶振引脚的电压,是不是1.65V左右。是的话,晶振起振了。如果还是死在哪个地方,楼主跟踪一下。看看是不是那些函数没有调用。

使用特权

评论回复
11
_dyx_|  楼主 | 2015-7-14 10:27 | 只看该作者
lgq1542380129 发表于 2015-7-14 10:22
用库函数写的,没有遇到这种情况。楼主看看晶振引脚的电压,是不是1.65V左右。是的话,晶振起振了。如果还 ...

我按照你说的了 测了下电压  一端1.68 一端1.72  应该是正常的
哎 刚做两个板子 还是一样情况 不启动  但是 滴答时钟 是好的, 中断也是好的!

使用特权

评论回复
12
lgq1542380129| | 2015-7-14 10:33 | 只看该作者
_dyx_ 发表于 2015-7-14 10:27
我按照你说的了 测了下电压  一端1.68 一端1.72  应该是正常的
哎 刚做两个板子 还是一样情况 不启动  但 ...

滴答时钟,您所指的不启动,是死在哪里了吗?

使用特权

评论回复
13
_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));

使用特权

评论回复
14
songchenping| | 2015-7-14 11:10 | 只看该作者
你可以随便下载一个示例代码跑一下,来检验一下。排除软件的问题。

使用特权

评论回复
15
songchenping| | 2015-7-14 11:10 | 只看该作者
你可以随便下载一个示例代码跑一下,来检验一下。排除软件的问题。

使用特权

评论回复
16
grant_jx| | 2015-7-14 11:30 | 只看该作者
你去死等失败标志,肯定挂了。

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

晶振不能随便找一个,最好能有数据手册,看看它是否符合MCU的时钟部分的电器参数。

使用特权

评论回复
17
_dyx_|  楼主 | 2015-7-14 11:38 | 只看该作者
songchenping 发表于 2015-7-14 11:10
你可以随便下载一个示例代码跑一下,来检验一下。排除软件的问题。

我用了 库里的 外部中断实例代码,工程需要自己建立! 还是一样问题,我改成内部时钟HSI以后 就可以进入主函数! 不知道外部为什么不行

使用特权

评论回复
18
_dyx_|  楼主 | 2015-7-14 11:41 | 只看该作者
grant_jx 发表于 2015-7-14 11:30
你去死等失败标志,肯定挂了。

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

多谢您的讲解,我加while(1);只是调试的 看是不是每次都死在那里,确定后 我还是把那个去了。。
至于你下面说的  我得去研究下,再试试,还不太会~

使用特权

评论回复
19
grant_jx| | 2015-7-14 11:46 | 只看该作者
别去信ST的demo,这个Demo只是演示一个操作时钟切换的操作,他的操作不严谨,我的很多客户都栽在上面,正确的做法应该是加上超时等待来判断。因为你无法保证你去处的产品,晶振一定不会坏,测试的时候正常,不表示实际场合不出意外。

使用特权

评论回复
20
songchenping| | 2015-7-14 12:24 | 只看该作者
_dyx_ 发表于 2015-7-14 11:38
我用了 库里的 外部中断实例代码,工程需要自己建立! 还是一样问题,我改成内部时钟HSI以后 就可以进入 ...

你可以找个Discovery或者nucleo的代码直接跑。不需要建立工程的。这样就避免了软件故障啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

32

帖子

0

粉丝