Detectar qual comutador momentâneo causou a ativação de uma CPU STM32

10

Edit : Esta pergunta está errada. O stm325105 possui apenas um pino de ativação. Como outras peças ST têm mais de um pino de ativação, a resposta fornecida é válida para eles.


Eu tenho um stm32f105 que possui dois botões momentâneos conectados às entradas de ativação. O processador é colocado no modo de espera. Quando qualquer um dos botões é pressionado ou o timer RTC é acionado, a CPU acorda.

O problema é que eu quero que a CPU faça coisas diferentes, dependendo de qual entrada de ativação foi acionada. De acordo com 5.3.5 do manual de referência ST stm32f105xx , nenhum registro é preservado, exceto um registro de status indicando que fomos acordados (mas não por quem) e 42 registros de backup.

O modo de espera permite alcançar o menor consumo de energia. Baseia-se no modo de aprofundamento Cortex ® -M3, com o regulador de tensão desativado. O domínio de 1,8 V é consequentemente desligado. O PLL, o oscilador HSI e o oscilador HSE também estão desligados. A SRAM e o conteúdo do registro são perdidos, exceto para os registros no domínio de Backup e no circuito em espera.

Depois de sair do modo de espera, a execução do programa é reiniciada da mesma maneira que após uma redefinição (amostragem de pinos de inicialização, busca de redefinição de vetor, etc.). O sinalizador de status do SBF no controle de energia / registro de status (PWR_CSR) indica que o MCU estava no modo de espera.

Esta postagem no fórum ST, Como determinar a origem do Wakeup no modo de espera? , sugere que não consigo detectar qual ativação foi acionada no software. Não encontrei outras postagens lá que dessem mais esclarecimentos.

Como posso usar software ou hardware para determinar, após a ativação, qual entrada de ativação foi acionada?

Daniel Näslund
fonte
1
Tem o botão de carga até um boné e li que
PlasmaHH
1
Procurando algumas variantes do STM32F105, elas têm apenas UM pino de ativação. Qual parte você quer dizer exatamente e quais pinos?
berendi - protestando em 30/09/17
@berendi Meu STM32F105 possui, como você diz, apenas um pino de ativação. Ele está configurado no modo STOP MODE, não no modo STANDBY, como afirmei na minha pergunta. Ele usa eventos EXTI para acordar. Eu misturei o significado desses "eventos EXTI" com "pinos de ativação". Mas acho que a resposta fornecida por Olin ainda é útil se alguém precisar diferenciar entre "acordado pelo RTC" ou "acordado pelo pino de ativação" no MODO ESPERA. Alguém tem sugestões sobre como editar esta pergunta para corresponder à resposta de Olins? Uma pequena nota no início descrevendo o que há de errado? Re edição inteira? Ou devo apenas excluir a pergunta inteira?
Daniel Näslund
1
Existem controladores ST com mais de um pino de ativação, como F0, F3, L0 ou L1, onde a fonte não pode ser determinada após a saída do modo de espera, porque eles têm um único sinalizador de entrada de ativação. O ST corrigiu essa supervisão primeiro nas mais recentes séries F7 e L4, que possuem sinalizadores separados para cada entrada de ativação.
Berendi - protestando em 2/10

Respostas:

11

Como não conheço os detalhes desta parte do ST, presumo que sua descrição esteja correta.

O processador deve ser ativado logo após pressionar qualquer botão. Isso deve ser especialmente verdadeiro se houver um oscilador RC interno. Mesmo que você precise executar um cristal eventualmente por razões de precisão, talvez você possa fazer a peça começar a partir de um RC interno e depois mudar para o cristal mais tarde. Existem micros que podem fazer essas coisas, embora eu não saiba se o seu é um deles.

De qualquer forma, você lê as duas entradas o mais rápido possível após a ativação. A menos que exista algo incomum neste micro ST, isso deve variar de um ms a alguns 10s de ms no pressionamento do botão.

Para garantir que a linha ainda esteja baixa, use um capacitor para manter a linha baixa por até 100 ms após o botão ser liberado.

Por exemplo, digamos que o nível de entrada baixo lógico garantido seja 20% da tensão de alimentação. A linha é puxada para cima com um resistor e possui um capacitor para aterrar. O botão coloca a linha no chão. A linha, portanto, flutua alto e é forçada a aterrar ativamente quando o botão é pressionado. Quando o botão é liberado, a tensão decresce exponencialmente em direção à fonte.

Decaindo para 20% do valor final ocorre em 0,22 constantes de tempo. Digamos que você queira garantir que a linha fique baixa por 100 ms após pressionar o botão. Isso significa que a constante de tempo RC deve ser 450 ms. Com uma tração de 100 kΩ, a capacitância precisaria ser de 4,5 µF. Portanto, uma tampa de 10 V de 4,7 µF faria bem.

Em resumo, aqui está o circuito:

Olin Lathrop
fonte
1
Deveria ser o contrário, os STM32s acordam na borda ascendente. Além disso, sempre que eles começam com o relógio interno, a troca para cristal externo e pll é feita pelo software. O problema está no código de inicialização fornecido ou gerado pela ferramenta CubeMX, o que dificulta a execução do código do usuário antes da configuração da árvore do relógio.
berendi - protestando em 29/0917