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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版