domingo, 17 de julho de 2016

Usando o RTC interno do STM32f103c8t6


Alguns de vocês já devem ter visto essa plaquinha pela internet. À primeira vista parece um Arduino Nano ou coisa parecida, mas se você prestar atenção, descobrirá que o mcu nela encontrado, além de ser muito mais rápido que os Atmega8/168/328, rodando a 72mhz, ter mais memória FLASH do que eles (64k vs 32, 16 e 8) também possui uma série de características muito interessantes, tais como:


  • Bootloader serial permanente (você pode programá-la com qualquer conversor USB-Serial)
  • Funciona em tensões entre 2.0 e 3.6v (ou seja, se você pode alimentá-lo com uma única bateria de lítio)
  • 2 interfaces I2C
  • 3 interfaces USART
  • 2 interfaces SPI
  • Interface USB 2.0 nativa
E outras, das quais o RTC interno se mostra como um recurso interessantíssimo porque basta adicionar uma bateria de lítio ou um supercapacitor ao circuito para que você tenha um dispositivo que saiba que horas são mesmo estando desligado. Para o povo arduineiro, essa tarefa é rotineiramente realizada usando algum módulo RTC externo (como o DS1302, DS1307 e etc), que nesse caso é desnecessário, pois a ST colocou um no próprio MCU!

Tem algum datasheet da ST que explica  exatamente quais registradores devem ser escritos/lidos para que você possa utilizar o RTC, mas o que eu vou fazer aqui é o jeito mais fácil de descobrir essa funcionalidade: pegando um código pronto e adaptando-o de maneira muito sutil. O código em questão é um exemplo que vem com o pacote stm32duino: ele se chama Test_RTClock, e nada mais é do que um pequeno exemplo de utilização da biblioteca RTClock.h (também inclusa no pacote stm32duino).

Para este código funcionar, você precisará de uma bateria de lítio de 3v com o positivo ligado no pino VBAT do seu STM32. Na plaquinha azul (conhecida como bluepill), este pino é identificado com a sigla "VB".  Também é necessário ter instalada a biblioteca Time, para converter o tempo retornado pelo RTC do STM32 (que é o número de segundos que se passou desde algum dia na década de 70) em uma data humanamente legível. É só isso! Nenhum outro componente externo é necessário, além da própria bateria. Note que, para que o seu STM32 seja reconhecido pelo Windows é preciso que ele tenha um resistor pull-up de 1k5 no pino PA12 e que o driver que vem com o pacote stm32duino esteja instalado, mas isso será assunto de outra postagem.

Edit: me parece que o cristal que vem com essa placa é de qualquer frequência, menos 32.768 hkz. Depois de mais ou menos uma hora, o reloginho já estava meia hora atrasado. Modificando o código pra mostrar quantos milisegundos haviam se passado entre uma exibição e a outra, percebi que o valor variava entre 1500 e 2000 (!). O jeito foi colocar um cristal de 32.768 khz adicional entre os pinos C14 e C15. Magicamente, o período de tempo entre uma exibição e outra caiu para 1000 milisegundos exatos, e o relógio passou a funcionar precisamente.





Veja aqui o RTC em ação: