8928|16

55

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

stm32的通用定时器输出比较 [复制链接]

这几天一直在看stm32 的通用定时器,  对定时器的输出比较很是迷惑,主要有以下几点:

1、输出模式有 Timing、Active、InActive、Toggle 等几种模式, 这几种模式有什么区别? 或者说各有什么用途?

2、 根据TIMx_CCMR 中的OC1M 模式选择位(3位)配置,可以选择不同的输出模式(对应1中的),手册上说当计数   
     器与比较寄存器中值匹配时,可以对 OC1REF 进行保持,强制为高或低,翻转的动作 ;     

    问题是:OC1REF是什么?     手册上指出:OCx状态=OCxREF + 极性   

    这里的极性(通过初始化函数配置为高或者低)具体指什么?  输出管脚的状态是否就是Ocx的状态?  按照这个式子,只要极

性设置为高,OCx 不就一直为高吗?  


比如通道设置为 Active 模式,极性设置为High  ;  当匹配时,输出管脚的状态怎么判断?

   (我的理解: 如果OCx的状态就是输出管脚的状态,
    (1)通道设置为 Active模式-----匹配时强制OC1REF为高;
 (2)极性配置为High ;
    所以OCx = 高!即输出管脚就一直为高电平!  

这样理解肯定是不对的,结果是输出的是方波。 但是就是想不通
此帖出自stm32/stm8论坛

最新回复

                                 调定时器,最好写了代码放硬件上跑,用示波器看波形 把各种模式都试试看,看看波形会有什么样的变化,这样再回头看手册就容易理解了  详情 回复 发表于 2010-11-18 21:28
点赞 关注
 

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 反复看技术手册,看不明白,就多做几个试验,然后动动手,动动脑 你就明白了。以后的路还长呢!
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
1)不知道你从哪里看的:输出模式有 Timing、Active、InActive、Toggle 等几种模式,我不知道你说的Timing是指什么,Active=比较成功后把OCxREF置为高,InActive=比较成功后把OCxREF置为低,Toggle==比较成功后把OCxREF的状态翻转。

2)请看手册上这张图:
STM32_TIMx_OCxREF.GIF
在OC1REF之后有一个TIMx_CCER的CC1P控制位,控制着是把CC1REF直接输出到后面的输出使能电路(Output Enable Circuit),还是把CC1REF反相后再送到输出使能电路。手册上说的+极性,就是指的这个CCxP控制位。这里不是算术加法,而是增加的意思。
此帖出自stm32/stm8论坛
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 

此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 你看的这个是V2的手册,3.x的手册是安装目录下的一个CHM文件:stm32f10x_stdperiph_lib_um.chm
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 TIM_OCMode_Timing:在比较成功时不对输出引脚的状态产生影响,适合于做定时使用。
此帖出自stm32/stm8论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 


参照3.0库写的例程为何只能进入TIM_IT_Update而不能进入TIM_IT_CC1
右边对应3.0库代码:
void Tim2_Init(void)
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

  TIM_TimeBaseStructure.TIM_Period = 5000;// 1us * 50 000 = 50ms;TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_Prescaler = 35;// 36mhz /36 = 1mhz, =1us  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* Prescaler configuration */
  TIM_PrescalerConfig(TIM2, 256, TIM_PSCReloadMode_Immediate);// TIM_PrescalerConfig(TIM2, 4, TIM_PSCReloadMode_Immediate);
  
/* Output Compare Timing Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 500;// TIM_OCInitStructure.TIM_Pulse = CCR1_Val;  __IO uint16_t CCR1_Val = 49152;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);
  /* TIM IT enable */
  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_Update, ENABLE);//  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);我没有使用cc2,cc3,cc4
/* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
}

中断处理
void TIM2_IRQHandler(void)
{
   uint8_t b;
   b=10;
   b=b+1;
   #ifdef _DEBUG_
   printf("TIM2_IRQHnadler Success!\n");
   #endif

if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
  #ifdef _DEBUG_
  printf("TIM2_IRQHnadler_Update Success!\n");
  #endif
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}

if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
  #ifdef _DEBUG_
  printf("TIM2_IRQHnadler_CC1 Success!\n");
  #endif
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
  TIM_Cmd(TIM2, DISABLE);
  
}
}

keil4.12 调试结果

ex_timebase.JPG (80.05 KB)

ex_timebase.JPG

此帖出自stm32/stm8论坛
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 你看看TIM2_SR、TIM2_DIER和TIM2_CCMR1寄存器的内容。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
keil 模拟的结果

ex_timebase_register.JPG (250.75 KB)

ex_timebase_register.JPG

此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 不要模拟,直接在芯片上跑。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

11
 
发现了,是KEIL的BUG!

ex_timebase_hw.JPG (123.62 KB)

ex_timebase_hw.JPG

此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 
不要模拟,直接在芯片上跑。
版主 发表于 2010-7-27 14:03
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

13
 
                                 定时器这玩意是挺烦的,功能多,要慢慢看手册,实践一下
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 mark
此帖出自stm32/stm8论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

15
 
                                 mark
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
调定时器,最好写了代码放硬件上跑,用示波器看波形
把各种模式都试试看,看看波形会有什么样的变化,这样再回头看手册就容易理解了
此帖出自stm32/stm8论坛
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

17
 
调定时器,最好写了代码放硬件上跑,用示波器看波形
把各种模式都试试看,看看波形会有什么样的变化,这样再回头看手册就容易理解了
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表