Neste artigo eu avalio o starter kit do RX111 da Renesas (agradecimentos ao André Oliveira) e também faço um apanhado geral sobre a linha RX100 da Renesas. Para aqueles que ainda não conhecem a linha RX100, trata-se de uma sub-família de microcontroladores baseada na bem sucedida série RX da Renesas. Esta linha de produtos é baseada em uma CPU de 32 bits rodando um conjunto muito eficiente de instruções CISC (de 82 a 109 instruções e a maioria delas executadas em um único ciclo de clock graças ao pipeline de 5 estágios e a unidade de execução “fora de ordem”). As linhas mais avançadas como os RX230, RX231, RX23T, RX24TRX600 e RX700 incluem também uma unidade de ponto flutuante (FPU) enquanto que os dispositivos das linhas RX100 e demais membros da linha RX200 não. Uma característica muito interessante da linha RX é que todos os modelos incluem instruções para processamento digital de sinais (DSP), desde o mais simples dos RX110! Estão disponíveis modelos de 36 pinos com 8KB de flash (RX100) até chips de 176 pinos com 4MB de flash (RX700).

Starter kit do RX111 starter kit rodando o código tutorial

A CPU RX100

Como eu já disse, os dispositivos da linha RX100 incluem uma CPU RX de 32 bits rodando a até 32MHz. Esta CPU possui um conjunto de 16 registradores de propósito geral de 32 bits (R0 a R15), um acumulador de 64 bits (para as instruções DSP) além de alguns outros registradores de controle (PC – contador de programa, BPC – backup do contador de programa, PSW – registrador de status da CPU, BPSW – backup do registrador de status, ISP – apontador da pilha de interrupção, USP – apontador da pilha de usuário, INTB – registrador da tabela de interrupção e FINTV – registrador de vetor de interrupções rápidas). Note que apesar dos registradores R0 a R15 serem considerados de propósito geral, o registrador R0 é utilizado também como apontador da pilha (SP), de acordo com o bit U do registrador PSW o SP pode ser o ISP (U=0) ou o USP (U=1). Os registradores de backup (BPC e BPSW) são utilizados com as interrupções rápidas, de forma a evitar o empilhamento e desempilhamento dos mesmos.

A CPU RX possui um conjunto de 82 instruções (73 instruções básicas mais 9 instruções DSP) e como uma máquina CISC as instruções possuem tamanho variável (VLIW), variando de um até oito bytes (a maioria das instruções possui um tamanho de 3 ou 4 bytes), permitindo uma excelente densidade de código (seria interessante comparar a CPU RX com a CPU Cortex-M3 ou M4). O pipeline de 5 estágios garante que a maioria das instruções seja executada em um único ciclo de clock (incluindo as instruções DSP como a multiplicação e acúmulo de 16×16 bits MACHI e MACLO). Estão disponíveis 10 modos de endereçamento e instruções para manipular diversos tipos de dados (bit, byte com/sem sinal, word com/sem sinal, long word com/sem sinal e strings), os  RX230, RX231, RX23T, RX24TRX600 e RX700 incluem ainda tipos de dados de ponto flutuante de 32 bits IEEE754.

O espaço de endereçamento é de 4GB com a RAM localizada nos endereços iniciais (a partir do endereço 0) e a memória flash de código localizada no topo (o último endereço da flash é 0xFFFFFFFF).

Para mais informações sobre as instruções e o modelo de programação dos RX, verifique o manual de software RX.

Estão disponíveis três modos de baixo consumo de energia: Sleep, Deep Sleep e Standby (o modo de menor consumo). O modo sleep pára a CPU, mantendo todos os demais periféricos operando (exceto o watchdog se configurado para tal), o modo deep sleep reduz ainda mais o consumo desativando os clocks do DTC (um controlador de transferência de dados), RAM e ROM (flash), mas mantendo todo o conteúdo, o modo standby faz tudo isso a ainda pára os clocks e osciladores (exceto o sub-clock, RTC e clock USB). O fabricante afirma que o consumo de energia é da ordem de 110µA/MHz quando operando no modo high-speed e de 440nA quando no modo standby. O retorno a execução saindo de um standby demora apenas 4.8µs.

Os dispositivos RX incluem ainda um módulo integrado de debug que utiliza apenas um pino (MD/FINED) para a comunicação, além do pino de reset (RES).

A Família RX100

A família RX100 compreende quatro sub-famílias:

  • RX110 (dispositivos simples para uso geral, com menos pinos, menor capacidade de memória e menos periféricos);
  • RX111 (dispositivos com interface de comunicação USB 2.0 completa);
  • RX113 (dispositivos mais avançados da linha RX100 direcionados a produtos de consumo, incluem a mesma interface USB dos RX111 e mais um controlador LCD (até 160 segmentos) e uma interface capacitiva de toque de 12 canais);
  • RX130 (dispositivos voltados ao mercado de consumo, não possuem USB e nem controlador LCD, mas incluem uma interface capacitiva de toque de 36 canais).

A memória flash de código varia de 16 a até 512KB (sem estado de espera mesmo a 32MHz), SRAM de 8 a 64KB. Todos os chips (exceto os RX110) também incluem uma flash de dados de 8KB.

A lista de periféricos inclui um ótimo conjunto de periféricos analógicos e digitais como:

  • Interface USB 2.0: capaz de operar como host, device ou OTG, inclui também circuito de detecção de carga de bateria (BC revisão 1.2), suporta transferências de controle, bulk, interrupt e isócronas e possui 10 pipes (com buffer simples de 64 bytes para os pipes 0, 6, 7, 8 e 9, buffer duplo de 64 bytes para os pipes 1, 2, 3, 4 e 5, os pipes 1 e 2 podem também operar com buffer duplo de 256 bytes para transferências isócronas). Esta interface está disponível somente nas linhas RX111 e RX113;
  • Controlador LCD: capaz de controlar LCDs de até 160 segmentos (40 segmentos e 4 planos), disponível somente nos RX113;
  • Interface capacitiva de toque: 12 canais (RX113) ou 36 canais (RX130);
  • Portas de I/O com pull-up interno configurável e modo dreno aberto configurável. A maioria dos pinos pode drenar até 8mA (máximo de 60mA para todos os pinos) e fornecer até 4mA (máximo de 40mA para todos os pinos). Existem também limites para grupos de pinos, verifique o datasheet para mais detalhes. Vários pinos de I/O também são tolerantes a 5V;
  • Portas seriais: até 8 canais assíncronos SCI (apenas na linha RX113, nas linhas RX110 e Rx111 são 3 canais), um canal I2C (até 400kbps), um canal SPI (até 16Mbps) e um canal SSI (serial sound interface, somente disponível nos RX113);
  • Timer de 16 bits MTU2: 4 canais (RX110) ou 6 canais (RX111, RX113 e RX130). A unidade MTU2 de 6 canais pode ser utilizada para controlar motores trifásicos (o chip também inclui circuito para detecção de falhas (POE) que desliga as saídas do timer no caso de falhas ou erros);
  • Timer CMT de 16 bits: 2 canais (RX110 and RX111) ou 4 canais (RX113 e RX130);
  • Timer TMR de 8 bits: 2 canais (RX130) ou 4 canais (RX113);
  • Timer de 16 bits de baixa potência (LPT) (somente nos RX113);
  • Relógio de tempo real com calendário, interrupções e alarme;
  • Watchdog independente (com oscilador dedicado de baixa potência, contador de 14 bits e função de janela);
  • Conversor A/D de 12 bits e 1Msps (com sensor de temperatura e referência interna de tensão), conversor D/A de 12 bits e dois canais (somente nos RX113), conversor D/A de 8 bits e dois canais (somente nos RX111 e RX130) e comparador analógico de 2 canais (somente nos RX113 e RX130);
  • Independent watchdog (with with a dedicated low-power clock and a 14-bit counter with window function);
  • Circuitos de clock: três osciladores internos (32MHz HOCO, 4MHz LOCO e 15KHz IWDT), oscilador de 1 a 20MHz com cristal ou fonte externa, oscilador sub-clock de 32.768Hz, PLL integrado (1x, 2x ou 4x) e circuito de detecção de falha de oscilador que pode trocar a fonte de clock automaticamente para o LOCO de 4MHz quando o clock principal falha (também dispara uma interrupção);
  • Circuito detector de baixa tensão com reset e interrupção;

Além destes periféricos, a linha RX100 inclui também alguns outros periféricos muito interessantes tais como:

  • Controlador Multi-função de pino (MPC): trata-se de um multiplexador que pode rotear sinais para diferentes pinos, facilitando o design da PCI e aumentando a eficiência. Nos chips com 64 ou mais pinos, a maioria dos sinais pode ser roteada para ao menos 2 ou três opções de pino;
  • Controlador de transferência de dados (DTC): o DTC é um módulo DMA que pode automatizar as transferências de dados entre endereços fonte e destino na memória. Ele pode trabalhar com bytes, words e long words em transferências simples ou em bloco (até 256 transferências num único disparo). O DTC pode ser utilizado para transferir dados de um buffer da SCI/SPI/I2C para um buffer em memória, para armazenar valores lidos do ADC ou transferir valores a serem convertidos pelo DAC a partir de uma tabela, etc. Os dispositivos RX incluem um arbitrador de barramento que permite a operação simultânea do DTC e da CPU (quando eles não estão acessando um mesmo tipo de recurso) de forma que quando a CPU esta lendo da memória flash de código ou lendo/escrevendo na RAM, o DTC pode acessar os registradores de periféricos ao mesmo tempo. Se a transferência envolver a RAM que esteja sendo acessada pela CPU, aí a CPU é paralisada até que a transferência do DTC seja completada;
  • Controlador de conexão de eventos (ELC): o ELC permite automatizar tarefas e a interação entre periféricos internos. O ELC pode conectar timers (MTU ou CMT), SCI, I2C, ADC, DAC, POE, DOC, I/O, DTC, etc. Com o ELC é possível iniciar uma conversão A/D ou D/A a partir de uma saída de comparação de um canal do MTU, incrementar o CMT a cada erro da SCI, iniciar uma transferência do DTC após uma conversão do ADC ou DAC, etc;
  • Circuito de operação de dados (DOC): o DOC pode adicionar, subtrair ou comparar operandos e é especialmente útil quando utilizado em conjunto com os módulos CRC e ELC;
  • Circuito de precisão do clock (CAC): compara qualquer sinal de clock interno com outro clock interno ou externo e permite detectar um desvio de frequência em qualquer fonte de clock;
  • Calculador CRC: os RX111, RX113 e RX130 incluem um circuito de cálculo de CRC que pode lidar com 3 polinomiais: um CRC8 e dois CRC16;

A família RX100 está posicionada no mercado de entrada de 32 bits e o seu principal rival é provavelmente o Cortex-M0+, mas não minha opinião, considerando a performance por MHz, os RX100 (e também os RX200) podem competir e provavelmente superar até mesmo dispositivos Cortex-M3 e Cortex-M4.

A página de seleção de produtos da linha RX100 está aqui.

RSK do RX111

O chip utilizado no starter kit do RX111 é o R5F51115ADFM, um RX111 com 128KB de flash, 16KB de RAM, 8KB de data flash num encapsulamento LQFP de 64 pinos. Relativamente a documentação, a Renesas normalmente utiliza o datasheet mais como uma visão geral do dispositivo. Informações mais detalhadas do hardware são encontradas no manual de hardware e se você quer entender sobre as instruções assembly do RX, consulte o manual de software. O kit inclui um emulador Renesas E1 e um display serial LCD que pode ser conectado a placa.

A PCI do kit inclui dois conectores USB (um mini B e outro padrão A) interligados ao RX111 e um terceiro conector mini B conectado a um RL78/G1C que vem pré-programado como uma porta serial USB (um dispositivo CDC). Os pinos RXD e TXD do RL78/G1C são conectados aos pinos da SCI1 do RX111. Há também uma memória EEPROM I2C serial de 16KB da Renesas (R1EX24016), um driver LIN (TJA1020), um trimpot (conectado ao pino P40/AN0), quatro LEDs de usuário (LED0 conectado ao pino PB7/PC1/MTIOC3B, LED1 conectado ao pino PA0/MTIOC4A, LED2 conectado ao pino P54/MTIOC4B e LED3 conectado ao pino PB6/PC0/MTIOC3D) e três teclas do usuário (SW1 conectada ao pino P30/IRQ0, SW2 conectada ao pino P31/IRQ1 e SW3 conectada ao pino PE4/IRQ4). Há diversos headers não montados que expõem a maioria dos sinais do MCU, facilitando a conexão do seu próprio hardware ao RSK do RX111.

O DVD na embalagem inclui o IDE E2 Studio, o compilador C CCRX da Renesas, muita documentação e diversos exemplos para praticamente todos os periféricos. O projeto tutorial pisca os LEDs do usuário num ritmo ditado pela posição do trimpot e também escreve algum texto no LCD. Existem muitos exemplos interessantes de utilização da USB, incluindo o modo host, um host para mass storage (para lidar com pendrives), um dispositivo CDC e um HID.

As imagens a seguir mostram o exemplo do CDC rodando na RSK do RX111. Uma vez que o projeto seja compilado no E2 Studio, tudo o que você precisa fazer é selecionar a configuração de debug (USB_PCDC) e clicar no botão debug. O IDE vai iniciar uma sessão de depuração e fazer o download do código na memória flash do MCU.

RX111_CDC_debug
Seleção da configuração de debug

Uma vez completado o download, desconecte a RSK do E1, configure o jumper J6 para a posição 2-3 (alimentação vinda do barramento USB), J9 e J12 para a posição 2-3, conecte um cabo USB entre o seu computador e o conector mini B USB0_2 na placa. O Windows vai detectar o novo dispositivo e tentará instalar o driver sem sucesso. Vá ao gerenciador de dispositivos e você encontrará um novo dispositivo (CDC USB Demonstration) com um sinal de exclamação indicando que não está funcionando.

RX111_CDC_driver
Driver não instalado

Selecione o dispositivo e selecione a opção de instalar o driver (na verdade é apenas um arquivo inf), o mesmo está dentro da pasta cdc_inf dentro da pasta do projeto. Haverá um aviso sobre o driver não assinado, apenas ignore e instale.

Uma vez instalado, uma nova porta COM será criada (a minha foi a COM27). Abra um programa terminal (eu uso o Termite). A placa permanecerá transmitindo uma mensagem até que você envie alguma coisa, então ela passará a ecoar tudo que você enviar pela COM virtual.

rx111_CDC_termite_hello
Demo CDC em operação

Por hora é isso! Eu voltarei ao RX111 em breve para explorar os periféricos e programação! Até mais!

RX111 – avaliação do starter kit e visão geral da linha RX100 da Renesas
Classificado como:                                                        

Deixe uma resposta