本帖最后由 zbp_uestc 于 2009-12-17 17:39 编辑
我的问题是这样,目前我使用的芯片时stm32f101c6,开发环境keil MDK4.0,外部时钟8Mhz,我计划在port A的第一脚上输出占空比为50,频率为214k的方波,产
生方波的方案是使用定时器2定时中断来完成。
时钟相关配置:
/* PLLCLK = 8/2MHz * 9 = 36 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);
/* HCLK = SYSCLK=36Mhz */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK1 = HCLK/2=18Mhz */
/*因为当PCLK1预分频大于1时定时器2的输入时钟自动2倍频,因此定时器2的输入时钟36Mhz*/
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 36M/(83+1)/2=214.2k */
TIM_TimeBaseStructure.TIM_Period = 83;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
中断函数
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)));
}
}
按照设计,系统时钟为8/2*9=36Mhz,PCLK1时钟为系统时钟的2分频18Mhze,因为PCLK1进行了分频,所以从PCLK1引出的到
TIME2的计数时钟由硬件自动2倍频到36MHZ,timer2的计数值为83,应该产生频率为36M/(83+1)/2=214.2k,占空比为50%的方波,
事实上产生的波形频率为143k,占空比为57%的方波
奇怪的是当我改变PLL时钟源预分频为1,同时将PCLK1分频系数调整为4的时候,即配置成以下形式
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PCLK1Config(RCC_HCLK_Div4);
也就是系统时钟变为72MHZPCLK1时钟变为72/4=18Mhz,TIME2时钟2倍频后变为36Mhz,及理论上timer2的输入计数时钟不变,
这个时候我得到的波形确完全和预计一样频率214.2k,占空比50%,
这是怎么回事呢???要知道STM32101C6芯片本身支持的最大频率为36MHz,我配置到72Mhz的系统时钟
居然可以正常工作???不知道大家是否遇到过相似的情况,请帮助下
先谢谢各位了 |