大家帮忙看看下面的问题,谢谢了!
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); }
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化定时器
这里没有问题么?
占沙发,坐等学习
钟频率将为 APB1 时钟的两倍。因此, TIM3 的时钟为 72M
是两倍 没有错
顶一下
个人觉得无论何种控制器时钟的分频设置还是非常重要的
好多童鞋说移植的程序无法正常工作,除去基本的语法问题,或许就是这个原因
貌似st的新版外设库,时钟的初始化都在启动文件里面完成了