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?
Respostas:
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:
fonte