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

STM32F103 内部HSI 倍频到64M的问题,样机,急~

[复制链接]
下弦月-339376 提问时间:2017-3-20 23:19 /
大家好,我在设计初期的时候,用的最小核心板调试程序的。样板上有8M外部晶体。但我一直用的HSI。最终产品上因为PCB尺寸原因,没有放置外部8M晶体。

但现在第一批样机回来后,我“惊喜”的发现,用内部HSI,时钟无法倍频到64M,PLL配置参数 RCC_PLLMul_12,正常,一旦大于等于 RCC_PLLMul_13,执行后程序就会进入 硬件故障中断 HardFault_Handler() 。

但程序之前在最小核心板上是调试通过的,然后我试着把最小核心板上的外部晶体拆掉,果然,程序也不能正常运行了。。。

那么,这就是说,如果没有外部晶体。即使我用的是HSI,那也是无法倍频至64M的。。。这他么的就尴尬了啊。。。咋办呢


求助各位大神,如果我外部不接8M晶体,难道内部HSI就无法倍频至64M吗,手册上可没说啊,要怎么解决呢?多谢多谢。。。很急。。。

感觉要坑死我的节奏了。。。再次感谢大伙帮忙看看!


时钟配置,倍数不能大于12

时钟配置,倍数不能大于12

主函数

主函数
收藏 1 评论16 发布时间:2017-3-20 23:19

举报

16个回答
xmshao 回答时间:2017-3-22 15:32:43
本帖最后由 xmshao 于 2017-3-22 15:45 编辑

像你这种情况,建议你检查2点:
1、芯片电源管脚一个个检查,不要有漏网之鱼。非常重要!
2、检查那个预取配置的代码,是不是没有正确配置。你可以在你配置时钟之前加上这几句。
/* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;
    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;   

不过从你描述的情况,问题很可能在第2点。

MrJiu 回答时间:2017-3-21 09:43:33
是你自己坑死你,不是芯片坑死你!!!!很简单...看一下手册芯片时钟介绍,然后用寄存器配置一下不就得了!!!人啊,就是懒,如其这么急不可耐,还不如看一下时钟介绍部分,花一点时间,就搞定了!!!!!
wenyangzeng 回答时间:2017-3-21 11:12:50
好像可以呀:
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }

    /**Configure the Systick interrupt time
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
无标题.png
zhulikai 回答时间:2017-3-21 08:29:05
只能帮顶啦
阿莫西林 回答时间:2017-3-21 09:29:02
加油
废鱼 回答时间:2017-3-21 10:55:47
应该是时钟配置的问题,自己算一下实际的结果。不行就用STM32CubeMX配置一下。
七哥 回答时间:2017-3-21 11:07:32
时钟配置有问题。首先看一下用户手册中的时钟树,然后对照寄存器设置一下。内部时钟是试过的
下弦月-339376 回答时间:2017-3-21 18:38:16
MrJiu 发表于 2017-3-21 09:43
是你自己坑死你,不是芯片坑死你!!!!很简单...看一下手册芯片时钟介绍,然后用寄存器配置一下不就得了 ...

非常感谢版主的指教,因为我之前一直用的库函数(3.5)开发,对STM32的底层寄存器不是很熟悉。
然后恳请版主再提示一下可能是哪里的问题?如下图:

之所以开始觉得我程序没问题是因为,外部晶体的有 无、会影响程序的正确性。但是我觉得不应该跟外部晶体有关系。所以我才冒然的说可能是芯片坑了我。。。请见谅。。。

如图,难道这个倍频数不一样,程序要做响应修改吗

如图,难道这个倍频数不一样,程序要做响应修改吗
下弦月-339376 回答时间:2017-3-21 18:47:12
wenyangzeng 发表于 2017-3-21 11:12
好像可以呀:
void SystemClock_Config(void)
{

非常感谢!你这个我暂时还没法试,我是用的之前的固件(3.5)库开发的。然后恳请,如果你方便的话,可否在你的板子上实际测试一下?

因为我这现在情况是,如果有外部8M晶体的存在,内部HSI就可以倍频至64M,如果拆掉外部8M晶体,HSI就不能倍频至64M,但小于等于48M(即:RCC_CFGR_PLLMULL12)是可以的。大于48(即:RCC_CFGR_PLLMULL13)就进 硬件故障中断。
wenyangzeng 回答时间:2017-3-21 20:34:45
下弦月-339376 发表于 2017-3-21 18:47
非常感谢!你这个我暂时还没法试,我是用的之前的固件(3.5)库开发的。然后恳请,如果你方便的话,可否在 ...

你用那个13要倍频到64恐怕无法整倍数。
应该把HSI的8MHZ先2分频,再16倍频,才能达到刚好64MHZ。
下弦月-339376 回答时间:2017-3-21 23:09:52
wenyangzeng 发表于 2017-3-21 20:34
你用那个13要倍频到64恐怕无法整倍数。
应该把HSI的8MHZ先2分频,再16倍频,才能达到刚好64MHZ。 ...

是的,要64M是要 16倍的。而且用内部HSI,也必须先2分频 再倍频的。我现在问题是,一旦倍频数大于等于13,就会进硬件故障中断。最终目的是要 8 / 2 *16 = 64
zbber 回答时间:2017-3-22 12:20:02
好像可以呀:
下弦月-339376 回答时间:2017-3-24 09:41:26
xmshao 发表于 2017-3-22 15:32
像你这种情况,建议你检查2点:
1、芯片电源管脚一个个检查,不要有漏网之鱼。非常重要!
2、检查那个预取 ...

前两天比较忙,没顾得上试,我用你的方法可以了,非常感谢!!! 具体为啥我在自行补课吧,哈哈……
下弦月-339376 回答时间:2017-3-24 10:24:17
英文版手册有讲,中文版的阉割掉了。。。
但我还是不太清楚,为什么我没有用外部8M晶体,
但焊上,HSI直接倍频64M就没问题,拆掉,就进hardfault中断。。。必须配置等待周期为2就正常。

难道会自动判断外部晶体有无,自动设置 FLASH_ACR ? 唉。。。看来我还是道行太浅啊。。。

FLASH_ACR寄存器

FLASH_ACR寄存器
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版