2015-03-21 2 views
1

Я ищу идеи о том, как разработать модуль программирования приложений.Стратегии разработки STM32 в прикладном программировании

Мы разработали в «C» соединительную коробку STM32F2xx для нашей системы Android. По сути, это всего лишь мультиустройство для коммуникационного моста Bluetooth. Теперь я подумываю о том, как предоставить модуль «в программировании приложений» для обновления этих блоков в будущем от последовательного порта bluetooth без физического подключения.

Для меня чтение или запись на флеш не проблема, но мне нужно понять, как процессор запускает программу, как разделить программу в разных местах вспышки и как перейти к конкретному адресу во флэш-памяти , Где я могу найти эту информацию?

+0

Я судимый использовать загрузчик IAP, который поставляется с процессором, но, как говорит ST в [AN2606] (HTTP://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf), в STM32F2 единственным способом запуска загрузчика является использование аппаратных выводов, а не программно. – rpr

ответ

2

Я намеревался оставить комментарий, но я не могу, потому что я новичок. Поэтому я попробую ответить, будь осторожен.

метод я использую для МАП:

  • Загрузите новую прошивку в безопасном месте (в ЭСППЗУ, внутр вспышки и т.д. ...)
  • Проверьте целостность прошивки против его хэш для пример
  • Скопируйте подпрограммы FLASH-программирования внутренней вспышки CPU в SRAM.
  • Отключить ВСЕ прерывания
  • Вызвать программы FLASH-программирования.
  • Trigger запрос сброса программного обеспечения для загрузки новой прошивки

Теперь выше метод работает, если обновление всей прошивки процессора. Также предполагается, что во время программирования вспышки вам не нужны прерывания. Если вам нужно иметь прерывания во время программирования вспышки, это немного сложнее. Вы должны сделать несколько дополнительных шагов, прежде чем вы вызовете программы программирования Flash, чтобы скопировать все связанные с прерываниями коды в SRAM.

  • Загрузите новую прошивку в безопасном месте (в ЭСППЗУ, внутр вспышки и т.д. ...)
  • Проверьте целостность прошивки на его хэш, например
  • Копирование подпрограммы для FLASH-программировании внутренняя вспышка CPU в SRAM.
  • Отключить все прерывания
  • Выделяют достаточно барана, чтобы соответствовать векторы.
  • Копирование векторов на этот адрес
  • Включить прерывания, нужно во время программирования флэш-памяти.
  • Вызвать программы FLASH-программирования.
  • Trigger запрос сброса программного обеспечения для загрузки новой прошивке

Одна важная вещь

Этот метод имеет очень сложная часть. Это вызовы между кодом, который у вас есть в SRAM. Компилятор связывает имена функций с адресами в ячейке памяти 0x0800000 (которая является вспышкой). Например, функция void flash_byte(uint32_t address, uint8_t byte); живет где-то во флеше.Когда вы копируете эту функцию в ram, скажем, до 0x20001000, вы должны быть конкретными в вызове функции. Помните, что вы пытаетесь стереть всю флеш-память и перезаписать ее, вы не можете вызывать функции со вспышки. Метод, который я использую, - это вызов с помощью указателей функций. Для экс:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

/* 
* Function pointers 
*/ 
typedef void (*flash_write_ft) (void); 
typedef void (*flash_sub_call_ft) (uint32_t lala); 

flash_write_ft  flash_write_pointer = (flash_write_ft)0; 
flash_sub_call_ft flash_sub_call_pointer = (flash_sub_call_ft)0; 

/* 
* Helper functions 
*/ 
size_t get_function_size (uint32_t *address) { 
    size_t s=0; 
    // ... 
    // s = calculate size; 
    return s; 
} 

int copy_function (uint32_t *from, uint32_t *to, size_t s) { 
    // ... 
    return 0; // OK!! 
} 

/* 
* Flash programming functions 
*/ 
void flash_sub_call (uint32_t lala) { 
    // lala tata 
} 

void flash_write (void) { 
    uint32_t foo; 
    // ... 
    flash_sub_call_pointer (foo); // call via pointer here 
    // ... 
} 

int main(void) { 
    size_t s; 
    uint32_t *add; 

    // Get firmware, check integrity etc... 

    // copy to ram 
    s = get_function_size ((uint32_t*)&flash_sub_call); 
    add = (uint32_t*)malloc (s); 
    copy_function ((uint32_t*)&flash_sub_call, add, s); 
    flash_sub_call_pointer = (flash_sub_call_ft)add; 

    s = get_function_size ((uint32_t*)&flash_write); 
    add = (uint32_t*)malloc (s); 
    copy_function ((uint32_t*)&flash_write, add, s); 
    flash_write_pointer = (flash_sub_call_ft)add; 

    // IAP 
    flash_write_pointer(); 

    return EXIT_SUCCESS; 
} 

В этом примере все вызовы функций с помощью указателей, указывающих в ОЗУ, поэтому при копировании их в оперативной памяти, они будут работать.

Для дополнительной информации:

1) flash programming manual 2) Cortex-m3 programming manual

Смежные вопросы