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

用STM32CubeMX V4.25配置L432KC时钟,TM1与实际相差5倍?

[复制链接]
板子粉丝 提问时间:2018-4-18 09:22 /
本帖最后由 板子粉丝 于 2018-4-18 09:25 编辑

第一次用STM32CubeMX,生成MDK工程,感觉很好。外接8MHZ晶振,生成80MHZ系统时钟,现在就是生成的定时时钟与实际有差误,比正常少5倍,比如80MHZ,实际检测下来系统时钟只有16MHZ。



理论:TIM1:在 Parameter Settings 页配置预分频系数为 79,计数周期(自动加载值)为 332,
                     定时器溢出频率就是 80MHz/(79+1)/(332+1) = 3.003KHz约3K。
实际:TIM1:在 Parameter Settings 页配置预分频系数为 15,计数周期(自动加载值)为 332,
                     定时器溢出频率就是 16MHz/(15+1)/(332+1) = 3.003KHz约3K。


TIM6与TIM1一样情况!
请求帮助,谢谢!

L432KC

L432KC

时钟树配置

时钟树配置

TM1

TM1

TM6

TM6
收藏 评论18 发布时间:2018-4-18 09:22

举报

18个回答
板子粉丝 回答时间:2018-4-19 14:38:06
经过今天的努力,发现是 PLL configuration register (RCC_PLLCFGR)寄存器HAL库配置不正确,我就做了一下修改
在main.c里
  /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 1;
  RCC_OscInitStruct.PLL.PLLN = 20;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
------------------------------------------------------------

在stm32l4xx_hal_rcc.h 里

#if defined(RCC_PLLP_DIV_2_31_SUPPORT)

#define __HAL_RCC_PLL_CONFIG(__PLLSOURCE__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__ ) \
                  (RCC -> PLLCFGR = (uint32_t)(((__PLLM__) - 1U) << 4U) | (uint32_t)((__PLLN__) << 8U) | \
                   (__PLLSOURCE__) | (uint32_t)((((__PLLQ__) >> 1U) - 1U) << 21U) | (uint32_t)((((__PLLR__) >> 1U) - 1U) << 25U) | \
                   (uint32_t)(((__PLLP__) >> 4U ) << 17U) | (uint32_t)(1 << 24U))
#else

#define __HAL_RCC_PLL_CONFIG(__PLLSOURCE__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__ ) \
                  (RCC -> PLLCFGR = (uint32_t)(((__PLLM__) - 1U) << 4U) | (uint32_t)((__PLLN__) << 8U) | \
                   (uint32_t)(((__PLLP__) >> 4U ) << 17U) | \
                   (__PLLSOURCE__) | (uint32_t)((((__PLLQ__) >> 1U) - 1U) << 21U) | (uint32_t)((((__PLLR__) >> 1U) - 1U) << 25U))

#endif /* RCC_PLLP_DIV_2_31_SUPPORT */


居然能用了

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 能用就好,那我结贴了

查看全部评分

板子粉丝 回答时间:2018-4-18 10:42:09
  /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLN = 20;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

发现其中 RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; 是不是要改为RCC_HSE_ON
这都是自动产生的代码
板子粉丝 回答时间:2018-4-18 10:52:51
/** @defgroup RCC_HSE_Config HSE Config
  * @{
  */
#define RCC_HSE_OFF                    0x00000000U                    /*!< HSE clock deactivation */
#define RCC_HSE_ON                     RCC_CR_HSEON                   /*!< HSE clock activation */
#define RCC_HSE_BYPASS                 (RCC_CR_HSEBYP | RCC_CR_HSEON) /*!< External clock source for HSE clock */

定义开开启了
板子粉丝 回答时间:2018-4-18 10:03:13
感觉好像是启用了HSI RC 16MHz
这就不明白了
废鱼 回答时间:2018-4-18 10:17:50
用HAL_RCC_GetPCLK1Freq读取一下系统时钟到底是多少。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

板子粉丝 回答时间:2018-4-18 10:27:15
读到的值是 15288
板子粉丝 回答时间:2018-4-18 10:27:32
HSE没工作
板子粉丝 回答时间:2018-4-18 11:15:05
我做了一下试验,用HSI RC 16 MHZ倍频到80MHZ可以的。HSE没成功过,是不是忽略了某个细节?
七哥 回答时间:2018-4-18 11:26:57
板子粉丝 发表于 2018-4-18 10:42
/**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC ...

有可能是外部HSE时钟,就没工作起来,如果有RCC_HSE_ON宏定义,那么就改一下试试。
因为如果选了HSE,但是没工作起来的话,还是会从内部HSI来跑或者如果不跑的话,就直接挂了。
从你Prescaler设置也说明了,的确跑的是16M时钟。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

budaoweng 回答时间:2018-4-18 11:37:31
是不是外部晶振的原因呀?我之前遇到过类似的情况。晶振不起振自动切换成HSI

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

板子粉丝 回答时间:2018-4-18 13:02:59
下面附件是我在PA0引脚上测得的时钟波形,有8MHz的
tek00287.png
废鱼 回答时间:2018-4-18 13:48:05
仿真一下,看看开启外部晶振操作过程是否发生了失败。还是排查一下外部电路的问题。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

板子粉丝 回答时间:2018-4-18 14:02:05
我一路跟踪,HAL_RCC_OscConfig返回 HAL_OK
寄存器貌似也对的
5.jpg
6.jpg
butterflyspring 回答时间:2018-4-18 15:19:10
首先可以用寄存器看看时钟源的设置,看完,是可以设置一个MCO输出,测一下就知道具体的频率了.记得设置MCO管脚为高速..

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

板子粉丝 回答时间:2018-4-18 15:25:26
现在可以确定我的外部有源晶振被内部HSI RC接管了!是不是外接有源晶振还要注意什么问题
12下一页

所属标签

相似问题

官网相关资源

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