• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

STM32F103R8时钟分频问题?

jldwd 2014-04-17 浏览量:1615

大家帮忙看看下面的问题,谢谢了!

void RCC_Config(void)
{
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
/* RCC system reset(for debug purpose) */
RCC_DeInit();

/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);

/* Wait till HSE is ready */
//  HSEStartUpStatus = RCC_WaitForHSEStartUp();

if (RCC_WaitForHSEStartUp() == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);

/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);

/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);  // 已经设置2分频,应该是72/2=36MHz

/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

/* Enable PLL */
RCC_PLLCmd(ENABLE);

/* Wait till PLL is ready */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}

/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}

}

已经设置好APB1总线频率是36MHz,下面使用APB1总线挂外的TIM3产生以秒为单位的中断,程序如下:

/*******************************************************************************
* Function Name  : TIM3_LIGHTSOURCE_DELAY_Config
* Description    : 通过TIM3中断以秒为单位,产生光源TIMEOUT。
* Input          : lightsource_timeout
* Output         : None
* Return         : None
*******************************************************************************/
void TIM3_LIGHTSOURCE_DELAY_Config(void)
{



NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3总线

TIM_Cmd(TIM3, DISABLE);     //关闭TIM3
TIM_DeInit(TIM3); //复位TIM3



TIM_TimeBaseStructure.TIM_ClockDivision = 0;   // 定时器基准频率36M
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1; //分频系数,1khz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseStructure.TIM_Period = 1000-1; //自动重载值 ARR   1HZ
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化定时器



NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);   //使用中断优先组1

/* Enable the TIM3 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

}


问题是,实际的中断是0.5秒一次,反推回去,就是APH1的时钟还是72MHz,但是STM32F103手册里面明确写着,APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。谁帮我看看啊!



0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • TIM_TimeBaseStructure.TIM_ClockDivision = 0;   // 定时器基准频率36M
    TIM_TimeBaseStructure.TIM_Prescaler = 36000-1; //分频系数,1khz
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
    TIM_TimeBaseStructure.TIM_Period = 1000-1; //自动重载值 ARR   1HZ

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化定时器     



    这里没有问题么?

    • 发布于 2014-04-17
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:12

  • 雪狼 都五十级了!恭喜啊 !你也帮忙看看啊!
    • 发布于2014-04-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 从 STM32 的内部时钟树图得知:当 APB1 的时钟分频数为 1 的
    时候,TIM2~7 的时钟为 APB1 的时钟,而如果 APB1 的时钟分频数不为 1,那么 TIM2~7 的时

    钟频率将为 APB1 时钟的两倍。因此, TIM3 的时钟为 72M



    是两倍 没有错  

    • 发布于2014-04-17
    • 举报
    • 评论 0
    • 0
    • 0

  •  *========================================================================================  
    *名        称: Timer_Config();  
    *功        能: 定时器中断初始化  
    *入口    参数:    
    *说        明: 放入主函数里初始化  
    *范        例:      *编者   时 间:  Ye.FuYao  2012-9-23    *========================================================================================*/ void Timer_Config(void) 
    {  
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;        //定义TIM结构体变量   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);          //使能TIM2外设   
    TIM_DeInit(TIM2);                                           //复位时钟TIM2,恢复到初始状态  
    TIM_TimeBaseStructure.TIM_Period=17999;       //35999和1999刚好1s  
    TIM_TimeBaseStructure.TIM_Prescaler=1999;               
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;     //TIM2时钟分频   
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //计数方式 
    //  定时时间T计算公式:            
    //  T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=(35999+1)*(1999+1)/72MHz=1s  
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);       //初始化  
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);           //清除标志  
    //  中断方式下,使能中断源  
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);                     //使能中断源
    百度里面找到的 我验证过是正确的谁你能看懂,给我解释一下,为什么是72MHz ,而不是36MHz,已经2分频过了
    • 发布于2014-04-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 明白了,不用解答了!
    • 发布于2014-04-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 哇塞,我还没有看懂,问题就解决了!!!
    • 发布于2014-04-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 个人觉得无论何种控制器时钟的分频设置还是非常重要的

    好多童鞋说移植的程序无法正常工作,除去基本的语法问题,或许就是这个原因

    貌似st的新版外设库,时钟的初始化都在启动文件里面完成了

    • 发布于2014-04-17
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

STM32F103R8时钟分频问题?