初中生
最后登录1970-1-1
在线时间 小时
注册时间2014-9-24
|
请教各位老哥,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]
|
|