[STM32F1] STM32F103定时器输出频率最高只有280KHz

[复制链接]
3358|10
 楼主| wwzx2513 发表于 2016-12-2 16:49 | 显示全部楼层 |阅读模式
/*
* 函数名:TIM2_GPIO_Config
* 描述  :配置TIM2复用输出PWM时用到的I/O
* 输入  :无
* 输出  :无
* 调用  :内部调用
*/
static void TIM2_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;   
   
    /* GPIOB clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
   
    /*GPIOA Configuration: TIM2 channel 1 and 2 as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;       // 推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/*
* 函数名:TIM2_Mode_Config
* 描述  :配置TIM3输出的PWM信号的模式,如周期、极性、占空比
* 输入  :无
* 输出  :无
* 调用  :内部调用
*/
static void TIM2_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   
    /* TIM2 clock enable */
    //PCLK1经过2倍频后作为TIM2的时钟源等于72MHz
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
    TIM2_NVIC_Configuration();
    TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period        = (1);                  /* 自动重装载寄存器周期的值(计数值) */
    /* 累计 TIM_Period个频率后产生一个更新或者中断 */
    TIM_TimeBaseStructure.TIM_Prescaler     = (1);                  /* 时钟预分频数 72M/72== 1MHZ */
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;         /* 采样分频 */
    TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;   /* 向上计数模式 */
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//    TIM_ClearFlag(TIM2, TIM_FLAG_Update);                         /* 清除溢出中断标志 */
    TIM_Cmd(TIM2, ENABLE);                                          /* 开启时钟 */
}

这样的配置为什么输出只有280KHz?请高手指教.
 楼主| wwzx2513 发表于 2016-12-2 16:52 | 显示全部楼层
为什么刚发就结贴?
Xflyan 发表于 2016-12-2 17:53 | 显示全部楼层
wwzx2513 发表于 2016-12-2 16:52
为什么刚发就结贴?

没有给分直接结贴的
Xflyan 发表于 2016-12-2 17:56 | 显示全部楼层
你的定时器又没有配置PWM输出,280KHZ怎么产生的?
 楼主| wwzx2513 发表于 2016-12-3 00:06 | 显示全部楼层
Xflyan 发表于 2016-12-2 17:56
你的定时器又没有配置PWM输出,280KHZ怎么产生的?

在中断中加个翻转,如果用PWM频率最高只有720KHz,因为要保证1%的占空比,所以72M/100=720KHZ,但没有用PWM,直接控制引脚,频率应该更快才对,怎么只有280K,最多288K,频率是在示波器上看到的
void TIM2_IRQHandler(void)
{       
        if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
        {               
                TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
        
        if(i++)
        {
            i = 0;
            GPIO_ResetBits(GPIOB,GPIO_Pin_5);
        }
        else
        {
            GPIO_SetBits(GPIOB, GPIO_Pin_5);
        }
        
        }
}
皈依 发表于 2016-12-3 09:16 | 显示全部楼层
APB1只有36M 另外代码执行也要时间
皈依 发表于 2016-12-3 09:17 | 显示全部楼层
想把频率提高用楼上说的PWM做
 楼主| wwzx2513 发表于 2016-12-3 10:23 | 显示全部楼层
皈依 发表于 2016-12-3 09:16
APB1只有36M 另外代码执行也要时间

36M会有倍频,成为72M,代码极少,运行时也不可能占用1000多uS的时间吧?
 楼主| wwzx2513 发表于 2016-12-3 10:26 | 显示全部楼层
皈依 发表于 2016-12-3 09:17
想把频率提高用楼上说的PWM做

刚才又试了一遍PWM,最多72KHZ,为什么不是72M/100=720KHZ?真有些晕了,新手,请高手指教
皈依 发表于 2016-12-3 10:47 | 显示全部楼层
wwzx2513 发表于 2016-12-3 10:23
36M会有倍频,成为72M,代码极少,运行时也不可能占用1000多uS的时间吧?

APB1是72M分频下来的
另外如果PWM也不对的话先确定主频是不是72M 然后根据时钟图从APB1 TIM2一步步的往下查
mmuuss586 发表于 2016-12-3 12:23 | 显示全部楼层
程序进入中断,各种处理也需要时间的;

中断程序都改成寄存器操作看看;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

239

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部