Pergunta

Eu gostaria de ter duas aplicações no meu flash STM32, um é basicamente uma bota eo outro a aplicação 'main'. Eu descobri como colocar cada um deles em diferentes áreas de flash, e depois de tomar um despejo de memória tudo parece que está no lugar certo.

Então, quando eu fazer um reset ele carrega o boot, toda a inicialização faz no momento é salto para a aplicação. Depurar o boot, isso tudo parece funcionar corretamente. No entanto, os problemas chega depois que eu fiz o salto para o aplicativo, ele apenas executa uma instrução (montagem) e depois salta para o boot. Ele deve ficar na aplicação indefinidamente.

A minha pergunta é, então, onde eu deveria 'salto' no aplicativo?

Parece que existem alguns pontos potenciais, tais como os vetores de interrupção, o manipulador de reset, a função principal do aplicativo. Na verdade, eu tentei todos aqueles sem sucesso.

Esperemos que isso faz sentido, eu vou atualizar a questão se não.

obrigado pela sua ajuda! Richard

Atualizações:

  • Eu tive uma volta jogar no depurador e alterado manualmente o contador do programa para a principal do aplicativo, e bem que trabalhou um encanto, por isso me faz pensar que há algo de errado com meu salto, porque não faz o programa contador de continuar após o salto?
  • Na verdade, parece ser o PSR, o 'T' fica reset no salto, se eu definir isso de novo depois do salto que continua com o aplicativo como desejo
  • Ok encontrada uma solução, parece que você precisa de ter o PC LSB set a 1 quando você faz uma sucursal ou que cai no modo 'ARM' (instrução de 32 bits em vez de 16 instruções pouco como no modo 'polegar' . Muito um pequeno problema obscuro, obrigado por me deixar compartilhar com você!
Foi útil?

Solução

Certifique-se de saltar para um endereço onde o LSB é 1. Veja este site para uma explicação: http://www.embedded.com/columns/beginerscorner/15200241?_requestid=162471

Outras dicas

Você pode querer procurar o IAP (programador no aplicativo) que lhe permite código bootload do PSORT RS232 na stm32. Comecei a usar e uma vez que fornece o código-fonte, é muito simples para modificá-lo para seus propósitos. basicamente, após um reset você pode codificar o IAP para bootload quer a partir de endereço digamos 0x08002000 ou o endereço 0x08003000. então tudo que você tem a fazer é definir um sinalizador no código do aplicativo, em seguida, dizer reiniciar e o novo aplicativo será executado Espero que isso ajude.

Richard,

Eu estava tentando fazer a mesma coisa que você conseguiu no, mas estava tendo problemas. Eu estava usando o IAR IDE e atualizado o arquivo .icf * (no diretório "proj") para colocar a minha candidatura em 0x08002000 e carregado um projeto separado no 0x08000000 que só faz um salto para o endereço no vetor de reset no 0x08002004. O código de inicialização iniciado e parece saltar para o início da aplicação, mas a aplicação falhou em algum momento durante a inicialização do IAR, terminando em uma armadilha de instrução ilegal.

Depois de single-percorrendo o código do aplicativo, eu achei que eu esqueci de definir o endereço base de vetor de interrupção para que da aplicação do. Ele ainda estava apontando para 0x08000000 e, portanto, o código enlouqueceu. Adicionando uma chamada para definir o endereço de vetor antes de ativar quaisquer interrupções resolveu o meu problema e é necessário se você deseja ter uma aplicação deslocado em flash.

Ira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top