我还是STM32家族的新手(几个月以前,我只在ARM7家族工作过)。我正在处理一个时间限制很大的代码。都是用气体编码的,没有C,没有操作系统。我正在使用STM32F730Z8,并将其计时到200 MHz。所有代码在启动时都复制到ITCM中,并从那里执行以提高速度(VTOR也适当地映射向量表)。
问题是我得到了双次调用来中断处理程序。我已经搜索了这里和ST知识库,并看到了一些参考资料,但他们的建议并没有解决它。
一个最小化的示例是将时钟设置为200 MHz,只启用TIM7中断。TIM7是通过以下方式设置的:
write TIM7_CNT,0
write TIM7_PSC,9
write TIM7_ARR,99
write TIM7_DIER,1
write TIM7_CR1,1TIM7处理程序如下所示:
push {lr}
write GPIOD_BSRR,1<<13
write TIM7_SR,0
b <label> to jump over a bunch of crap
write GPIOD_BSRR,1<<29
POP {pc}“写”只是一个简单的宏:
.macro write addr, value
ldr r1,=\addr
ldr r0,=\value
str r0,[r1]
.endmPD13的使用是一个计时基准--我看我的范围上的那个引脚。我看到的是一对脉冲。它们相隔10 is,所以每对都是由TIM7的单个重装产生的。每对由两个25 of的脉冲组成,间隙为100 of。
这是不可接受的。我只需要在每个计时器滴答上只调用一个处理程序。我已经写了两次给TIM7_SR,以清除UIF位。我尝试在进入处理程序和退出时写信给TIM7_SR。我已经尝试过清除NVIC_ICPR1中的挂起位。我尝试插入额外的无意义代码,以便给它更多的时间来传播清除操作。我真不敢相信没有办法解决这个问题。救命!?!
杰夫·凯西/洛克菲尔德研究公司/ casey@rockfieldresearch.com /拉斯维加斯
发布于 2022-09-25 21:33:15
好吧,我想我已经弄清楚了。我不喜欢,但这是一致的。执行摘要:是的,您需要无意义的代码,而中断清除传播到时钟。然而,时钟基速度与传输该信息的总线速度并不相同。
首先,这个芯片上的时钟非常复杂。我的HCLK (AHB=SYS)运行在200 MHz。APB2总线的最大值为100 MHz,因此需要2的除法器,APB1总线的最大值为50 MHz,因此需要4的分频器。
最初,我在APB1总线设置的除数中输入了一个错误,并给它一个8的除法器。
所有这些都被我设置的TIMPRE=1进一步混淆了。这是一个设置时钟加速的参数。当时钟关闭时,它使时钟在公共汽车上增加2倍的速度,除非巴士预售是1,而不是。当TIMPRE开着时,它让时钟在HCLK运行,如果前置时间是1/2/4,否则它会在总线上设置一个4倍的升压。明白了吗?
一开始我在/8,或者说25 MHz和TIMPRE=1,这给了我4倍的刺激,所以时钟的基础是100 MHz。我需要70 ns的无稽之谈NOP延迟,以允许中断重置传播和避免双重进入到处理程序。
修正后,APB1 /4给出了50 Mhz,TIMPRE=1给出了时钟的基数为200 MHz。我现在只需要7-8无意义的添加,范围基准45 ns。注意这里的区别-- APB1总线现在运行速度快了2倍。
TIM7位于APB1总线上。然后我转而使用TIM9,它位于APB2 bus....that上,最高速度为100 MHz,所以我将除数设置为2。在所有其他方面,这是相同的--注意,TIM7和TIM9都在200 MHz的基础上运行时钟滴答,但是对于TIM9,中断清除时只添加了4到5个NOPs的废话,范围基准为35 ns。在速度更快的外围总线上运行可以使我更快地响应清除中断。
这是个可怕的特征。这不是一个快乐的解决方案,我张贴,这是一个讨厌的解决办法。现在,如果不检查作用域上的双击,我就不敢编写中断服务(至少是短中断服务)。ST应该为自己感到极大的羞愧。我会为此道歉,如果有人找到了一个更好的修复-理想的一些设置参数,我错过了,使这些行为方式,他们应该。如果这是不可避免的,因为架构,也许ST可以挂在AHB总线上的计时器,这可能会完全解决问题。
我在这上面拔了头发。我希望我的帖子能拯救别人的头皮。
https://stackoverflow.com/questions/73841669
复制相似问题