STM32CubeIDE (вопросы и ответы)

Тут тоже никак не поискать?

Хз :man_shrugging:

Я не знаю как залезть в мозги чипа и понять что ему не нравится.

Вру, знаю: выучить английский в совершенстве и изучить все ххх страниц даташита :man_facepalming:

Вероятнее всего я что то упускаю в инициализации периферии.

И при чем тут картинка дампа памяти мк?

В моем случае общение идёт тупо по одному 4х байтному регистру.

слушай, у тебя должен формироваться файл *.list в папке debug рядом с прошивкой, если на него посмотреть, при объявлении переменной и без нее?

1 лайк

Мысль, посмотрю.

1 лайк

Это не дамп памяти, это вся память мк в реал-тайм (в том числе ОЗУ, стэк и тд).
Но советчик из меня тот ещё… )))

Короче, “дело было не в бобине”(с) (не в МК), не в памяти и не в периферии.

Прогнал отладчиком, никакого криминала не увидел, регистры в норме, а в буфер идет мусор (впрочем это и лог анализатором было видно).

Оказалось, что W25Q64 после команды чтения QuadSPI необходимо сколько то времени подумать и несколько раз прочитать регистр статуса (бит BUSY) и дождаться пока чип одумается.

Всем спасибо!

2 лайка

то-есть внутри он одноканальный ;-)))

в смысле?

так то скорость чтения на 100МГц в четырехканальном режиме очень даже достойная.

Вероятнее всего в ДШ какое нибудь упоминание есть, сделать что либо после команды чтения, но я не нашел.

для чего то ему нужна задержка, если в память укладывать по 4-ре кирпича сразу она ни к чему, а раз нужна значит внутри идут какие-то процессы

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

так что несколько микросекунд на 1 сектор не играют никакой роли.

как это вяжется с проблемой?
и ее отсутствии при объявления переменной как static?
ниче не понимаю :worried:

1 лайк

никак не вяжется, но проблема исчезла.

сам не понимаю :man_facepalming:

У тебя там массив есть , в функции. Размером с сектор.

Он размещается на стеке. Там под капотом вызывается alloca(…). Это типа malloc(), но память выделяется не из кучи, а со стека.

Размер сектора у твоей флешки (я не смотрел даташит, пардон, но имею мнение Ж)) скорее всего 4кб. Это многовато.

Надо его или malloc/free делать, или, проще всего - вытащи его наружу, сделай глобальной переменной. Статической.

Иначе есть риск перетереть стек а там уж одому богу известно, какие будут эффекты. Если ты говоришь, что стек там 0x400 байт, то это очень мало и скорее всего вылазишь за границы стека

я ж выше написал, все работает.

И если уж про стек и про буфер, я после нахождения причины, сделал три буфера по 4 КБ - все норм работает.

И да, это тестовый буфер, когда доберусь до USB накопителя, там уже все будет по другому.

1 лайк

Подозруха. В ДШ написано

BUSY is a read only bit in the status register (S0) that is set to a 1 state when the device is executing a Page Program, Quad Page Program, Sector Erase, Block Erase, Chip Erase, Write Status Register or Erase/Program Security Register instruction. During this time the device will ignore further instructions except for the Read Status Register and Erase/Program Suspend instruction (see tW, tPP, tSE, tBE, and tCE in AC Characteristics). When the program, erase or write status/security register instruction has completed, the BUSY bit will be cleared to a 0 state indicating the device is ready for further instructions.

Т.е. к чтению отношения вроде бы не имеет вовсе.

Да и про задержки при чтении я что-то в ДШ не нашел пока.

к чтению не относиться.

Подозреваю что флэшке необходим не проверка именно статусного регистра, а просто смена режима работы.

Т е банально выполнить какую либо другую операцию, не чтение QuadSPI.

Пробовал подряд чтение нескольких секторов, на первом чтении все ок, начиная со второго все ломается.

А несколько подряд сделанных запись/чтение - все ОК.

1 лайк

а если там не ноль читать можно разве

ДШ не запрещает читать.

Я же выше запостил цитату из даташита.