ST意法半导体
直播中

郑成枝

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

如和让STM8S与STM8L安全地进入睡眠状态呢?

在许多应用程序中,我使用简单的模板,其中中断例程(例如 UART 接收)引发标志(易失性变量)和 main() 函数轮询这些标志并处理这些事件(例如解析传入的 UART 字符)。我想在无事可做时让 MCU 进入睡眠状态——当所有标志都被清除时。但我不能简单地写:
  • if(!flag1 && !flag2 ...){
  • go_to_sleep();
  • }
因为潜在的竞争条件。可以在 if 语句评估期间设置标志,并且存在风险,即 MCU 会在升起一些标志的情况下进入睡眠状态。是否有任何机制如何让 STM8S(可能还有 STM8L)安全地睡眠——只有在标志被清除的情况下?
只是为了兴趣:
STM32 通过调用“发送事件”指令(在出现标志的地方)来处理该问题,从而防止入睡。
AVR 有单独的位用于“睡眠启用”,该位可以在 IRQ 例程中清除,在该例程中会升高标志并防止 MCU 进入睡眠模式。
如何使用 STM8 做到这一点?

回帖(1)

杨秀英

2022-12-8 15:59:29
以下是我执行此操作的方法之一(使用优先级事件处理),但它是在汇编程序中:


  • forever:
  •                 sim
  •                 ld   A, EVENT_REG
  •                 jrne f_tst
  • f_slp:                wfi
  •                 sim
  •                 ld   A, EVENT_REG
  •                 jreq f_slp
  • f_tst:                rim
  •                 bcp  A, #(1<
  •                 jrne f_event_0
  •                 bcp  A, #(1<
  •                 jrne f_event_1
  •                 ;...
  •                 bcp  A, #(1<
  •                 jreq forever
  •                 call Handle_Event_7
  •                 jp   forever
  • f_event_0:
  •                 ...
  •                 jp   forever
  • f_event_1:
  •                 ...
  •                 jp   forever



一些解释:
就像你写的那样,中断执行基本的即时任务并设置一个标志(代码片段中的事件)以表示进一步处理。在永久循环中,如果设置了任何事件标志,则将逐个测试这些标志,如果设置,则执行事件任务处理程序。
如果连续或太频繁地设置其中一个事件,将不会处理以下事件 - 但我希望它以这种方式运行,因为最后一个事件是重置看门狗的事件,以防万一它没有被执行时间,我知道有些事情没有按照我的计划进行。这可以通过使用调用而不是跳转到事件处理程序来轻松更改。
你将如何用 C 语言编写它,或者 C 编译器如何执行它们的循环,我不知道。
举报

更多回帖

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