野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10224|回复: 1

锁相环倍频与时钟分频-------SF加急!!!!!

[复制链接]
发表于 2018-6-13 15:24:03 | 显示全部楼层 |阅读模式
请教各位老哥,STM32F429程序里的默认倍频是360MHz。
我现在需要使用400M时钟,同时,分频200M给SystemCoreClock
在  system_stm32f4xx.c 里
将 “#define PLL_N      360 ”的360  改为400 ,
将"  uint32_t SystemCoreClock = 180000000;" 的180M改为200M之后,使用定时器TIM2产生的中断不对。

调用函数HSE_SetSysClock(25, 400, 2, 7)修改时钟频率,失败,效果和上面修改的一样;


比如,用原来是的默认配置,产生1s中断,示波器测试非常准确,修改上述两个数据之后,定时器的1s中断差别太大,大概0.7s;

请教各位朋友,除了define PLL_N ,SystemCoreClock  这两个参数之外,还需要修改那些地方,是不是要修改定时器时钟,怎么修改?

配置代码如下:


//////////////////////:lol:lol:lol:lol:lol:lol:lol:lol 若无特别说明的地方,没有修改

[mw_shl_code=c,true]/**
  ******************************************************************************
  * @file    bsp_general_tim.c
  * @author  STMicroelectronics
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   通用定时器定时范例
  ******************************************************************************
  * @attention
  *
  * 实验平台:秉火  STM32 F429 开发板  
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :http://firestm32.taobao.com
  *
  ******************************************************************************
  */
  
#include "./tim/bsp_general_tim.h"





void TIM2_Init(u32 period)///单位ms         //////////////////////////////////////////////////////,:lol自己写的初始化函数,在 PLL_N = 360 SystemCoreClock = 180M 时,定时1000ms的中断,非常准确
{
u32 arr = 1000;
u32 psc = 100*1000*1000/arr/(1000*period);///////////////////////////////////////////////////,:lol自己写的初始化函数,在 PLL_N = 400 SystemCoreClock = 200M 时,计算分频系数,得到结果不正确
//psc = 90*1000000/arr/(1000/period);///////////////////////////////////////////////////,:lol自己写的初始化函数,在 PLL_N = 360 SystemCoreClock = 180M 时,计算分频系数,得到结果正确
TIM2_NVIC_Configuration();
TIM2_Mode_Config(arr, psc);
}




/**
  * @brief  通用定时器 TIMx,x[1,8]中断优先级配置
  * @param  无
  * @retval 无
  */
static void TIM2_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    // 设置中断组为0
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);               
                // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = GENERAL_TIM2_IRQn;        
                // 设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         
          // 设置子优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*
* 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
* TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
* 另外三个成员是通用定时器和高级定时器才有.
*-----------------------------------------------------------------------------
* TIM_Prescaler         都有
* TIM_CounterMode                         TIMx,x[6,7]没有,其他都有(基本定时器)
* TIM_Period            都有
* TIM_ClockDivision     TIMx,x[6,7]没有,其他都有(基本定时器)
* TIM_RepetitionCounter TIMx,x[1,8]才有(高级定时器)
*-----------------------------------------------------------------------------
*/
static void TIM2_Mode_Config(u32 arr, u32 prr)//////////////////////////////////////////////////////:lol,将无参函数改为有参函数
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

        // 开启TIMx_CLK,x[6,7]
        RCC_APB1PeriphClockCmd(GENERAL_TIM2_CLK, ENABLE);

        /* 累计 TIM_Period个后产生一个更新或者中断*/               
        //当定时器从0计数到4999,即为5000次,为一个定时周期
        TIM_TimeBaseStructure.TIM_Period = arr-1; //////////////////////////////////////////////////////:lol,计数参数,这个时自己设定的,就计1000个数

        // 高级控制定时器时钟源TIMxCLK = HCLK/2=90MHz
        // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=10000Hz
        TIM_TimeBaseStructure.TIM_Prescaler = prr-1; //////////////////////////////////////////////////////:lol,分频参数,这个时计算出来的自动分频系数
        // 采样时钟分频
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        // 计数方式
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

        // 初始化定时器TIMx, x[1,8]
        TIM_TimeBaseInit(GENERAL_TIM2, &TIM_TimeBaseStructure);


        // 清除定时器更新中断标志位
        TIM_ClearFlag(GENERAL_TIM2, TIM_FLAG_Update);

        // 开启定时器更新中断
        TIM_ITConfig(GENERAL_TIM2,TIM_IT_Update,ENABLE);

        // 使能定时器
        TIM_Cmd(GENERAL_TIM2, ENABLE);       
}

/**
  * @brief  初始化高级控制定时器定时,1ms产生一次中断
  * @param  无
  * @retval 无
  */
//void TIM2_Configuration(void)
//{
//        TIM2_NVIC_Configuration();       
//  
//        TIM2_Mode_Config(10000,9000);
//}




/*********************************************END OF FILE**********************/
[/mw_shl_code]





回复

使用道具 举报

发表于 2018-6-13 15:49:35 | 显示全部楼层
先读取一下系统时钟的频率打印出来看看是多少
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 13:14 , Processed in 0.035910 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表