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

 
 
> Запись во 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
Ответов
arhiv6
сообщение Feb 19 2018, 09:44
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Где вы тут два uint32_t увидели? 0x00 0x00 0x00 0xCC - это 4 байта, 4 байта*8 бит=32 бита. Что не так?

И ещё, если вы дефайном GLOB_MOTOR_DATA_HALF_WORD_CNT задаёте размер структуры, то это неправильно, компилятор может при желании выделить всем полям по 4 байта, в том числе и для uint8_t. Вот подробнее.


--------------------
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 19 2018, 10:01
Сообщение #3


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

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



Цитата(arhiv6 @ Feb 19 2018, 14:44) *
Где вы тут два uint32_t увидели? 0x00 0x00 0x00 0xCC - это 4 байта, 4 байта*8 бит=32 бита. Что не так?

И ещё, если вы дефайном GLOB_MOTOR_DATA_HALF_WORD_CNT задаёте размер структуры, то это неправильно, компилятор может при желании выделить всем полям по 4 байта, в том числе и для uint8_t. Вот подробнее.

глаз замылился. долго тупил в экран, стал считать лишние байты.
я бы с удовольствием сделал без привязки к размеру - вместо while (len) сделать while (*srcw) но так нельзя. если только последним членом в структуре вставить какой нибудь терминатор '\0'.

я слежу чтоб все структуры были /4.

Сообщение отредактировал Jenya7 - Feb 19 2018, 10:10
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Feb 19 2018, 10:21
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Цитата(Jenya7 @ Feb 19 2018, 17:01) *
я бы с удовольствием сделал без привязки к размеру - вместо while (len) сделать while (*srcw) но так нельзя. если только последним членом в структуре вставить какой нибудь терминатор '\0'.

Или используйте #pragma pack, чтобы компилятор паковал структуру без "пробелов", или, что ещё лучше в вашем случае - избавьтесь от магической константы 18, пусть компилятор сам этот размер высчитывает: вместо
Код
#define GLOB_MOTOR_DATA_HALF_WORD_CNT  18
пишите
Код
#define GLOB_MOTOR_DATA_HALF_WORD_CNT (sizeof(G_MOTOR_DATA_S))


--------------------
Go to the top of the page
 
+Quote Post



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

 


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


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