# Keil uVision

## Criando um projeto

Acesse o menu _**Project->New uVision Project**_. Em seguida, indique um diretório e o nome do projeto.

Selecione o dispositivo que será utilizado ou a definição genérica. Para o exemplo apresentado, utilizou-se a estrutura genérica de um dispositivo ARM Cortex-M0+.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKC1dk9AANpA9Jz8UGY%2F-LKCBueF5RKvqfTLK1vb%2FSelectDevice.png?alt=media\&token=891ef6d5-91d3-499a-8ad7-d218e8afe760)

Na próxima tela são exibidas algumas configurações que podem ser adicionadas no projeto. Para esse exemplo, nenhuma configuração será realizada.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKC1dk9AANpA9Jz8UGY%2F-LKCCZXjLqlljiCkHt1J%2FManageRunTime.png?alt=media\&token=abb07c21-90c8-4aa0-a976-a11f023d01a8)

## Arquivos de código

No painel de controle do projeto, selecione o diretório _**Source Group 1**_ e adicione um novo item ao projeto.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKC1dk9AANpA9Jz8UGY%2F-LKCDYGfy5oJEDUYbNuT%2FAddNewItem.png?alt=media\&token=11be2c05-44b2-4b2d-8447-5c5b63d55a86)

Em seguida, selecione a opção Asm File e indique o nome do arquivo.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKC1dk9AANpA9Jz8UGY%2F-LKCE6UB6riXF92eTsYT%2FAddAsm.png?alt=media\&token=2348d5cb-9191-49b0-92b2-b1cb6c5861b0)

## Ponto de entrada da aplicação: Função Main

Inicialmente será demonstrado a criação de um programa referenciado pelo nome Main. Cabe lembrar que um [programa](https://bit-by-bit.gitbook.io/embedded-systems/programacao) pode ser representado por um conjunto de instruções e dados. Para tal, as regiões de código e dados devem ser indicadas para o montador.&#x20;

### Estrutura básica de um programa

As regiões de memória são indicadas com a diretiva **AREA**.

```
AREA    NOME, TIPO, ATRIBUTOS
```

Considerando isso, a estrutura básica para a região de código é mostrada a seguir.

```
	AREA    ASM_MAIN, CODE, READONLY
	THUMB

Main
	;Instruções do programa

	END
```

{% hint style="info" %}
**CODE** representa a região de instruções

**THUMB** indica que as instruções são Thumb e o código é UAL.

**END** define o fim do arquivo.
{% endhint %}

### Exemplo de programa

Considere um exemplo simples para preencher a função main.

1. R0 = 10;
2. R1 = 0;
3. Incrementa R1;
4. Compara R1 com R0.&#x20;
5. Se forem iguais, volta para o item 1, caso contrário, executa o item 3;

```
	AREA    ASM_MAIN, CODE, READONLY
	THUMB

Main
	MOVS R0,#10  ;R0 = 10
	MOVS R1,#0   ;R1 = 0
Main_Loop
	ADDS R1,R1,#1 ;R1 = R1 + 1
	CMP R1,R0     ;Compara se R1==R0, altera flag Z em APSR se for igual
	BNE Main_Loop  ;Salta para Main_Loop se Z == 0
	B Main   ;Salto incondicional para Main

	END
```

### Construindo o programa

Para montar o programa, acesse o menu Project -> Build.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKC1dk9AANpA9Jz8UGY%2F-LKCK5ygD7poGycqJFxr%2FBuild1.png?alt=media\&token=7ebf97e5-5671-4616-a631-ceaf7f192285)

O montador notificará que faltam algumas definições no projeto. De fato, apenas o código da aplicação foi definido. No entanto, para o programa gravado no microcontrolador é necessário definir o ponto de entrada, isto é, o código que é executado quando ocorre um evento de Reset.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKC1dk9AANpA9Jz8UGY%2F-LKCKRPFk-_HhZHwbcGV%2FBuild1Output.png?alt=media\&token=7346bd43-3faf-4c15-b02f-2074a6687286)

## Inicialização do microcontrolador

A  inicialização do sistema é definida como sendo a configuração básica para que o sistema possa operar em um estado conhecido. Tal condição é iniciada quando o microcontrolador é energizado, entrando no estado de Reset. Nessa condição, o processador inicia a execução do programa a partir de um endereço especificado numa região de memória chamada de _Reset Vector_.&#x20;

Para esta etapa de inicialização é importante conhecer o [mecanismo de Reset](https://bit-by-bit.gitbook.io/embedded-systems/processadores-cortex-m0+/modos-de-operacao#suporte-a-excecoes) do microcontrolador. No Cortex-M0+, o contador de programa é inicializado com o valor do ResetVector, indicado no endereço 4 da memória de programa.&#x20;

![](https://www.embarcados.com.br/wp-content/uploads/2018/07/Vetores.png)

{% hint style="info" %}
O StackPointer (SP) é inicializado com o valor presente no endereço 0 do vetor de interrupções.

O ProgramCounter (PC) inicializado com o valor presente no endereço 4 do vetor de interrupções.
{% endhint %}

Assim, é necessário indicar para o montador essas regiões e valores. Para tal, é utilizado a macro EXPORT.

```
     AREA    RESET, DATA, READONLY
     EXPORT  __Vectors
__Vectors       
	DCD  0x20000100 	; Top of Stack
    DCD  Reset_Handler  ; Reset Handler
	;definição dos outros vetores


	AREA    ASM_MAIN, CODE, READONLY
	EXPORT Reset_Handler
	THUMB
Reset_Handler
Main
	MOVS R0,#10  ;R0 = 10
	MOVS R1,#0   ;R1 = 0
Main_Loop
	ADDS R1,R1,#1 ;R1 = R1 + 1
	CMP R1,R0     ;Compara se R1==R0, altera flag Z em APSR se for igual
	BNE Main_Loop  ;Salta para Main_Loop se Z == 0
	B Main   ;Salto incondicional para Main

	END
```

Agora, a montagem do programa não apresentará erros.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKCMadH0YBZCOQdl_HB%2F-LKCT6ylgpwqrE9rNHxo%2FBuild2.png?alt=media\&token=610217a7-97ac-47bd-93d4-987bd0f52c80)

### Simulação

Para simular a execução do programa, configure as opções de Debug. Para tal, acesse as opções de configuração do projeto.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKCMadH0YBZCOQdl_HB%2F-LKCTNtsT2VwFIECW2Zj%2FProjectOptions.png?alt=media\&token=ffa80719-6443-4a1b-b347-9435ea4ddd67)

Na tela de configuração, selecione a opção Use Simulator.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKCMadH0YBZCOQdl_HB%2F-LKCTrBK0YlCjc0tSUWk%2FDebug1.png?alt=media\&token=42513efa-49c0-4436-8ca4-07ae85f70325)

Ao retornar para tela inicial, acesse o item Debug -> Start Debug Session.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKCMadH0YBZCOQdl_HB%2F-LKCURAMSiS6qEydx2hw%2FStartDebug.png?alt=media\&token=b52ffd10-3702-4dcb-ba5c-11fee91a3649)

Ao iniciar a sessão, execute o programa instrução por instrução e observe o painel de registradores. Note os valores carregados nos registradores especiais e as definições realizadas no programa.

![](https://3269117709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGWtnbRF0hQ-zc4ofA7%2F-LKCMadH0YBZCOQdl_HB%2F-LKCUugNtwT8Yu8ZGosH%2FDebugSession.png?alt=media\&token=c2a544c2-c9f8-418c-8fab-2898c64f5608)

## Chamada da função Main

Considere agora que o código Main será chamado pela rotina de inicialização do microcontrolador. Tal procedimento é comum, sendo responsável por inicializar configurações básicas do sistema antes de chamar a função principal.

```
    AREA    RESET, DATA, READONLY
    EXPORT  __Vectors
__Vectors       
	DCD  0x20000100 	; Top of Stack
    DCD  Reset_Handler  ; Reset Handler
	;definição dos outros vetores



	AREA    ASM_INIT, CODE, READONLY
	EXPORT Reset_Handler
Reset_Handler
	;configurações do hardware
	;chamada da função main
	LDR     R0, =Main ;carrega endereço representado por Main
    BX      R0        ;salta para Main


	AREA    ASM_MAIN, CODE, READONLY
	THUMB
Main
	MOVS R0,#10  ;R0 = 10
	MOVS R1,#0   ;R1 = 0
Main_Loop
	ADDS R1,R1,#1 ;R1 = R1 + 1
	CMP R1,R0     ;Compara se R1==R0, altera flag Z em APSR se for igual
	BNE Main_Loop  ;Salta para Main_Loop se Z == 0
	B Main   ;Salto incondicional para Main

	END
```
