Добрый день!
Занимаюсь разработкой загрузчика для STM32F105R8T6.
Согласно документации на семейство микроконтроллеров запись во флеш память осуществляется 16-битными полусловами.
У меня появилась необходимость записать в ячейку памяти с четным адресом 1 байт, а затем(то есть не одновременно 2 байта, а 1 за 1, в общем случае между этими записями могут быть еще какие-то операции) с последующим нечетным адресом еще 1 байт. Перед записью все используемые ячейки памяти стерты. Поскольку писать можно только 16-битными полусловами, приходится сделать следующее для записи(привожу 2 варианта в разном порядке):
uint32_t address = 0x08006040;
FLASH_ProgramWord_16(address,0xFF22);
FLASH_ProgramWord_16(address,0x11FF);
uint32_t address = 0x08006040;
FLASH_ProgramWord_16(address,0x11FF);
FLASH_ProgramWord_16(address,0xFF22);
Сама процедура записи(но вряд ли дело в ней):
void FLASH_ProgramWord_16_was(uint32_t Address, uint16_t Data)
{
/*Разблокировать flash*/
if((FLASH->CR & FLASH_CR_LOCK) != RESET)
{
FLASH->KEYR = (uint32_t)0x45670123;
FLASH->KEYR = (uint32_t)0xCDEF89AB;
}
/* Ожидание последняя операция должна быть завершена */
while (FLASH->SR & FLASH_SR_BSY);
if (FLASH->SR & FLASH_SR_EOP)
{
FLASH->SR = FLASH_SR_EOP;
}
FLASH->CR |= FLASH_CR_PG;
*(uint16_t*)Address = Data;
while (FLASH->SR & FLASH_SR_BSY);
}
В 1 варианте получаю FF22, во втором 11FF, желанные 1122 получить не удается.
Возможно ли реализовать такую запись во флеш именно на таком микроконтроллере? И если возможно, то что я не так делаю? Спасибо.