Detecta qué interruptor momentáneo provocó la activación de una CPU STM32


10

Editar : esta pregunta es incorrecta. El stm325105 tiene solo un pin de activación. Pero otras partes ST tienen más de un pin de activación, por lo que la respuesta dada es válida para ellos.


Tengo un stm32f105 que tiene dos botones momentáneos conectados a las entradas de activación. El procesador se pone en MODO DE ESPERA. Cuando se presiona cualquiera de los botones, o se dispara el temporizador RTC, la CPU se activa.

El problema es que quiero que la CPU haga cosas diferentes dependiendo de qué entrada de activación se activó. De acuerdo con 5.3.5 del manual de referencia ST stm32f105xx , no se conservan registros, excepto un registro de estado que indica que hemos sido despertados (pero no por quién) y 42 registros de respaldo.

El modo de espera permite lograr el menor consumo de energía. Se basa en el modo de sueño profundo Cortex ® -M3, con el regulador de voltaje desactivado. En consecuencia, el dominio de 1.8 V está apagado. El PLL, el oscilador HSI y el oscilador HSE también están apagados. La SRAM y el contenido de los registros se pierden, excepto los registros en el dominio de copia de seguridad y el circuito en espera.

Después de salir del modo de espera, la ejecución del programa se reinicia de la misma manera que después de un reinicio (muestreo de pines de arranque, se recupera el reinicio del vector, etc.). El indicador de estado SBF en el registro de control / estado de energía (PWR_CSR) indica que la MCU estaba en modo de espera.

Esta publicación del foro ST, ¿Cómo determinar el origen de Wakeup from Standby? , sugiere que no puedo detectar qué activación se activó en el software. No encontré otras publicaciones allí que dieran más iluminación.

¿Cómo puedo usar software o hardware para determinar, después de despertar, qué entrada de activación se activó?


1
Haga que el botón cargue una tapa y lea eso
PlasmaHH

1
Buscó algunas variantes de STM32F105, solo tienen UN pin de activación. ¿Qué parte quieres decir exactamente y qué alfileres?
berendi - protestando el

@berendi Mi STM32F105 tiene, como usted dice, solo un pin de activación. Está configurado en MODO DETENER, no en modo EN ESPERA, como dije en mi pregunta. Utiliza eventos EXTI para despertarse. Había mezclado el significado de esos "eventos EXTI" con "pines de despertador". Pero supongo que la respuesta proporcionada por Olin sigue siendo útil si alguien necesita diferenciar entre "despertado por RTC" o "despertado por el pin de activación" en MODO DE ESPERA. ¿Alguien tiene sugerencias sobre cómo editar esta pregunta para que coincida con la respuesta de Olins? ¿Una pequeña nota al principio que describe lo que está mal? En reedición completa? ¿O debería simplemente eliminar toda la pregunta?
Daniel Näslund

1
Hay controladores ST con más de un pin de activación, como F0, F3, L0 o L1, donde la fuente no se puede determinar después de salir del modo de espera, ya que tienen un solo indicador de entrada de activación. ST ha corregido este descuido primero en las más nuevas series F7 y L4, que tienen banderas separadas para cada entrada de activación.
berendi - protestando el

Respuestas:


11

No conozco los detalles de esta parte ST, por lo que supongo que su descripción es correcta.

El procesador debe despertarse muy pronto después de presionar cualquiera de los botones. Esto debería ser especialmente cierto si tiene un oscilador RC interno. Incluso si necesita ejecutar un cristal eventualmente por razones de precisión, tal vez pueda hacer que la parte comience desde un RC interno, luego cambie al cristal más tarde. Hay micros que pueden hacer esas cosas, aunque no sé si el suyo es uno de ellos.

En cualquier caso, lee ambas entradas lo antes posible después de la activación. A menos que haya algo inusual en este micro ST, eso debería ser de unos ms a unos 10 segundos desde la presión del botón.

Para garantizar que la línea aún esté baja, use un condensador para mantener la línea baja hasta 100 ms después de soltar el botón.

Por ejemplo, supongamos que el nivel de entrada bajo lógico garantizado es del 20% de la tensión de alimentación. La línea se levanta con una resistencia y tiene un condensador a tierra. El botón corta la línea al suelo. Por lo tanto, la línea flota alto y se fuerza activamente a tierra cuando se presiona el botón. Cuando se suelta el botón, el voltaje decae exponencialmente hacia el suministro.

La disminución al 20% del valor final ocurre en 0.22 constantes de tiempo. Digamos que desea garantizar que la línea se vea baja durante 100 ms después de presionar un botón. Eso significa que la constante de tiempo RC debe ser de 450 ms. Con un pullup de 100 kΩ, la capacitancia debería ser de 4.5 µF. Por lo tanto, una tapa de 4.7 µF 10 V funcionaría bien.

En resumen, aquí está el circuito:


1
Debería ser al revés, los STM32 se despiertan en el borde ascendente. Además, afaik siempre comienzan con el reloj interno, el software cambia a cristal externo y pll. El problema está en el código de inicio proporcionado o generado por la herramienta CubeMX, lo que hace que sea un poco difícil ejecutar el código de usuario antes de la configuración del árbol de reloj.
berendi - protestando
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.