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

 
 
> Запись во FLASH, STM32F303VC
Jenya7
сообщение Feb 19 2018, 09:09
Сообщение #1


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я пишу во флеш полусловами (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
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
x893
сообщение Feb 19 2018, 11:55
Сообщение #2


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Боже мой.
Это же офигенная проблема.
Как же мы будем её решать ?
Только коллективным разумом будем сравнивать длину с размером страницы и записывать минимальное из этих чисел и передвигать указать на записанное количество и потом её же вычитать из длины и сравнивать её с нулем.
Хотя нет - это путь простой и не подходит гуру программирования.
Будем дисскутировать и делать череж ж...

Вот такой план есть - пойдет ?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 19 2018, 12:02
Сообщение #3


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата
Только коллективным разумом будем сравнивать длину с размером страницы и записывать минимальное из этих чисел и передвигать указать на записанное количество и потом её же вычитать из длины и сравнивать её с нулем.

я хочу обойтись минимальным количеством аргументов. только текущий адрес.

как бы можно и так
Код
uint32_t SpaceLeft(uint32_t page, uint32_t addr, uint32_t size, uint32_t *overflow)
{
    *overflow = 0;
    uint32_t end_of_page = (page + FLASH_PAGE_SIZE) - 1;
    
    if ((addr + size) > end_of_page)
        *overflow = 1;
    
    return  end_of_page - addr;
}

но мне не нравиться. куча аргументов.

Сообщение отредактировал Jenya7 - Feb 19 2018, 12:11
Go to the top of the page
 
+Quote Post



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

 


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


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