Usando o Utilitário ST-LINK para configurar o RTC para o horário atual


9

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?


Possivelmente protegido contra gravação, a menos que um código-chave seja inserido.
Sparky256 31/05

Fico feliz em ver que você descobriu muito desde as dicas iniciais. Em geral, você deve postar uma solução como resposta, e não como uma edição da pergunta, e principalmente quando você a seguir até aqui, seria apropriado, finalmente, mudar sua aceitação para isso.
Chris Stratton

Na verdade, eu não pensei dessa maneira! Eu sinto que ainda deveria fazê-lo, embora eu gostaria que você também tivesse alguns créditos.
precisa saber é o seguinte

Quanto tempo após a programação o seu dispositivo precisa ser executado e qual a precisão da hora do dia? Eu só estou preocupado que, não importa o quão preciso seja o seu RTC, ele acabará flutuando um pouco, pelo menos se for usado por anos e seus requisitos de tempo forem rigorosos.
Timo

Ele deve funcionar por 10 anos com uma única bateria. No entanto, o esquema de tempo já é ligeiramente modificado por algum número aleatório para impedir que todos os dispositivos enviem seus dados de uma só vez. Portanto, o desvio de tempo do RTC não é grande coisa.
precisa saber é o seguinte

Respostas:


4

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)


3

Então, um dos problemas foi, como Chris Stratton apontou:

Alguns registradores .. podem não reler os valores gravados, o que poderia causar um problema na verificação.

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:

0x4000280C: 00000027

Gravando 0x00000080 em 0x4000280C ... Erro!

0x4000280C: 000000A7

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.

A opção "conectar com redefinição" permite conectar-se ao destino antes de executar qualquer instrução. Isso é útil em muitos casos, como quando o destino contém um código que desativa os pinos JTAG / SWD.

A opção "HotPlug" permite conectar-se ao alvo sem parar ou redefinir. Isso é útil para atualizar endereços RAM ou registradores IP enquanto o aplicativo está sendo executado

O arquivo em lotes funciona totalmente como eu queria! O comando agora se parece com isso:

ST-LINK_CLI.exe -c HOTPLUG -w32 <Address> <data> -w32 <Address> <data> ...

1

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.