реклама на сайте
подробности

 
 
> Запись во FLASH STM32F4
stm32f4
сообщение Jul 8 2013, 05:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098



Всем доброго дня)Программеры подскажите, что я не так делаю при записи во FLASH(STM32F4) ?
Я уже и с библиотеками и просто на CMSIS пробовал-толку нет((((((((((((

С использованием "stm32f4xx_flash.h" :

Код
    FLASH_Unlock();
    FLASH_EraseSector(FLASH_Sector_2,VoltageRange_4);
    while ((FLASH->SR & FLASH_SR_BSY) != 0 );
    FLASH_ProgramHalfWord(0x08008000,4);
    FLASH_Lock();

ну и на CMSIS :

Код
    void FLASH_WRITE_16BIT(uint32_t Address,uint16_t data)
    {
        FLASH->CR &= CR_PSIZE_MASK;
        FLASH->CR |= FLASH_PSIZE_HALF_WORD;
        FLASH->CR |= FLASH_CR_PG;
      //Запись данных по адресу Address
        *(__IO uint16_t*)Address = data;
        while ((FLASH->SR & FLASH_SR_BSY) != 0 );
        FLASH->CR &= (~FLASH_CR_PG);
    }
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
Allregia
сообщение Jul 8 2013, 10:11
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(stm32f4 @ Jul 8 2013, 07:53) *
Всем доброго дня)Программеры подскажите, что я не так делаю при записи во FLASH(STM32F4) ?


Вы не до конча прочитали документацию, хотя информация присутствует и в "stm32f4xx_flash.h" перед функцией FLASH_EraseSector:
Код
/**
  * @brief  Erases a specified FLASH Sector.
  *  
  * @param  FLASH_Sector: The Sector number to be erased.
  *          This parameter can be a value between FLASH_Sector_0 and FLASH_Sector_11
  *    
  * @param  VoltageRange: The device voltage range which defines the erase parallelism.  
  *          This parameter can be one of the following values:
  *            @arg VoltageRange_1: when the device voltage range is 1.8V to 2.1V,
  *                                  the operation will be done by byte (8-bit)
  *            @arg VoltageRange_2: when the device voltage range is 2.1V to 2.7V,
  *                                  the operation will be done by half word (16-bit)
  *            @arg VoltageRange_3: when the device voltage range is 2.7V to 3.6V,
  *                                  the operation will be done by word (32-bit)
  *            @arg VoltageRange_4: when the device voltage range is 2.7V to 3.6V + External Vpp,
  *                                  the operation will be done by double word (64-bit)
  *      
  * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM,
  *                       FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE.
  */
FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange)


А у Вас:
Цитата
Я уже и с библиотеками и просто на CMSIS пробовал-толку нет((((((((((((

С использованием "stm32f4xx_flash.h" :

Код
    FLASH_Unlock();
     FLASH_EraseSector(FLASH_Sector_2,VoltageRange_4);
     while ((FLASH->SR & FLASH_SR_BSY) != 0 );
     FLASH_ProgramHalfWord(0x08008000,4);
     FLASH_Lock();


А Вы внешнее напряжение програмирования подали, раз используете VoltageRange_4 ?
И даже если подали - использовани VoltageRange_4 предполагает запись двойными словами (64 бита), т.е. FLASH_ProgramDoubleWord а у Вас стоит FLASH_ProgramHalfWord - поэтому Вам надо использовать VoltageRange_2.

И while ((FLASH->SR & FLASH_SR_BSY) != 0 ); вызывать не нужно, просто:
Код
    
         FLASH_Unlock();
         FLASH_EraseSector(FLASH_Sector_2,VoltageRange_2);
         FLASH_ProgramHalfWord(0x08008000,4);
         FLASH_Lock();
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 04:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01362 секунд с 7
ELECTRONIX ©2004-2016