Mensagem

"Sonhar mais um sonho impossível, lutar quando é fácil ceder, vencer o inimigo invencível, negar quando a regra é vender."
Miguel de Cervantes.

"Os microprocessadores RISC funcionam a partir do princípio genial de se encarregar das coisas mais fáceis e deixar todas as partes difíceis para outras pessoas resolverem."
Douglas Adams.

Protocolo 1 Wire usando UART com o STM32

   O protocolo 1 wire é muito interessante para uso de somente um pino de I/O de um microcontrolado. Protocolo simples e baseado em janelas de tempo entre os sinais. Todavia, o uso de atrasos para escrita e leitura do pino pode resultar em perda de desempenho e complicar a vida do programador. Isso ocorrerá se a temporização for feita através da execução de laços vazios.
   Visando superar essas complicações e otimizar a programação e desempenho do microcontrolador, a Maxim (compradora da Dallas Semiconductor Corp. , que criou o protocolo), apresenta uma nota de aplicação para realizar a comunicação 1 wire empregando o protocolo serial simples (UART). 

   O detalhe está em trocar a taxa de transmissão entre 9600 e 115200 bps. No Reset usa-se 9600 e envia-se o dado 0xF0. Para escrita e leitura, 115200 bps. Na escrita de 1 lógico envia-se 0xFF, de 0, 0x00. Na leitura se envia 0xFF para cada bit a ser lido, retorno 0xFF significa bit 1. O uso da UART é, portanto, simples e prático.
   A comunicação deve ser configurada para 8 bits de dados, um bit de parada, sem bit de paridade.

   A seguir código exemplo para o DS80B20 (sensor de temperatura), empregado para um Corte-M0+ da STM, baseado na camada de abstração de hardware (HAL). Os detalhes foram suprimidos, pois a ideia é apresentar o algoritmo básico.


//--------------------------------------------------------------------------
// 1 WIRE functions - UART 2
//--------------------------------------------------------------------------
// 1 WIRE functions - UART 2
void reset_1w()
{
unsigned char  buff[2];
buff[0]=0xF0;

huart2.Init.BaudRate = 9600; // para o reset a taxa deve ser 9600
HAL_UART_Init(&huart2);

HAL_UART_Transmit(&huart2, buff, 1, HAL_MAX_DELAY);

huart2.Init.BaudRate = 115200; // 115200 para rescrita e leitura
HAL_UART_Init(&huart2);
}
//--------------------------------------------------------------------------
void write_byte_1w(unsigned char data)
{
uint32_t i;

for(i=0; i<8; i++)
{
if(tst_bit(data,i))
USART2->TDR = 0xFF; // logico 1 envia FF
else
USART2->TDR = 0x00; // logico 0 envia 00

HAL_UART_Receive(&huart2, (uint8_t *)aRxBuffer, 1,0xFFFF);
}
}
//---------------------------------------------------------------------------
unsigned char read_byte_1w()
{
unsigned int i;
unsigned char dado = 0; // todos os bits são zero por default

for (i=0;i<8;i++)
{
   USART2->TDR = 0xFF; // para ler um bit envia FF

   HAL_UART_Receive(&huart2, (uint8_t *)aRxBuffer, 1,0xFFFF);

   if(aRxBuffer[0] == 0xFF) //se for igual a FF o bit é um, zero se contrário
      set_bit(dado,i);

}
return (dado);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------


//DS18B20 - uma conversão

reset_1w(); //reset do sensor (a resposta de presença é retornada mas não avaliada).
write_byte_1w(0xCC); //comando para pular ROM (só 1 dispositivo no barramento).
write_byte_1w(0x44); //manda iniciar a conversão
HAL_Delay(750);
reset_1w();
write_byte_1w(0xCC);
write_byte_1w(0xBE); //avisa que quer ler a memória

temp_LSB = read_byte_1w();//só interesse em ler os dois bytes da temperatura
temp_MSB = read_byte_1w();


temp_16bits = (temp_MSB<<8) | (temp_LSB);

if (temp_MSB > 7)
{
  temp_16bits = 0xFFFF - temp_16bits + 1; 
  sinal = '-';
}
else
  sinal = '+';

  temperatura = (5*temp_16bits)/8;


STM32F103C8 - Attolic TrueStudio. Acabou pra ti, ATMEL!

   Atualmente os microcontroladores da ST estão com alta popularidade, bombando com os projetistas. Essa fama se deve principalmente ao preço e as ferramentas de desenvolvimento disponíveis. Uns U$ 2 pela placa de desenvolvimento (conhecida por Blue Pill) e U$5 pelo gravador depurador (ST-Link V2)! Dá um banho no Arduino Due e no ICE!  Só o ICE (depurador e gravador da Atmel) custa + de U$ 100 (claro que faz muitas coisas) e o Due (U$ 12) possui mais poder de processamento, mas para nós mortais, querendo programar um mísero ARMzinho...

Resultado de imagem para STM32F103C8 blue pill



Resumo das Principais Características do STM32F103C8:
  • Processador de 32 bits (ARM - Cortex-M3).
  • 64 kB de memória Flash.
  • 20 kB de memória RAM.
  • 72 MHz de frequência de operação máxima.
  • Controlador DMA para 7 canais
  • 7 Timers de 32 bits com várias funções + Systick Timer
  • RTC
  • USB 2.0
  • 3 UARTs
  • 2  I2Cs
  • CAN
  • 2  SPIs
  • 2 ADCs de 12 bits de 1 Msps (com sensor de temperatura interno), 10 canais.
  • 37 GPI/Os.
  • Modos para economia de energia.

   Agora a ST disponibilizou a pouco uma IDE de desenvolvimento totalmente grátis, o Atollic TrueStudio (que é baseado no Eclipse) e roda infinitamente melhor que o Atmel Studio. Todavia, a maioria dos projetistas adota o Eclipse como IDE. Fora isso, a ST ainda disponibiliza o CubeMX, programa para configuração dos periféricos do microcontrolador, que, como todo programador sabe, no ARM é o "cão chupando manga", o que facilita sobremaneira o início da programação. E sua camada de abstração de hardware (HAL) parece muito mais simpática e fácil de usar que a ASF (Atmel Software Framework ). No Cube basta alguns cliques nos pinos e a seleção do que se deseja é muito fácil. Detalhe: agora que a Atmel foi adquirida pela Microchip, será que terá maior didática e ferramentas baratas e eficientes?
   Bom, a seguir disponibilizo alguns programas teste para ajudar algum iniciante e meus alunos. Ressalva que não estão 100%, foram exemplos feitos rapidamente. Os programas foram desenvolvidos no Atollic e alguns com a ajuda do Cube.

Pisca LED: possui funções de atraso feitas com assembly, como atraso_ms( ) e atraso_us( ); apresentada a função de atraso feita com o timer Systick (em ms); também função para contagem de ciclos gastos em determinado trecho do código empregando o DWT (Data Watchpoint Trace). Obs.: as funções feitas em assembly apresentam contagem de ciclos dobrados para frequência de trabalho acima de 24MHz (se deve a forma de implementação do STM32F103C8).

Pisca_LED_HAL: pisca LED utilizando o Hardware Abstraction Layer  do STM.

UART: teste simples para uso da interrupção da UART3, inclui biblioteca de funções para trabalho com a UART.

USB_HAL: programa para enviar dados pela USB do STM32, configurado para se tornar uma porta Comm virtual.

FreeRTOS_HAL: exemplos de uso do Free RTOS, empregando o CubeMX. Os exemplos são baseados na apostila Using Free RTOS Real Time Kernel de autoria de Richard Barry. Apresenta funções para gerar interrupção por software empregando alguma interrupção não empregada efetivamente (emprega CMSIS), e função para a geração de números pseudo-aleatórios com o algoritmo LFSR.

FreeRTOS_LCD5110_Joystick: emprego do Free RTOS para acionamento do LCD Nokia5110 e de um Joystick, com um botão e dois eixos. Leitura do ADC utilizando DMA.

Existem inúmeros vídeos e material didático disponíveis na internet, explicando detalhadamente o uso do CubeMX e  do Atollic True Studio. Referências técnicas podem ser encontradas no site da ST: www.st.com