Perguntas Frequentes: "Microcontroladores ARM Cortex-M3 (Família LPC175x/6x da NXP): Programação em Linguagem C"

> Qual é o ambiente de desenvolvimento adotado pelo livro?

-> O livro adota o ambiente de desenvolvimento LPCXpresso IDE, cujo usuário pode depurar programas de até 256 KB (após o registro) ou compilar programas de qualquer tamanho gratuitamente. No caso da compilação, o LPCXpresso IDE pode ser configurado para gerar um arquivo .hex, o qual pode ser usado pelo Flash Magic (gratuito) para efetuar a gravação via UART0.

Clique aqui para efetuar o download do LPCXpresso IDE.
Clique aqui para efetuar o download do Flash Magic.
Clique aqui para efetuar o download dos projetos propostos no livro.

Hardwares recomendados:
- Depurador/Gravador + Placa protótipo:  LPCXpresso board com LPC1769 (EA-XPR-003 ou OM13000).
- Gravador + Placa protótipo: Projeto BROH (Brazilian Open Hardware).


> Existe algum fórum dedicado aos microcontroladores LPC175x/6x da NXP?

-> Sim. A NXP possui um fórum para todos os seus microcontroladores LPC. Clique aqui para acessar o fórum.


> Todos os pinos usados nos exemplos e projetos do livro estão relacionados aos microcontroladores LPC175X/6X. 

-> O LPCXpresso board é apenas uma ferramenta recomendada para iniciar os estudos, portanto, é necessário verificar quais pinos do LPCXpresso board correspondem aos dos exemplos e projetos.


> Como testar os projetos disponibilizados para download ?

Todos os projetos disponibilizados para download estão no arquivo "Arquivos - COD 001.rar", o qual pode ser baixado a partir do seguinte link: http://www.editoraciabooks.com.br/livro_001. Na sequência, descompacte o arquivo, abra o LPCXpresso IDE, clique em "Browse..." e informe o endereço da pasta "Codigos_ANM".


> Como gerar arquivo .hex no LPCXpresso IDE ?

Para gerar o arquivo .hex e usá-lo no programa Flash Magic, clique em "Project" -> "Properties" -> "C/C++ Build" -> "Settings" e selecione a aba "Build Steps"

- Substitua os comandos presentes no campo "Command" do "Post-build steps" pelos comandos abaixo:

arm-none-eabi-objcopy -O ihex ${BuildArtifactFileName} ${BuildArtifactFileBaseName}.hex; arm-none-eabi-size "${BuildArtifactFileName}";


> Qual é o significado da linha de código #define B7 (*(volatile unsigned int *)(0x23380680)) ?

Cria uma macro para ler ou modificar o conteúdo armazenado no endereço de memória 0x23380680, o qual pertence a região Bit-Band Alias, cujo bit 0 do registro FIO1PIN está mapeado. O registro FIO1PIN é responsável pelo controle do estado dos pinos de GPIO da porta 1.

Veja o cálculo (paginas 31 e 32) detalhado a seguir:

FIO1PIN0x2009C034 (página 260)

BIT: 0
REGIÃO BIT-BAND ALIAS (SRAM): 0x22000000 
REGIÃO BIT-BAND (SRAM): 0x20000000

ADD = 0x22000000 + [(0x2009C034 - 0x20000000) * 0x20] + (0 * 0x4)
ADD = 0x22000000 + (9C034* 0x20) + 0
ADD = 0x22000000 + 0x1380680
ADD = 0x23380680

Veja a seguir, um exemplo para o pino 4 da porta 1 (P1[4]):

FIO1PIN0x2009C034 (página 260)

BIT: 4
REGIÃO BIT-BAND ALIAS (SRAM): 0x22000000 
REGIÃO BIT-BAND (SRAM): 0x20000000

ADD = 0x22000000 + [(0x2009C034 - 0x20000000) * 0x20] + (4 * 0x4)
ADD = 0x22000000 + (9C034* 0x20) + 0x10
ADD = 0x22000000 + 0x1380690
ADD = 0x23380690

Obs: Caso tenha dificuldades em encontrar palavas-chave, use o índice remissivo do livro.


> Por que eu não consigo imprimir dados em meu display alfanumérico, usando as funções printf, puts, etc... ?

Mesmas considerações apresentadas na UART0, porém, ao invés de incluir a biblioteca "UART0_Lib.h", a "LCD_Lib.h" deve ser incluída.


> Como usar a biblioteca LCD_Lib ?

-> Placa genérica

Para usar a biblioteca LCD_Lib em uma placa genérica, a função Config_GPIO_LCD e as definições devem estar conforme a seguir:

Arquivo LCD_Lib.c

void Config_GPIO_LCD(void)
{
//Configura os pinos P1[0], P1[1], P1[4], P1[8], P1[9], P1[10] e P1[14] como GPIO.
LPC_PINCON->PINSEL2 &= ~(0b11<<0|0b11<<2|0b11<<8|0b11<<16|0b11<<18|0b11<<20|0b11<<28);
}

Arquivo LCD_Lib.h

#define B7 (*(volatile unsigned int *)(0x23380680)) //P1[0]
#define B6 (*(volatile unsigned int *)(0x23380684)) //P1[1]
#define B5 (*(volatile unsigned int *)(0x23380690)) //P1[4]
#define B4 (*(volatile unsigned int *)(0x233806A0)) //P1[8]
#define E  (*(volatile unsigned int *)(0x233806A4)) //P1[9]
#define RW (*(volatile unsigned int *)(0x233806A8)) //P1[10]
#define RS (*(volatile unsigned int *)(0x233806B8)) //P1[14]

#define D_B7(sentido) (*(volatile unsigned int *)(0x23380400))=sentido //P1[0]
#define D_B6(sentido) (*(volatile unsigned int *)(0x23380404))=sentido //P1[1]
#define D_B5(sentido) (*(volatile unsigned int *)(0x23380410))=sentido //P1[4]
#define D_B4(sentido) (*(volatile unsigned int *)(0x23380420))=sentido //P1[8]
#define D_E(sentido)  (*(volatile unsigned int *)(0x23380424))=sentido //P1[9]
#define D_RW(sentido) (*(volatile unsigned int *)(0x23380428))=sentido //P1[10]
#define D_RS(sentido) (*(volatile unsigned int *)(0x23380438))=sentido //P1[14]

-> LPCXpresso Board

Observação: Note que os pinos são diferentes dos propostos nos exemplos e projetos do livro.

Para usar a biblioteca LCD_Lib no LPCXpresso board, a função Config_GPIO_LCD e as definições devem estar conforme a seguir:

Arquivo LCD_Lib.c

void Config_GPIO_LCD(void)
{
//Configura os pinos P0[4], P0[5], P0[10] e P0[11] como GPIO.
LPC_PINCON->PINSEL0 &= ~(0b11<<8|0b11<<10|0b11<<20|0b11<<22);

//Configura os pinos P2[0], P2[1] e P2[2] como GPIO.
LPC_PINCON->PINSEL4 &= ~(0b11<<0|0b11<<2|0b11<<4);
}

Arquivo LCD_Lib.h

#define B7 (*(volatile unsigned int *)(0x23380290)) //P0[4]
#define B6 (*(volatile unsigned int *)(0x23380294)) //P0[5]
#define B5 (*(volatile unsigned int *)(0x233802A8)) //P0[10]
#define B4 (*(volatile unsigned int *)(0x233802AC)) //P0[11]
#define E  (*(volatile unsigned int *)(0x23380A80)) //P2[0]
#define RW (*(volatile unsigned int *)(0x23380A84)) //P2[1]
#define RS (*(volatile unsigned int *)(0x23380A88)) //P2[2]

#define D_B7(sentido) (*(volatile unsigned int *)(0x23380010))=sentido //P0[4]
#define D_B6(sentido) (*(volatile unsigned int *)(0x23380014))=sentido //P0[5]
#define D_B5(sentido) (*(volatile unsigned int *)(0x23380028))=sentido //P0[10]
#define D_B4(sentido) (*(volatile unsigned int *)(0x2338002C))=sentido //P0[11]
#define D_E(sentido)  (*(volatile unsigned int *)(0x23380800))=sentido //P2[0]
#define D_RW(sentido) (*(volatile unsigned int *)(0x23380804))=sentido //P2[1]
#define D_RS(sentido) (*(volatile unsigned int *)(0x23380808))=sentido //P2[2]


> Por que eu não consigo transferir dados pela UART0, usando as funções printf, puts, etc... ?

A UART0 deve estar configurada para ser a stream de saída das funções printf e puts

- Primeiramente, verifique se o projeto de biblioteca LIB_LPC1700_USUARIO está na área de trabalho. Ele deve estar presente na janela "Project Explorer", localizada no canto superior esquerdo.

Caso não esteja presente, clique na janela "Quick Access", localizada no canto inferior esquerdo, selecione a opção "Stat here" -> "Import project(s)". No campo "Project directory (unpaked)", clique em "Browse..." e indique o endereço da pasta "LIB_LPC1700_USUARIO", a qual está presente no arquivo baixado do site da Editora Cia Books.

- Em seguida, verifique se o projeto de biblioteca está vinculado a todos os projetos que estejam usando as funções printf e puts para transferir dados pela UART0. Clique no projeto de biblioteca LIB_LPC1700_USUARIO, localizado na janela "Project Explorer", clique com o botão direito no arquivo liblinks.xml, selecione "Smart update" -> "Smart update", marque a caixa "Select All" e clique em OK.

- Na sequência, verifique se as seguintes linhas estão presentes no projeto:

#include "UART0_Lib.h"

#include <stdio.h>

extern int __sys_write (int iFileHandle, char *pcBuffer, int iLength);

- O projeto deve ser compilado com a biblioteca Redlib (nohost). 

> Selecione a pasta do projeto na janela "Project Explorer", localizada no canto superior esquerdo.

> Na janela "Quick Access", localizada no canto inferior esquerdo, selecione a opção "Quick Settings" -> "Set library type" e clique na opção Redlib (nohost).

> Compile o projeto. "Project" -> "Build Project"

Observação: Veja o exemplo 6.2.
Comments