AHTOXA, спасибо но я по ссылке ничего не понял( непривычный там си..
я попробовал вот такой пример как везде предлагают:
CODE
define FLASH_KEY1 ((uint32_t)0x45670123) // ключи для снятия защиты памяти
#define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
#define FLASH_PAGE_SIZE ((uint16_t)0x400) // размер страницы 1 кб
#define WRITE_START_ADDR ((uint32_t)0x08003800) // запись с 15го килобайта
//-----------------------стирание
void Erase_flash (u16 adr)
{
u16 dst = WRITE_START_ADDR + adr; // вычисление места записи
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
FLASH->CR |= FLASH_CR_PER; /* Page erase */
FLASH->AR = dst;
FLASH->CR|= FLASH_CR_STRT; /* Start erase */
while ((FLASH->SR & FLASH_SR_BSY) != 0 ); /* Wait end of eraze */
FLASH->CR &= ~FLASH_CR_PER; /* Page erase end */
FLASH->CR |= FLASH_CR_LOCK; /* Lock the flash back */
}
//-----------------------запись
void Write_flash (u16 Data, u16 adr)
{
u16 dst = WRITE_START_ADDR + adr;
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
FLASH->CR |= FLASH_CR_PG;
while ((FLASH->SR & FLASH_SR_BSY) != 0 );
*(__IO uint16_t*)dst = (uint16_t)Data;
while ((FLASH->SR & FLASH_SR_BSY) != 0 );
FLASH->CR &= ~FLASH_CR_PG;
FLASH->CR |= FLASH_CR_LOCK; /* Lock the flash back */
}
у меня вылетает в бесконечное прерывание проц(
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
частота 72 мегагерца от HSE кварца 25мег
флэш с двумя пропусками настроенна:
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
вот так в майне запись делаю:
Erase_flash (1);
Write_flash (3030, 1);
вот так ограничил память программ
define symbol __ICFEDIT_region_ROM_end__ = 0x08003000;//было 0x080FFFFF
но виснет! что делать?(
Сообщение отредактировал super_puper - Jun 3 2013, 02:35