Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32 программирование FLASH

Вт авг 14, 2012 22:25:59

пытаюсь записать данные во FLASH, зависает на ожидании завершения операции, с мануалом всё сходится
Код:
  if(FLASH->CR&FLASH_CR_LOCK)
  {
    FLASH->KEYR=FLASH_KEY1;
    FLASH->KEYR=FLASH_KEY2;//проверял, разблокируется успешно
  }
  FLASH->CR|= FLASH_CR_PG;
  *addr=(uint16_t)data;
  while(FLASH->SR&FLASH_SR_BSY);//вот здесь всё зависает
  FLASH->CR &= ~FLASH_CR_PG;
  FLASH->CR |= FLASH_CR_LOCK;

может кто знает, что не так?

Re: STM32 программирование FLASH

Вт авг 14, 2012 22:28:49

А с примерами компилятора или к отладочным платам сходится? keil.com база знаний

Re: STM32 программирование FLASH

Вт авг 14, 2012 22:41:59

почему-то не нашёл ни того, ни другого, в интернете всего одна статья про работу с FLASH, с ней код тоже сходится, попробовал использовать стандартные функции - то же самое
Код:
FLASH_Unlock();
FLASH_ProgramHalfWord(0x08004000, (uint16_t)0x1234);
FLASH_Lock();

Re: STM32 программирование FLASH

Ср авг 15, 2012 13:09:33

Держи, мож поможет :) Такая же была проблема :)
Код:
void save_param_to_flash(uint32_t first_address_page)
{
   //unlock flash
    FLASH->KEYR=0x45670123;
    FLASH->KEYR=0xCDEF89AB;
    //set programing bit
    FLASH->CR |= FLASH_CR_PG;

    //save time
    *((uint16_t*)first_address_page) = time;
    while((FLASH->SR & FLASH_SR_BSY) != 0){;}

    //save frequency
    *((uint16_t*)first_address_page+2) = frequency;
    while((FLASH->SR & FLASH_SR_BSY) != 0){;}

    //save time_on
    *((uint16_t*)first_address_page+4) = percent;
    while((FLASH->SR & FLASH_SR_BSY) != 0){;}

    //save mode
    *((uint16_t*)first_address_page+6) = mode;
    while((FLASH->SR & FLASH_SR_BSY) != 0){;}

    //save current
    *((uint16_t*)first_address_page+8) = current;

    FLASH->CR &= ~FLASH_CR_PG;

    //lock flash
    FLASH->CR |= FLASH_CR_LOCK;
}

Re: STM32 программирование FLASH

Ср авг 15, 2012 13:46:10

к сожалению всё сходится с моим кодом, а ещё выяснилась одна деталь, зависает оно на самой строке присвоения, типа этого
Код:
*((uint32_t*)0x08004000)=0x1234;

предварительное стирание страницы делать пытаюсь, оно проходит, но не помогает
причём зависает мк так, что и прерывания не работают

Re: STM32 программирование FLASH

Чт авг 16, 2012 23:02:50

тема закрыта, стандартные функции всё-таки заработали
Ответить