Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
2 / 2 / 1
Регистрация: 02.11.2017
Сообщений: 60
1

как правильно записывать данные на flash

24.01.2020, 21:34. Просмотров 344. Ответов 0

Доброго времени суток. Пытаюсь на flash записать последовательно данные и потом их проверить. Но как итог ошибки - считанные значения не соответствуют заданным. То есть первый m_assert не проходит, со вторым все ОК. как так??? В чем может быть ошибка? Использую дискавери.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stm32f4xx.h>
#include <stdbool.h>
 
#define DEVICE_ADDRESS 0x08007F00
#define DEVICE_SECTOR FLASH_Sector_1
#define SWITCH_DELAY ((uint32_t)2000000)
#define MAX_ELEMENTS 5
 
#define GREEN           (GPIO_Pin_12)
#define ORANGE          (GPIO_Pin_13)
#define RED             (GPIO_Pin_14)
#define BLUE            (GPIO_Pin_15)
 
void init(void);
void m_assert(const bool);
void blink_led(GPIO_TypeDef*, uint16_t);
uint32_t ReadDeviceAddress(uint32_t);
void WriteDeviceAddress(uint32_t, void *);
 
int main(void) 
{
    init();
    
    uint32_t cur_addr = DEVICE_ADDRESS;
    uint32_t cur_value;
 
    FLASH_Unlock();
    FLASH_EraseSector(DEVICE_SECTOR, VoltageRange_3);
 
    for(uint32_t i=0; i<MAX_ELEMENTS; ++i) 
    {
        cur_value = i+1;
        if (FLASH_ProgramWord(cur_addr, cur_value) == FLASH_COMPLETE) {
            blink_led(GPIOD, ORANGE);
        }
        m_assert(ReadDeviceAddress(cur_addr) == cur_value == i+1);
        cur_addr += sizeof(uint32_t);
    }
    
    FLASH_Lock();
 
    blink_led(GPIOD, BLUE);
 
    while (1) {
        cur_addr = DEVICE_ADDRESS;
        for(uint32_t i=0; i<MAX_ELEMENTS; ++i) 
        {
            cur_value = ReadDeviceAddress(cur_addr);
            m_assert(cur_value == (i+1));
            cur_addr += sizeof(uint32_t);
        }
        blink_led(GPIOD, BLUE);
    }
    return 0;
}
 
void init() 
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
 
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed   = GPIO_Medium_Speed ;
    GPIO_InitStructure.GPIO_OType   = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_NOPULL;
 
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
}
void m_assert(const bool flag) 
{
    if (flag) {
        blink_led(GPIOD, GREEN);
    }
    else {
        blink_led(GPIOD, RED);
    }
}
 
void blink_led(GPIO_TypeDef* port, uint16_t pins) 
{
    GPIO_SetBits(port, pins);
    for(uint32_t i=0; i<SWITCH_DELAY ; ++i) ;
    GPIO_ResetBits(port, pins);
    for(uint32_t i=0; i<SWITCH_DELAY ; ++i) ;
}
void WriteDeviceAddress(uint32_t address, void *num)
{
    FLASH_Unlock();
    FLASH_EraseSector(DEVICE_SECTOR, VoltageRange_3);
    FLASH_ProgramWord(address, *(uint32_t *)num);
    FLASH_Lock();
}
uint32_t ReadDeviceAddress(uint32_t address)
{
    return (*(volatile uint32_t*) address);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2020, 21:34
Ответы с готовыми решениями:

Как правильно записывать данные в файл?
Пишу в файл построчно. Файл получается достаточно большой. Сейчас он выходит в 2 гига. А объём...

Как правильно записывать данные в MySQL?
подскажите, как быть!! осталось немножко, но никак не могу разобраться с тем, как информацию в БД...

Как правильно параллельно записывать данные в файл из двух потоков?
Есть Action в нем вызывается метод, который пишет некую Data в текстовый файл: public...

как в макромедии Flash записывать файлы в swf?
Всем привет. Решил занятся флеш курсами. Возникли такие вопросы. Может кто подскажет нормальный...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2020, 21:34

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как правильно записывать выражения на с#
например, у меня тип переменных double и выражение такое y=(x-2)^2/(x*Math.sqrt(4-x)) .Как его...

Как правильно записывать установщик xp на флешку?
Почему windows 7 и другие виндовсы, через UltraISO(и другие программы), на диск/usb пишет без...

Как правильно записывать в базу данных
Имеется ввиду, как работать при записи данных на сервер с функциями php 5.4, чтобы правильно...

Как правильно записывать составные условия
Задание: Створити програму, що визначає належить крапка з заданими координат ами X,Y . #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.