大家好、
你好。 我代表客户发布此查询。
"我将 MSP430FR5969用于一个项目。 我有几个任务需要在不同的特定时间执行、因此我设置了多个中断、以便以适当的时间间隔执行这些任务。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
你好。 我代表客户发布此查询。
"我将 MSP430FR5969用于一个项目。 我有几个任务需要在不同的特定时间执行、因此我设置了多个中断、以便以适当的时间间隔执行这些任务。
您好、Marvin、
这并不是嵌入式编程的常见程序流程、 根据他们的描述、我想 说无需过于考虑。
异步/连续操作可在 main 内永无休止的 while 环路内执行。 您还可以设置标志来处理 ISR 中的某些数据、当 while 循环返回给它时、将执行相应的代码。
while (1)
{
if(flag1){
//handle condition 1
flag1 = false;
}
else if(flag2){
//handle condition 2
flag2 = false;
}
///.... etc.
//Insert code to be performed continuosly
}
除了设置标志之外、它们还可以在 ISR 内执行其他基本操作、但建议尽可能缩短这些操作以避免时序问题。
此致、
Brandon Fisher
您好、Brandon、
感谢您的及时响应。 请参阅我们客户的反馈。
"响应有点在正确的路径上、但我的问题更多地是在启动中断后如何在主循环中继续处理。
我将计时器 B0设置为以250Hz 的速率进行中断。 当该中断发生时、该 ISR 仅启动新的 A/D 转换并返回。 完成 A/D 转换后、ISR 会从 MEM0读取该值并将其放入数组中。 最初、我还让 ISR 执行数字化数据的所有处理、但我很确信、在1秒的1/256时间内有太多事情要做。
由于大部分处理工作只需要每1/2秒完成一次、我现在已经设置了计时器 A0、每0.5秒生成一次中断。 在该 ISR 中、我的目的是在禁用中断的情况下执行所需的最小值、然后启用中断并继续处理。 如果计时器 B0再次中断、没关系-它将启动另一个 ADC 周期、然后是 RTI;ADC 将完成并发生中断并保存 MEM0;我将返回到我的处理。 该数组足够大、可以保存几秒钟的样本。
在时间 B0和 ADC ISR 结束时、我有以下代码:
_bis_SR_register (LPM0_bits + GIE);// LPM0、ADC12_B_ISR 将强制退出
__no_operation();//用于调试器
如果处理器进入 LPM0但返回到计时器 A0 ISR、它是否会自动退出 LPM0?
如果可以在计时器 A0 ISR 中允许中断、我该怎么做? 它就像调用一样简单
_enable_interrupt ();
__no_operation();"
您好、Marvin、
TB0中断向量 的优先级高于本器 件中的 TIMA0中断、因此这种方式可以自然地起作用、但这样嵌套* ISR 并不理想、因为在其他 ISR 中花费的时间将增加到 TA ISR 的总执行时间。
通过向 __BIC_SR_REGISTER_ON_EXIT 内在函数添加调用,它们可以在主循环中继续(即从 LPM0退出)。 Dennis 在以下主题中提供了有关此功能如何工作的非常好的说明: https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1016520/msp430fr2433-inquiry-about-__bis_sr_register-and-__bic_sr_register_on_exit
我觉得 、如果计时器 A 想要在这些计算发生时计时、我仍然可以选择使用计时器 A、只是为了设置一个标志、使计算在您返回到主循环时开始。 如果在此期间发生 TIMB/ADC 中断、则您将返回到在循环中执行的位置并继续。
此致、
Brandon Fisher
您好、Brandon、
感谢您的回答。 请参阅我们客户的反馈。
"根据您分享的信息、下面是我要尝试的基本流程:
main():
设置 ADC12以写入 ADC12MEM0
为256Hz 中断设置 TB0
启动 TB0
__ENABLE_INTERRUPTS ()
__NO_OPERAT()
while (1){
while (sample_count = CURRENT_SAMPLE_COUNT)
等待 ADC 生成另一个值
对 array[curry_sample_count]中的值执行必要的工作
CURRENT_SAMPLE_COUNT++
如果 CURRENT_SAMPLE_COUNT >最大值、则 CURRENT_SAMPLE_COUNT = 0
}
TB0 ISR:
启动 ADC12
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS)
__NO_OPERAT()
ADC12MEM0 ISR:
将 MEM0读取到数组[SAMPLE_COUNT)
SAMPLE_COUNT++
如果 SAMPLE_COUNT >最大值、SAMPLE_COUNT = 0
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS)
__NO_OPERAT()
这意味着 MSP 不会进入 LPM0、但我在我的应用中并不担心这一点。 我也许可以在"等待 ADC 生成另一个值"循环期间进入 LPM0。"
感谢您的帮助。 非常感谢您的支持。
此致、
Marvin