完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先,我是一个完整的n00b,刚刚开始使用STM32。我在设置tiM1和使用外部中断EXTI3时遇到了一些奇怪的行为。我正在尝试测量外部中断的低输入频率,并使用TIM1递增1 MHz计数器,因此我可以以微秒为单位进行测量。我这样做,因为看起来SysTick不够快(1毫秒)给我一个准确的测量。 核心时钟为16 MHz,TIM1设置如下:
但是,程序几乎锁定并且while()运行循环似乎没有执行。然而,我可以看到TIM1计数器正在递增。如果我将句点减慢到100,那么主应用程序循环似乎运行正常。 这是TIM1和EXTI3在这个速度上发生冲突的问题 - 还是其他的事情发生在这里?我认为设备应该没有问题提供1 MHz计数器,但也许我这样做是错误的。 |
|
相关推荐
7个回答
|
|
如果要将输入时钟除以16,则应将预分频器值设置为15
|
|
|
|
在我所遵循的例子中我没有注意到这一点,但你似乎是正确的,非常好理解
|
|
|
|
你这一切都错了。
没有办法让你能够在16个时钟周期内执行你的定时器中断处理程序 - 永远不要绕过你的while(1)循环。 你应该做的是让计时器自由运行,只在溢出时处理中断。我们很快就会回到这里。 接下来,为EXTI设置一个中断处理程序,然后在其中捕获计时器的值并保存。 在下一个中断中,计算2个值之间的差值 - 并且你有它 - 两个连续EXTI事件之间的时间,它是你的定时器周期的倍数(如果保持相同,则为1uSec)。 但是如果定时器翻转怎么办 - 这就是我们想要在翻转时处理定时器中断的原因。 在这里,您可以设置一个标志,告诉您的EXTI处理程序计时器已经翻转,并且在进行计算时需要考虑到这一点。 |
|
|
|
嗯,我以为这正是我在做的事情。在我的EXTI中断代码中,我正在做的是在生成中断时获取timerTicks的值并存储前一个值。我的主循环根据两个值的差异执行实际计算
|
|
|
|
这是你问题的根源。不要使用由定时器ISR递增的变量 - 使用定时器自己的内部硬件计数器寄存器 - 它已经存在并且可供您阅读和使用
|
|
|
|
我明白了,我以为它会在下面实现相同的 - 谢谢你我会试一试。
|
|
|
|
这个实例的主要区别在于计时器自己的计数器已经在没有任何CPU干预的情况下递增,而您的ISR实现使用CPU指令。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1252 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1184 浏览 3 评论
2263 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1351 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1774 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 21:17 , Processed in 0.743641 second(s), Total 87, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号