STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 354
Зарегистрирован: Чт июл 24, 2014 23:09:23
Откуда: Киев

Сообщение hosturik »

[uquote="jcxz",url="/forum/viewtopic.php?p=3664249#p3664249"]Вообще по уму DMA-транзакции с SPI-шиной завершают не по завершению передачи, а по завершению приёма.[/uquote]
Спасибо за советы, попробую поэкспериментировать


При просмотре памяти (Flash) на МК STM32F030C8 в отладчике заметил очень интересную особенность.
Смещение начала памяти в этом МК 0x8000000, память по даташиту 64 килобайта (0x10000)
То есть она должна заканчиваться по адресу 0x8000000 + 0x10000 = 0x8010000
Но память заканчивается по адресу 0x8020000 (когда она заканчиваются в окне просмотра памяти появляются знаки вопроса "?")
То есть получается памяти в нем 128 килобайт. Ради интереса попробовал загрузить во влеш картинку,
чтобы занимаемое место в памяти превысило 64 килобайт и на мое удивление все работает.

То есть получается что памяти в МК STM32F030C8 на самом деле 128 килобайт, а не 64, как заявлено.
Как такое возможно? Интересно, а в других сериях также, никто с этим не сталкивался? И ОЗУ тоже больше чем заявлено? Я не знаю как можно проверить ОЗУ.
И еще интересно в STM32F030C4 вместо 16 килобайт сколько на самом деле, неужели тоже 128.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

В STM32F103C8, которые попадались мне, тоже 128кБ, хотя по даташиту 64кБ. "Лишняя" память вполне рабочая, могут быть лишь тонкости с загрузкой - нужно чтобы прошивальщик умел игнорировать значения, полученные из ID контроллера.
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 256
Зарегистрирован: Вс янв 18, 2009 20:15:27
Откуда: UA ZT

Сообщение ozzy »

STM32F030C4 сколько на самом деле
32 кб
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3664467#p3664467"]В STM32F103C8, которые попадались мне, тоже 128кБ, хотя по даташиту 64кБ.[/uquote]
Там есть 103CB, а F030C8 как бы старший в линейке, кроме того для F0 камни у которых 128К идут уже с удвоенным размеров страниц флеша... Проверил на F051C8, а F030 - это и есть F051: в скрипте линкера увеличил размер флеша и уже для буфера размером 65КБ словил HardFault.
А не, в DS конкретно для F030C8 он наоборот младший, значит у него может быть и 256К флеша :) Тогда ситуация становится еще более запутанной, с одной стороны у F030 есть DAC и TIM2, как у F051, но флеша больше у первого, т.е. получается камни разные...
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="hosturik",url="/forum/viewtopic.php?p=3664455#p3664455"]Но память заканчивается по адресу 0x8020000 (когда она заканчиваются в окне просмотра памяти появляются знаки вопроса "?")
То есть получается памяти в нем 128 килобайт. Ради интереса попробовал загрузить во влеш картинку,
чтобы занимаемое место в памяти превысило 64 килобайт и на мое удивление все работает.[/uquote]
Возможно что МК с 64К флеша - отбраковка при производстве более ёмких МК.
Например: сделали МК с 128К, начали тестить - а часть флеша не прошла тест -> ремапнули сбойные страницы в верх адресного пространства, осталось >=64К - прогнали тест - работает -> промаркировали как 64К и продали. А сбойные страницы остались физически, но производитель не гарантирует их работу. Может они по климатике тест не прошли, или там есть биты, которые не программируются, или ещё по какой причине.

PS: Это как версия - не претендую на истину.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 354
Зарегистрирован: Чт июл 24, 2014 23:09:23
Откуда: Киев

Сообщение hosturik »

jcxz Тоже так думаю. Для себя эту возможность использовать можно в единичных экземплярах, но вот в серию запускать я думаю не стоит
Реклама
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

У 407VE две области оперативки: IRAM1 0x20000000 длиной 0x20000 (128К) и IRAM2 0x10000000 длиной 0x10000 (64К).
Вопрос 1. Они же равнозначны, кроме размера? Скорость доступа к ним одинакова, 1 такт, да?
Вопрос 2. Кейл дефолтно ставит галочку на IRAM1. Если я ее сниму и поставлю поставлю на IRAM2, все облпсти (статическая часть, куча и стек) лягут в нее, это понятно. А вот правильно ли я понимаю, что IRAM1 при этом я смогу распределить самостоятельно, указав начало константой 0x2000000 и далее вычисляя адреса нужных мне областей и заполняя соответствующие указатели?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Родился
Сообщения: 9
Зарегистрирован: Ср май 06, 2015 14:21:38

Сообщение Immortal_Buka »

1) IRAM2 висит только на D-bus ядра и к ней нет доступа от остальных мастеров (DMA например)
2) Лучше определить секции в линкере и указывать их переменным (что-то типо http://www.keil.com/support/man/docs/ar ... 000009.htm)
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

Afz, смотри AN4296. Там для F3, на нем еще можно из CCM код запускать, в остальном то же самое.
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=3666367#p3666367"]Afz, смотри AN4296. Там для F3, на нем еще можно из CCM код запускать, в остальном то же самое.[/uquote]
Так и из 0x20000000 можно запускать код. А из каких областей нельзя его запускать?
По-крайней мере на F429....

Добавлено after 2 minutes 20 seconds:
[uquote="afz",url="/forum/viewtopic.php?p=3666222#p3666222"]А вот правильно ли я понимаю, что IRAM1 при этом я смогу распределить самостоятельно, указав начало константой 0x2000000 и далее вычисляя адреса нужных мне областей и заполняя соответствующие указатели?[/uquote]
А зачем так делать? Зачем забирать работу у компоновщика??? :dont_know:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="jcxz",url="/forum/viewtopic.php?p=3666423#p3666423"]Так и из 0x20000000 можно запускать код. А из каких областей нельзя его запускать?
По-крайней мере на F429....[/uquote]
Нельзя запускать код из CCM RAM(0x10000000), в том числе и на F429. Можно на более новых F3 и G4.
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

jcxz писал(а):А зачем так делать? Зачем забирать работу у компоновщика???
Это я неспешно размышляю на тему дискового кэша. Вернее, кэша для микро-SD. Там нужно будет неопределенное количество памяти, которой надо будет рулить динамически. Альтернативой, как я понимаю, будет куча, но, ИМХО, лучше уж я сам все распланирую, чем полагаться на run-time систему, исполняющую действия с кучей. Еще что-нибудь недопойму в ней, и появится какая-нибудь ерунда типа утечки памяти.

Собственно, я раньше так и делал - брал в куче максимальный объем, оставив на всякое-разное чуть больше необходимого минимума, а потом в этом взятом куске распоряжался собственными средствами. Ну, а тут оно сразу физически разделено, две области, одна 128К, вторая 64К. Вторую отдать стандартным средствам Си, а первую занять под собственные нужды, имея твёрдую уверенность, что никто, кроме моих средств туда не залезет - ни стек не наедет, ни возможные ошибки.
Immortal_Buka писал(а):1) IRAM2 висит только на D-bus ядра и к ней нет доступа от остальных мастеров (DMA например)
Это, как раз, меня пока не беспокоит - я не пользуюсь ДМА. Впрочем, спасибо, учту.

Тут другой вопрос возник. Истолкуйте мне, плз, пункт 2.1.2 документа RM0090 (стр. 62). Как истолковать "This bus is used by the core for literal load and debug access." ? Это что, запись данных по D-bus невозможна, только чтение?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="afz",url="/forum/viewtopic.php?p=3666601#p3666601"]Это я неспешно размышляю на тему дискового кэша. Вернее, кэша для микро-SD. Там нужно будет неопределенное количество памяти, которой надо будет рулить динамически. Альтернативой, как я понимаю, будет куча, но, ИМХО, лучше уж я сам все распланирую, чем полагаться на run-time систему, исполняющую действия с кучей. Еще что-нибудь недопойму в ней, и появится какая-нибудь ерунда типа утечки памяти.[/uquote]
Зачем эти кучи или вообще динамически распределять? Какой толк?
Просто выделить статически массив и в нём сделать кеш. Так будет и проще и экономнее по памяти.
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Подскажите по usart в stm32f4 когда данные из Transmit dataregister (TDR) попадут в в Transmit Shift Register ?

В общем я хотел в прерывании по TC сначала закинуть 1 байт в регистр DR и тут же настроить DMA на передачу массива.
И от этого ожидал сначала передачу 1 байта, так как думал что Transmit Shift Register уже занят, а потом запуск DMA по событию TXE.
Но такой финт не заработал(сразу выдается массив через DMA), возможно из за того что данные из Transmit dataregister попадают в Transmit Shift Register после КЛОК usart (в от скорости передачи?) и DMA просто перезаписало первый байт который я туда закинул.

Я конечно сделаю это нормально сначала передам 1 байт и в прерывании по завершению его вызову DMA. Но все же интересно почему такой финт не сработал.

PS: Запихать этот 1 байт в массив сложно да и он всего 0, по этому решил сделать так.
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="pokk",url="/forum/viewtopic.php?p=3674583#p3674583"]Подскажите по usart в stm32f4 когда данные из Transmit dataregister (TDR) попадут в в Transmit Shift Register ?
В общем я хотел в прерывании по TC сначала закинуть 1 байт в регистр DR и тут же настроить DMA на передачу массива.
И от этого ожидал сначала передачу 1 байта, так как думал что Transmit Shift Register уже занят, а потом запуск DMA по событию TXE.[/uquote]
Попадёт он тогда, когда TXE выставится. Через сколько конкретно тактов: раз это не оговорено даташитом - значит поведение не гарантируется. Возможно, что копирование в сдвиговый регистр производится в момент завершения передачи стартового бита. Как версия. Но закладываться на это не надо, даже если и так в данном конкретном чипе. Потому что выйдет новая ревизия - и может измениться.

[uquote="pokk",url="/forum/viewtopic.php?p=3674583#p3674583"]Я конечно сделаю это нормально сначала передам 1 байт и в прерывании по завершению его вызову DMA. Но все же интересно почему такой финт не сработал.[/uquote]
Не обязательно. Можно использовать DMA с двойным буфером: в первый как раз и положить этот байт. Тогда прерывания не нужно.
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Добрый день, забираю данные у АЦП с помощью DMA, все работает правильно. Если начинаю забирать данные по прерыванию значение которое измеряет АЦП уменьшается на 200 отсчетов. ПОдскажите пожалуйста возможные причины такого поведения?
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="baghear",url="/forum/viewtopic.php?p=3674848#p3674848"]Добрый день, забираю данные у АЦП с помощью DMA, все работает правильно. Если начинаю забирать данные по прерыванию значение которое измеряет АЦП уменьшается на 200 отсчетов. ПОдскажите пожалуйста возможные причины такого поведения?[/uquote]
Вангую, что меряете через АЦП напряжение питания МК. С появлением высокочастотных прерываний от АЦП загрузка CPU увеличивается => увеличивается потребление МК => проседает питание. :)
Но скорее всего - что-то с синхронизацией работы АЦП и забора данных с него. Заочно поставить диагноз вряд-ли возможно.
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Думаю Вы правы, надо проверить!!! Спасибо!!!
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

[uquote="baghear",url="/forum/viewtopic.php?p=3674848#p3674848"]Добрый день, забираю данные у АЦП с помощью DMA, все работает правильно. Если начинаю забирать данные по прерыванию значение которое измеряет АЦП уменьшается на 200 отсчетов. ПОдскажите пожалуйста возможные причины такого поведения?[/uquote]

200 это очень много (если идет речь о 12-ти битном АЦП).

Лично я бы смотрел в сторону аналоговой части. Например если подключить если поставить делитель из пары резисторов по 10 КОм (и не поставить конденчсатора) то легко может быть такая разница в зависимости от частоты работы ADC.
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Проверил с питанием все ок!!!

[uquote="balmer",url="/forum/viewtopic.php?p=3675615#p3675615"][uquote="baghear",url="/forum/viewtopic.php?p=3674848#p3674848"]Добрый день, забираю данные у АЦП с помощью DMA, все работает правильно. Если начинаю забирать данные по прерыванию значение которое измеряет АЦП уменьшается на 200 отсчетов. ПОдскажите пожалуйста возможные причины такого поведения?[/uquote]

200 это очень много (если идет речь о 12-ти битном АЦП).

Лично я бы смотрел в сторону аналоговой части. Например если подключить если поставить делитель из пары резисторов по 10 КОм (и не поставить конденчсатора) то легко может быть такая разница в зависимости от частоты работы ADC.[/uquote]

Судя по тому, что с питанием все хорошо факт на лицо.
Ответить

Вернуться в «ARM»