# 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+.

![](/files/-LKCBueF5RKvqfTLK1vb)

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

![](/files/-LKCCZXjLqlljiCkHt1J)

## Arquivos de código

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

![](/files/-LKCDYGfy5oJEDUYbNuT)

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

![](/files/-LKCE6UB6riXF92eTsYT)

## 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.

![](/files/-LKCK5ygD7poGycqJFxr)

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.

![](/files/-LKCKRPFk-_HhZHwbcGV)

## 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.

![](/files/-LKCT6ylgpwqrE9rNHxo)

### 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.

![](/files/-LKCTNtsT2VwFIECW2Zj)

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

![](/files/-LKCTrBK0YlCjc0tSUWk)

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

![](/files/-LKCURAMSiS6qEydx2hw)

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.

![](/files/-LKCUugNtwT8Yu8ZGosH)

## 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
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bit-by-bit.gitbook.io/embedded-systems/processadores-cortex-m0+/programacao/keil-uvision.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
