O que eu estava fazendo
Estou usando um microcontrolador STM32 e, para o meu projeto, preciso enviar dados em horários específicos do dia (por exemplo, às 11h e 14h). O microcontrolador precisa saber que horas são antes de eu conseguir isso. Infelizmente, tenho apenas uma comunicação unidirecional e, portanto, não posso solicitar o horário atual da rede.
Portanto, eu quero definir a hora atual, logo após terminar a programação. Eu sabia que sou capaz de gravar dados no flash usando a interface de linha de comando do ST-LINK Utility (ST-LINK_CLI) usando o seguinte comando:
ST-LINK_CLI.exe -w32 <Address> <data> -Rst
Eu escrevi um script de teste simples que grava o carimbo de data e hora do Unix em algum endereço que não esteja sendo usado atualmente pelo código.
Eu estava prestes a escrever uma função para ler o registro de data e hora e usá-lo para definir o horário do RTC. Até ler o seguinte no Manual do usuário do ST-LINK Utility :
-w32 suporta gravação em registros de memória Flash, OTP, SRAM e R / W.
Quando o manual diz que suporta a gravação nos registros R / W, isso significa que eu posso acessar diretamente os registros RTC e configurá-los? Eu tentei, mas não consigo escrever nesses registros.
Eu preferiria usar esse método, se não, pois não precisaria escrever uma função específica para lidar com isso no microcontrolador. Isso significa que eu posso definir o tempo do RTC de qualquer microcontrolador que tenhamos atualmente em uso, em vez de precisar atualizar seu código.
O que eu pretendia fazer
Para definir os registros RTC, tentei executar as seguintes etapas, conforme descrito no Manual de Referência do STM :
- definir bit DPB no registro PWR_CR
- escreva 0xCA no registro RTC_WPR
- escreva 0x53 no registro RTC_WPR
- interrompa o RTC configurando o bit INIT no registro RTC_ISR
- selecione o relógio de 1Hz escrevendo no registro RTC_PRER
- carregue a hora atual escrevendo no registro RTC_TR
- carregue a data atual escrevendo no registro RTC_DR
- inicie o RTC redefinindo o bit INIT no registro RTC_ISR
Para acessar os registros, usei os seguintes endereços:
- PWR_CR: 0x4000 7000
- RTC_WPR: 0x4000 2824
- RTC_ISR: 0x4000 280C
- RTC_PRER: 0x4000 2810
- RTC_TR: 0x4000 2800
- RTC_DR: 0x4000 2804
O que deu errado
Não consigo escrever em nenhum desses registros. Com o utilitário ST-LINK, recebo a seguinte mensagem:
Ocorreu um erro durante a gravação na memória!
Usando o ST-LINK_CLI:
Gravando 0x00000100 em 0x40007000 ... Erro!
A leitura desses registros não é um problema, mas não posso gravá-los usando o Utilitário ST-LINK ou sua Interface da Linha de Comandos.
A questão
Como gravar nos registros R / W usando o utilitário ST-LINK?
Existe algum tipo de proteção contra gravação para permitir a gravação nos registros RTC que eu ignorei?
Respostas:
Alguns registradores são válidos apenas para uma largura de acesso específica (ou seja, -w32 pode não estar correto) ou podem não reler os valores gravados que podem causar um problema na verificação.
Também pode haver restrições de sequência ou estado no acesso a coisas.
Uma opção que deveria solucionar os problemas mais concebíveis seria criar um pequeno programa para realizar o trabalho que seria vinculado à execução na RAM. Você pode substituir os dados em seu binário depois de descobrir o deslocamento, fazer o upload da versão modificada e executá-la. Ou você pode fazer com que o programa obtenha valores de uma região da RAM fora das extensões do arquivo, que você definiria antes da execução. Com um controle mais refinado do stlink, você também pode passar valores nos registros da CPU, embora possa (?) Precisar do programa alternativo de linha de comando de código aberto em vez dos ST para fazer isso (essa pequena rotina no método RAM é aliás como esse programa realiza a gravação a piscar)
fonte
Então, um dos problemas foi, como Chris Stratton apontou:
Isso significava que a verificação falhou, causando a exibição do erro, mesmo que a operação de gravação tenha sido bem-sucedida.
Abaixo está a resposta que recebo ao ler o registro PWR_ISR, definir o bit INIT e, em seguida, ler o registro novamente:
A verificação do utilitário ST-LINK verifica se o valor gravado no endereço e lido no endereço corresponde. Nesse caso, a operação de gravação foi bem-sucedida, mesmo que os dois valores não correspondam, pois o bit INIT agora está definido.
O outro problema era que eu não conseguia perceber o efeito da operação de gravação. Enquanto conectado ao microcontrolador, ele é mantido no estado de redefinição pelo ST-LINK (conhecido como "conectar sob redefinição"). Eu precisava usar a opção de conexão HOTPLUG, que se conecta ao microcontrolador sem parar ou redefinir.
O arquivo em lotes funciona totalmente como eu queria! O comando agora se parece com isso:
fonte
Acho que o que está acontecendo é que, após a gravação, uma leitura de verificação é realizada. Se o mesmo registro retornar o tempo atual em uma leitura, embora você consiga atualizar o RTC, o depurador não será realizado. É menos provável que isso explique um problema com o registro de energia (a menos que o depurador esteja acessando esse registro também sob o capô). Verifique o valor da leitura manualmente. Se houver um problema mais significativo, essa leitura poderá falhar também. Além disso, tente os outros registradores da sua lista.
fonte