Я пишу во флеш полусловами (uint16_t), как и положено
Код
FLASH_Status WriteFlash(void* src, void* dst, int len)
{
uint16_t* srcw = (uint16_t*)src;
volatile uint16_t* dstw = (uint16_t*)dst;
FLASH_Status status = FLASH_COMPLETE;
FLASH->CR |= FLASH_CR_PG; /* Programm the flash */
while (len)
{
*dstw = *srcw;
while ((FLASH->SR & FLASH_SR_BSY) != 0 )
if (*dstw != *srcw )
{
status = FLASH_ERROR_PROGRAM;
break;
}
dstw++;
srcw++;
//len = len - sizeof(uint16_t);
len--;
}
FLASH->CR &= ~FLASH_CR_PG; /* Reset the flag back !!!! */
return status;
}
допустим пишу структуру
Код
typedef struct G_MOTOR_DATA_S
{
uint8_t debug;
uint8_t service;
uint8_t current_mot_num;
uint8_t storage;
uint32_t max_pos_diff;
uint32_t max_pos_diff_count;
uint32_t pwm_min;
uint32_t pwm_max;
uint32_t pwm_delta;
uint32_t max_stabdel;
//run_time
uint32_t pos_diff_count;
uint32_t stabdel_count;
} GLOB_MOTOR_DATA;
#define GLOB_MOTOR_DATA_HALF_WORD_CNT 18
соответственно размер в uint16_t - 18.
тестирую
Код
glob_mot_data.debug = 0x01;
glob_mot_data.service = 0x01;
glob_mot_data.current_mot_num = 0x02;
glob_mot_data.storage = 0x02;
glob_mot_data.max_pos_diff = 0xAA;
glob_mot_data.max_pos_diff_count = 0xAA;
glob_mot_data.pwm_min = 0xBB;
glob_mot_data.pwm_max = 0xBB;
glob_mot_data.pwm_delta = 0xCC;
glob_mot_data.max_stabdel = 0xCC;
size = GLOB_MOTOR_DATA_HALF_WORD_CNT;
addr = (uint32_t *)(flash_page + offset);
status = WriteFlash(&glob_mot_data, addr, size);
смотрим в память и что мы видим (на картинке)? растояние между полями не uint32_t а два uint32_t. как так?
категорически извиняюсь. моя ошибка. неправильно посчитал.
Сообщение отредактировал Jenya7 - Feb 19 2018, 10:12
Эскизы прикрепленных изображений