ST意法半导体
直播中

梁兴力

7年用户 226经验值
私信 关注
[问答]

请问激活中断CC1的目的是什么?

大家好,



我正在研究计时器上的例子,等等。

我在STM8S固件库包中遇到了源''main.c'',


实例/ tiM2 / TIM2_Input_Capture / main.c中,

其中一块如下所示。此示例将向您展示如何测量LSI的频率。

虽然这很清楚激活中断CC1的目的是什么?

/ *启用CC1中断* /
00057(,);

我想我们这里不需要任何打扰?
你怎么看?

如果您通过TIM1示例部分中提供的相同用途示例,实际上根本没有中断初始化...

谢谢
斯特凡诺





无效(无效

00050 {
00051
00052 / *每8个活动只捕获一次! * /

00053 / *启用TI1 *的捕获

00054(,,,, 0x00);
00055
00056 / *启用CC1中断* /

00057(,);
00058
00059 / *启用TIM2 * /

00060();
00061
00062 / *清除CC1标志* /

00063();
00064

#tim2 #interrupt#capture-compare

以上来自于谷歌翻译


以下为原文





Hi all,

  
  


I was studying the examples on timers and so on.

I came across the source ''main.c'' in the STM8S Firmware Library package,

  
examples/TIM2/TIM2_Input_Capture/main.c,  
  
a piece of which is shown below. This example will show you how to measure the frequency of the LSI.

Although this is very clear what the purpose of activating an interrupt CC1?

/* Enable CC1 interrupt */
00057         (, );  
  
I think we'd needn't any interrupt here ?  
What do you think?
  
If you go through the same purposed example presented on TIM1 examples section, infact, there's no interrupt initialization at all...
  
Thank you
Stefano
  
  
  
  
  
void(void
)
00050 {
00051   
00052         /* Capture only every 8 events!!! */

00053   /* Enable capture of TI1 */

00054         (, , , , 0x00);
00055   
00056         /* Enable CC1 interrupt */

00057         (, );  
00058         
00059         /* Enable TIM2 */

00060   ();
00061                  
00062         /* Clear CC1 Flag*/

00063   ();
00064   
  
#tim2 #interrupt #capture-compare

回帖(5)

刘萍

2019-7-16 15:34:18
嗨piovan,
 
 
 是的,我赞同你的观点。
 TIM2 IRQ处理程序中没有代码。
 我认为这是一个错字,但我更希望该示例使用中断,因为在我们的情况下,我们需要卸载CPU并仅在发生中断时处理代码。
 
 MCULüfter

以上来自于谷歌翻译


以下为原文





Hi piovan,


Yes, I share you point of view.  
There is no code in TIM2 IRQ handler.
I think that it is a typo but I would prefer that the example uses the interrupt because in our case we need to off-load the CPU and process code only when interrupts occur.

MCU Lüfter
举报

梁兴力

2019-7-16 15:52:32
嗨Lüfter,
 
 
 谢谢。
 在ST提供的示例中我注意到的另一个有趣的事实。
 例如,如果将TIM2 INPUT CAPTURE PRESCALER设置为除以4,
 
 TIM2_ICInit(TIM2_CHANNEL_1,TIM2_ICPOLARITY_FALLING,TIM2_ICSELECTION_DIRECTTI,TIM2_ICPSC_DIV4,0x00);
 
 或者不到8,这意味着你应该捕获每4个输入事件。这样,你应该测量LSI的时钟频率几乎是HALF,而不是将预分频器IC分频设置为8(即128kHz / 2 = 64KHz)。
 
 好吧,它没有!你得到的结果总是相同的128KHz左右。
 将预分频器除法小于4时设置为1时的结果相同。
 
 为什么?
 
 为了进入这个明显的异常,我在捕获发生时通过切换和硬件输出端口(即PE.3)稍微修改了示例代码。
 
 而(1)
 {
 / *在CC1上等待捕获* /
 while((TIM2-> SR1& TIM2_FLAG_CC1)!= TIM2_FLAG_CC1);
 / *获得CCR1值* /
 ICValue1 = TIM2_GetCapture1();
 TIM2_ClearFlag(TIM2_FLAG_CC1);
 / * debug * /
 GPIO_WriteHigh(GPIOE,GPIO_PIN_3);
 
 / *等待cc1上的捕获* /
 while((TIM2-> SR1& TIM2_FLAG_CC1)!= TIM2_FLAG_CC1);
 / *获得CCR1值* /
 ICValue2 = TIM2_GetCapture1();
 TIM2_ClearFlag(TIM2_FLAG_CC1);
 / * debug * /
 GPIO_WriteLow(GPIOE,GPIO_PIN_3);
 
 / *计算LSI时钟频率* /
 // LSIClockFreq =(8 * TIM2ClockFreq)/(ICValue2 - ICValue1);
 
 / *在这里插入一个断点* /
 //而(1);
 
 }
 
 因此,捕获事件是用示波器测量的,这是一种老式的“蛮力”方法,但非常简单有效
举报

刘萍

2019-7-16 16:01:48
嗨piovan,
 
 
 我不明白你的观点,但这是我对这个例子的理解:
 使用TIM2_ICInit()函数可以准确地配置捕获。
 因此,如果使用TIM2_ICPSC_DIV,则在4个上升沿之后设置catpture事件(标志)(取决于TIM2_ICPOLARITY_FALLING / TIM2_ICPOLARITYRISING的降低边缘)
 因此,为了计算信号的频率(在本例中它是LSI),你应该在下面的公式中乘以4(instaed为8),这样就变成了
 LSIClockFreq =(4 * TIM2ClockFreq)/(ICValue2 - ICValue1);
 
 让我们处理时钟频率,计算频率值的一般规则是:
 捕获分频器*定时器时钟/(第二次捕获 - 第一次捕获)
 在ST提供的示例中,
 1-捕获为8(TIM2_ICPSC_DIV8)
 2-定时器时钟为2MHz(使用#define TIM2ClockFreq((u32)2000000定义)
 提醒:定时器的时钟频率与CPU相同,默认为STM8
 似乎运行在2MHz,这就是它定义为2000000的原因。
 
 我希望这清楚,它对你有用。
 
Herzlich
 MCULüfter

以上来自于谷歌翻译


以下为原文





Hi piovan,


I didn't understand exactly your point but this is my understanding of the example:
using TIM2_ICInit() function you configure the capture when exactly it occurs.
So if you use TIM2_ICPSC_DIV, the catpture event (flag) is set after 4 rising edges (orfalling edges that depends on the TIM2_ICPOLARITY_FALLING/TIM2_ICPOLARITYRISING)
consequently to compute the frequency of a signal (in the example it is the LSI) you should multiply by 4 (instaed of 8)in the formula below so it becomes
LSIClockFreq = (4*TIM2ClockFreq) / (ICValue2 - ICValue1);

Let's process the clock frequency, the general rule to compute the frequency value is:
capture divider * timer clock / (second capture - first capture)
In the example provided by ST,  
  1- the capture is 8 (TIM2_ICPSC_DIV8)
  2- the timer clock is 2MHz (It is defined using #define TIM2ClockFreq  ((u32)2000000)
   Reminder: the timer is clocked at the same clock than the CPU and by default STM8   
   seems to run at 2MHz that is why it is defined at 2000000.

I hope this clear and it is useful for you.

Herzlich
MCU Lüfter
举报

梁兴力

2019-7-16 16:12:35

 
 
 我对ST提供的原始示例的关注是,如果您测试示例并将IC预分频器除以4或更少(而不是除以8),则得到变量的结果
 
 LSIClockFreq =(8 * TIM2ClockFreq)/(ICValue2 - ICValue1);
 
 不是你所期望的(我的意思是128KHz的1/2 - >接近64KHz)。无论你使用什么IC分频因子,它都能让你保持相同的128KHz左右。
 
 否则,要使LSIClockFreq值与IC分频因子成比例,您必须尽可能地提高CPU时钟(即全16MHz)。低频CPU的原因是该例子不适用于IC DIV< = 4,因为C代码需要时间,并且CPU无法及时读取TIM2捕获计数器。
 
 问候,
 斯特凡诺

以上来自于谷歌翻译


以下为原文





hi,


what I'm concerned with the original example provided by ST is that if you test the example and put an IC prescaler division by 4 or less (instead of a division by 8) the result you get in the variable  

LSIClockFreq = (8*TIM2ClockFreq) / (ICValue2 - ICValue1);  

is NOT what you would expect (I mean 1/2 of 128KHz -> nearly 64 KHz). It keeps getting you still the same 128KHz or so, whatever IC division factor you put.

Otherwise, to get the LSIClockFreq value proportional to the IC division factor you have to rise the CPU clock as most as you can (i.e. full 16MHz). The reason why with low frequencies CPU the example doesn't work with IC DIV <= 4 is that the C code is time demanding and the CPU is not able to read the TIM2 capture counter in time.

Regards,
Stefano
举报

更多回帖

发帖
×
20
完善资料,
赚取积分