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?