31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
|
|||||||||||
1 | |||||||||||
Stm32F4 USB MSD internal flash24.12.2018, 18:03. Показов 5451. Ответов 22
Всем привет.
Уже несколько дней борюсь с кодом и не вижу где ошибка. В наличии плата stm32F429I-DiSCO. Пытаюсь на этой плате контроллер сконфигурировать как USB Devise класс MSC. Хочу записывать данные с хоста во внутреннюю flash с адреса 0x08020000 ( Из даташита: Sector 5 0x08020000 - 0x0803 FFFF 128 Kbytes). Конечно, перед записью я очищаю сектор 5 и отладчиком вижу по этому адресу 0xFF. Когда подключаю к компу то Host видит подключение и предлагает отформатировать Flash. Я соглашаюсь, и вот тут - то начинаются странности. Операция записи не работает, то есть под отладчиком я вижу, что начинаю с адреса 0x08020000 располагается что угодно, но не таблица FAT. Ок, далее я решил облегчить себе задачу и заменил flash на RAM. C RAM все работает, форматирование проходит успешно. Ок, решил сделать так. Принятый от хоста пакет перед тем как записать в RAM пишу во flash (так сказать дублирую его). Смотрю отладчиком данные во flash и RAM не совпадают. Вот код:
Хорошо пытаюсь писать во flas не содержимое массива, а индекс массива, т. е. просто счетчик. И меняю код на такой:
Где моя ошибка?
0
|
24.12.2018, 18:03 | |
Ответы с готовыми решениями:
22
STM32F4 + Xbee + USB-flash-накопитель STM32F4 + USB FLASH + DMA + USART + CAN + DSP + FreeRTOS ? stm32f407+usb msd + fatfs STM32F4xx + SD + USB MSD [РЕШЕНО] USB Audio + USB CDC на одной STM32F4 |
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
|
|
24.12.2018, 19:45 | 2 |
учитываешь ли ты то, что данные пишутся во флешь не байтами, а uint32_t мне удавалась записать и uint16_t но надежность гарантировать не могу
и писать только с в ячейки со значением 0xFFFFFFFF, хоть один бит в 0, запись не происходит
1
|
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
|
||||||||||||||||||||||||||
25.12.2018, 12:03 [ТС] | 4 | |||||||||||||||||||||||||
Попытаюсь ответить всем в порядке живой очереди.
Как только процессор стартует и попадает в main производится стирание Sector 5 0x08020000 - 0x0803FFFF 128 Kbytes. Я совершенно точно в этом уверен. St Link подтверждает это, показывая мне с адреса 0x08020000 сплошные FF. Впрочем, вот код стирания:
Накопитель на базе RAM сделан, и он работает как надо, то есть форматируется, записывает, читает файлы. Там все просто:
Для своей памяти я выбрал сектор №5 размером 128К. Не понимаю почему я не могу писать в сектор по 512 байт? Теперь у меня вопросы: Посмотрите на мой код, приведенный мной в первом посте:
В первом случае пишу:
Во втором случае делаю так:
Не понимаю почему так.
0
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|
25.12.2018, 14:43 | 6 |
Caruso,
У вас итератор i какой тип имеет? Явно не uint8_t, так как массив имеет больше 255 байт. Скорее всего uint16_t или uint32_t. Это к тому, ValeryS, Вам намекал, что по uint8_t в память не пишется, минимум uint16_t
1
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|
25.12.2018, 15:12 | 7 |
1
|
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
|
|
25.12.2018, 17:26 [ТС] | 8 |
В таблице указаны напряжения питания микроконтроллера? Тогда в моем случае я могу писать только x32 или x64. Я правильно понимаю?
0
|
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
|
||||||||||||||||
25.12.2018, 18:01 [ТС] | 9 | |||||||||||||||
Вот изменил код:
Когда пишу константу
0
|
25.12.2018, 18:10 | 10 |
Caruso, попробуйте не из usb буфера писать, а из статического массива собственного производства. Однократно, при запуске программы.
И вместо постоянного приведения типа указателя на каждой итерации, проще сразу привести указатель на массив к нужному типу.
1
|
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
|
|||||||||||
25.12.2018, 18:15 [ТС] | 11 | ||||||||||
Сейчас попробоваль в main создать массив и заполнить его счетчиком:
PS. Опередил Вас. уже сделал это. Как это сделать?
0
|
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
|
|
25.12.2018, 18:19 [ТС] | 12 |
Вот почему - то в ОЗУ из USB буфера пишется правильно, а во flash из этого буфера - неправильно.
0
|
25.12.2018, 18:35 | 13 | |||||
Как?
Например
Caruso, почему-почему... В 3 посте написал почему. Вся идея обречена на провал. И не смотрите, что у кого-то там работает. Это поделки. Добавлено через 2 минуты Caruso, вы знаете вообще, что flash надо стирать перед записью? Добавлено через 41 секунду И что стирание идёт огромными блоками, по сравнению с записью? Добавлено через 10 минут Кстати, смотреть память через jflash в данном случае - плохая идея. Вы видите уже то, что получилось после. А в отладчике могли могли бы увидеть, почему так происходит, пошагово. Хотя это и теоретически понятно.
1
|
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
|
||||||
25.12.2018, 18:35 [ТС] | 14 | |||||
Конечно знаю и более того, я это делаю:
Смотрю память Подтыкаю USB кабель к компу и форматирую.
0
|
25.12.2018, 18:48 | 15 |
Caruso, нет, вы не знаете. Точнее знаете факт, что стирание вызывается в примере от ST перед записью. Но не понимаете причин и следствия
Ну подумайте, пожалуйста Добавлено через 11 минут Для данной темы это понимание фундаментально. Без него будет так:
1
|
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
|
|
25.12.2018, 18:48 [ТС] | 16 |
Rius,
Мне не так смешно как вам. Расскажите, где моя ошибка.
0
|
25.12.2018, 18:53 | 17 |
Ну как же может быть не смешно, если ответ в 3 посте?)))
Добавлено через 2 минуты Запись во флешку это установка нуля. Стирание это установка единицы. Запись можно произвести даже одним битом. Стирание производится только большими блоками, и никак иначе.
1
|
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
|
|
25.12.2018, 18:55 [ТС] | 18 |
Прошу конкретнее дать ответ.
Мне понятно что вы написали. Но я не понимаю как это относится ко мне.
0
|
25.12.2018, 19:00 | 19 |
Это что касается флешки.
Теперь файловая система: Минимальный размер кластера 512 байт. Если это ФС от Чана, то там можно поболее поставить, но это ничего не меняет принципиально. Файловая система предназначена для дисков. Которые могут стирать и записывать сектора отдельно, и по многу раз. В случае с некоторыми внешними SPI Flash и SD Card это не проблема, т.к. минимальный юнит там меньше или совпадает с сектором ФС. Добавлено через 2 минуты И теперь вопрос, который вы абсолютно проигнорировали в 3 посте:
1
|
31 / 30 / 4
Регистрация: 22.03.2010
Сообщений: 126
|
|
25.12.2018, 19:02 [ТС] | 20 |
Винда очищает перед записью нулевой сектор, а затем пытается разместить в него что - то (FAT)?
Добавлено через 2 минуты Нули там будут
0
|
25.12.2018, 19:02 | |
25.12.2018, 19:02 | |
Помогаю со студенческими работами здесь
20
STM32F4: Самопрограммирование flash STM32F4+HY27US0821(NAND FLASH). stm32f4 скорость записи во Flash Установка Windows XP на USB HDD (USB Flash Drive, Compact Flash, .) А возможно ли драйверу программно задать, чтобы подал питание на USB-MSD, после отключения питания? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |