完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,
我正在研究计时器上的例子,等等。 我在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个回答
|
|
嗨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 |
|
|
|
嗨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); } 因此,捕获事件是用示波器测量的,这是一种老式的“蛮力”方法,但非常简单有效 |
|
|
|
嗨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 |
|
|
|
喜
我对ST提供的原始示例的关注是,如果您测试示例并将IC预分频器除以4或更少(而不是除以8),则得到变量的结果 LSIClockFreq =(8 * TIM2ClockFreq)/(ICValue2 - ICValue1); 不是你所期望的(我的意思是128KHz的1/2 - >接近64KHz)。无论你使用什么IC分频因子,它都能让你保持相同的128KHz左右。 否则,要使LSIClockFreq值与IC分频因子成比例,您必须尽可能地提高CPU时钟(即全16MHz)。低频CPU的原因是该例子不适用于IC DIV&lt; = 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 |
|
|
|
嗨皮奥瓦,
是的,我现在明白你了.... 我没有像你描述的那样对它进行测试,但我认为如果示例使用中断会更好。 Herzlich, MCULüfter 以上来自于谷歌翻译 以下为原文 Hi piova, yeah, I understand you now.... I didn't tested it as you described but I think that it would be better if the example uses the interrupts. Herzlich, MCU Lüfter |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2655 浏览 1 评论
3216 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1790 浏览 1 评论
3619 浏览 6 评论
5997 浏览 21 评论
946浏览 4评论
1319浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
591浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1309浏览 3评论
1369浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 02:15 , Processed in 1.159012 second(s), Total 85, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号