打印

STM32定时器产生方波的奇怪问题,欢迎讨论

[复制链接]
4941|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zbp_uestc|  楼主 | 2009-12-17 17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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的系统时钟
居然可以正常工作???不知道大家是否遇到过相似的情况,请帮助下
先谢谢各位了
沙发
香水城| | 2009-12-17 17:59 | 只看该作者
你是否说你超速了,但没见到警察? :lol

恭喜你!:victory:

使用特权

评论回复
板凳
zbp_uestc|  楼主 | 2009-12-17 19:22 | 只看该作者
你是否说你超速了,但没见到警察? :lol

恭喜你!:victory:
香水城 发表于 2009-12-17 17:59

老大,你要看关键的啊,正常的36M没有工作,72M就算工作了,也不放心啊。。。
等待高手解答

使用特权

评论回复
地板
zhaofei0204| | 2009-12-18 09:19 | 只看该作者
你的中断太频繁了,占用了大量的系统时钟,当系统去执行中断调用指令时,计数器已经走了很多

使用特权

评论回复
5
zbp_uestc|  楼主 | 2009-12-21 08:58 | 只看该作者
你的中断太频繁了,占用了大量的系统时钟,当系统去执行中断调用指令时,计数器已经走了很多
zhaofei0204 发表于 2009-12-18 09:19

也许就是这样,但是我用软件仿真的时候发现中断处理程序不到1.5us。非常感谢!用定时器的PWM方式问题基本解决,来结个贴。经过多次试验,用中断的方式很难在端口上产生四百多K的信号,不仅频率不正确而且占空比也不对。现在用定时器的PWM基本可以完成这个要求。只是PWM在频率转换的节点会产生对不齐的情况。谢谢大家的关注

使用特权

评论回复
6
sinadz| | 2009-12-21 09:15 | 只看该作者
节点不对齐,延时了?

使用特权

评论回复
7
winloop| | 2009-12-21 09:51 | 只看该作者
中断和顺序执行是两个各有长短处的方法,各有各的适用场合,没有绝对的,不要以为所有的应用都是中断方式节省时间

使用特权

评论回复
8
香水城| | 2009-12-21 10:14 | 只看该作者
“PWM在频率转换的节点会产生对不齐的情况”,这是一种什么情况?

如果是说在一个PWM周期没有结束时,新频率的周期又开始了这种情况,那么你只需要设置TIMx_CR1寄存器的ARPE位,使能自动重装载的预装载寄存器,这样输出比较寄存器的数值只会在更新事件时才会被更新为新的数值,实现了你要求的对齐。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zbp_uestc + 1
9
511| | 2009-12-21 20:38 | 只看该作者
关注,

使用特权

评论回复
10
yangan_36| | 2014-8-19 16:15 | 只看该作者
我遇到过类似的问题:STM32F101C8时钟怎么配置,时钟频率总是8M

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

13

帖子

0

粉丝