А в stm32f30x.h для флэша только два значения: #define FLASH_ACR_LATENCY_0 ((uint8_t)0x01) /*!< Bit 0 */ #define FLASH_ACR_LATENCY_1 ((uint8_t)0x02) /*!< Bit 1 */ Надо поискать что для каких частот.
Может, кто по опыту ткнёт меня носом, что я делаю не так. Пытаюсь "запустить" ЦАП (кристалл stm32f051). Сконфигурировал TIM6 делать прерывания и TRGO сигналы:
Вроде, ничего сложного. выдаю 1кГц "синусоиду". Но, изредка на осциллограмме проскакивали "ошибки". Я даже снизил частоту в 10 раз, но ошибки врё равно проскакивают. И независимо, использую update event TIM6 как триггер или нет.
Я бы понимал, что другое прерывание "тормозит" это. Но ведь видно что значения "перескакивают"
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Может, кто по опыту ткнёт меня носом, что я делаю не так.
делал дтмф синусоиду на таком же мк - чисто было. Что-то с указателем похоже не то и sizeof массива так, наверное, не подсчитать - прогнал на пк в VS, немного по другому, - работает.
sizeof() работает "правильно", пока размер элементов равен байту. Впрочем, и во всех других случаях тоже должен. Я лоханулся в другом месте. Массив назвал константным, но не назвал статическим. Поэтому, он оказывался почему-то иногда в немного другом месте памяти. Наверное, надо указывать еще какой-то модификатор, если хочется его держать в памяти программ.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Кстати, кто-нибудь помнит навскидку, можно для DMA указать в качестве источника область во флеше? Работать оно будет? Типа, как в предыдущей задаче, массив const и гоним таблицу с синусом в DAC, только через DMA.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Но вот у меня нет уверенности (больше), что этот массив находится в памяти программ.
И еще вопрос, если я хочу разместить в памяти большой массив данных - как это сделать, не перегоняя в текстовый вид? Как бы сделать так, чтобы линкер простой raw файл закинул в память и слинковал с моей функцией. Хм, с адресом проблем особых не вижу, а вот с размером как быть?
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Но вот у меня нет уверенности (больше), что этот массив находится в памяти программ.
Если знаешь адрес начала массива, значит знаешь и в какой области памяти этот массив обитает.
Цитата:
И еще вопрос, если я хочу разместить в памяти большой массив данных - как это сделать, не перегоняя в текстовый вид? Как бы сделать так, чтобы линкер простой raw файл закинул в память и слинковал с моей функцией. Хм, с адресом проблем особых не вижу, а вот с размером как быть?
У твоего F051 не настолько много флеша, что в него влезали большие массивы Конверть в текстовый вид, все остальное - это какие-то специфические фичи отдельных сред или компиляторов.
Вопрос этот возник у меня не на пустом месте. Какое-то время назад ковырялся с армами другого производителя, так там указать можно, но работать оно не будет. Долго копался в референсе, пока в каком-то углу ни обнаружил приписочку, что источником для DMA может быть только область RAM или периферия.
что источником для DMA может быть только область RAM или периферия.
Логично. Контроллер DMA живет отдельной жизнью. Вы хотите чтобы программа шла из конвейера или что там вытаскивает данные из флеша на лету, потом внезапно вставала на паузу, потому что конвейеру надо обслужить канал DMA и отдать туда данные. Толку от такого DMA
Вообще DMA у STM32 в иных случаях может заставить подвинуться всех прочих, включая ядро, если потребуется. Но это в отношении ОЗУ. А вот что случается, если DMA начинает лезть к флешу, я себе плохо представляю и поверхностное гугление этот вопрос пока не проясняет.
А ради чего, если линкер может подцепить файл? Вот, в IAR, например:
Некоторые как-то так и делали, причем шили в конец флеша один раз, т.к. каждый раз заливать такие объемы не так и быстро, а я просто написал программу которая ужала эту таблицу в 7.3 раза и успокоился
Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Ср июн 27, 2018 19:53:13
Встал на лапы
Зарегистрирован: Вс мар 01, 2009 20:41:19 Сообщений: 125
Рейтинг сообщения:0
Кто ковырял USB => VCP есть функция
Код:
static int8_t CDC_Receive_HS(uint8_t* Buf, uint32_t *Len) { /* USER CODE BEGIN 11 */ USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]); USBD_CDC_ReceivePacket(&hUsbDeviceHS); return (USBD_OK); /* USER CODE END 11 */ }
можем мы узнать в ней размер посылаемого пакета данных? например из оси посылаем 1024 байт, тк размер принимаемыех данных конечной точкой при работе в full speed 64 байт, получаем 16 вызовов функции выше, есть ли какая возможность определить кол-во вызовов или определить перед началом посылки и самому собрать 1024 байт в буфере.
Кто ковырял USB => VCP есть функция ... можем мы узнать в ней размер посылаемого пакета данных? например из оси посылаем 1024 байт, тк размер принимаемыех данных конечной точкой при работе в full speed 64 байт, получаем 16 вызовов функции выше, есть ли какая возможность определить кол-во вызовов или определить перед началом посылки и самому собрать 1024 байт в буфере.
Откуда в VCP пакеты взялись? Это же просто труба - есть данные пишем, нет - молчим. В любой момент вы можете получить от одного байта до максимального размера конечной точки. Если внутри потока приложение какие-то пакеты формирует, то VCP об этом ничего не знает, это не его уровень.
Читаю даташит на 32F103-й кристалл про RTC и не понимаю, когда считывать регистр RTC_CNT. Из картинки я понял, что прерывание секундное происходит за 1 такт RTCCLK до обновления? Выходит, если я получил прерывание, то мне нужно еще ждать 30 микросекунд, пока я смогу считать обновлённый RTC_CNT.
Я смотрю на картинки 180 и 181.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения