STM32 новичку в ARM что к чему
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: STM32 новичку в ARM что к чему
rai17, проблема в том, что для симуляции 32-х битной архитектуры на 480МГц требуется, как минимум, на два порядка больше вычислительных ресурсов, чем для симуляции 8-ми битной архитектуры на 16МГц. А с учетом сложности симуляции асинхронных процессов в контроллерах Chrom-ART, CAN, USB и т.п. - вычислительных ресурсов требуется уже на три(!) порядка больше. Условно говоря, если для симуляции AVR достаточно одного ядра на 1ГГц, то для симуляции STM32H7 потребуется 300 ядер по 3.3ГГц.
Как следствие вышеизложенного, полноценая симуляция всей линейки STM32 потенциально возможна только суперкомпьютерах, что сводит ценность этой симуляции к нулю.
Что касается отладки алгоритмов, то лично я предпочитаю их отлаживать совершенно отдельно компьютере. Во-первых, алгоритм по определению не зависит от архитектуры, во-вторых, используя тот же R я получаю возможность сформировать действительно любую возможную последовательность входных данных, которую получить не то что в симуляторе, даже в железе очень проблематично.
Как следствие вышеизложенного, полноценая симуляция всей линейки STM32 потенциально возможна только суперкомпьютерах, что сводит ценность этой симуляции к нулю.
Что касается отладки алгоритмов, то лично я предпочитаю их отлаживать совершенно отдельно компьютере. Во-первых, алгоритм по определению не зависит от архитектуры, во-вторых, используя тот же R я получаю возможность сформировать действительно любую возможную последовательность входных данных, которую получить не то что в симуляторе, даже в железе очень проблематично.
- Реклама
Re: STM32 новичку в ARM что к чему
[uquote="rai17",url="/forum/viewtopic.php?p=3663585#p3663585"]Для начала такая тактика:
Отладка в симуляторе Keil отдельных фрагментов программы камень stm32f103c8 (доступен для отладки)
Далее, при необходимости, проверить в железе осциллом.
Потом подзаливать в F4xx и смотреть что получилось....[/uquote]
Странная тактика: сперва отладить на некоем симуляторе (неизвестно какого качества) причём для совершенно постороннего процессора, потом залить совсем в другой МК (с другим ядром к тому же) и думать что всё отлажено. Просто какой-то мазохизм. Специально себе же проблемы придумываете на ровном месте.
Это ещё с учётом того, что у вас, как у начинающего на этом МК, главные проблемы будут скорей всего с периферией. А тут никакой симулятор не поможет.
По уму: покупают JTAG-эмулятор (или SWD), подключаются к целевому МК и отлаживают на нём. Если очень уж что-то очень сложное алгоритмически нужно отладить, то можно на ПК под VS например. По-крайней мере это точно и надёжнее и удобнее будет.
Впрочем - хозяин - барин. Каждый сходит с ума по-своему....
Отладка в симуляторе Keil отдельных фрагментов программы камень stm32f103c8 (доступен для отладки)
Далее, при необходимости, проверить в железе осциллом.
Потом подзаливать в F4xx и смотреть что получилось....[/uquote]
Странная тактика: сперва отладить на некоем симуляторе (неизвестно какого качества) причём для совершенно постороннего процессора, потом залить совсем в другой МК (с другим ядром к тому же) и думать что всё отлажено. Просто какой-то мазохизм. Специально себе же проблемы придумываете на ровном месте.
Это ещё с учётом того, что у вас, как у начинающего на этом МК, главные проблемы будут скорей всего с периферией. А тут никакой симулятор не поможет.
По уму: покупают JTAG-эмулятор (или SWD), подключаются к целевому МК и отлаживают на нём. Если очень уж что-то очень сложное алгоритмически нужно отладить, то можно на ПК под VS например. По-крайней мере это точно и надёжнее и удобнее будет.
Впрочем - хозяин - барин. Каждый сходит с ума по-своему....
Re: STM32 новичку в ARM что к чему
Я очень благодарен любым советам, для этого самого вопрос и задавал.
Подключаюсь по SWD (два провода), вроде нормально работает. Сейчас использую Кейловский отладчик. НО! например, tim1 в момент прерывания по переполнению кажет ерунду.
Я бы и рад по-простому (или правильному) пути идти (без мазохизма), поэтому и прошу помощи.
Можно поподробней, что есть "на ПК под VS"?
Добавлено after 5 minutes 9 seconds:
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3663613#p3663613"]rai17 используя тот же R я получаю возможность...[/uquote]
Спасибо за ответ.
О каком "R" идёт речь?
Подключаюсь по SWD (два провода), вроде нормально работает. Сейчас использую Кейловский отладчик. НО! например, tim1 в момент прерывания по переполнению кажет ерунду.
Я бы и рад по-простому (или правильному) пути идти (без мазохизма), поэтому и прошу помощи.
Можно поподробней, что есть "на ПК под VS"?
Добавлено after 5 minutes 9 seconds:
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3663613#p3663613"]rai17 используя тот же R я получаю возможность...[/uquote]
Спасибо за ответ.
О каком "R" идёт речь?
Re: STM32 новичку в ARM что к чему
[uquote="rai17",url="/forum/viewtopic.php?p=3663680#p3663680"]НО! например, tim1 в момент прерывания по переполнению кажет ерунду.[/uquote]
Какую именно "ерунду" , вы прочли мой пост?
Какую именно "ерунду" , вы прочли мой пост?
Re: STM32 новичку в ARM что к чему
[uquote="rai17",url="/forum/viewtopic.php?p=3663680#p3663680"]НО! например, tim1 в момент прерывания по переполнению кажет ерунду.[/uquote]
Где смотрите? Поди в окне "Watch" отладчика?
Если у вас такой большой опыт в отладке девайсов на МК как писали
, то должны знать, что смотреть изменяющиеся регистры периферии (например - текущее значение таймера) через окно "Watch" отладчика - нельзя.
Надо на входе в ISR скопировать нужный регистр в переменную и смотреть её.
(Если что: ISR - это "обработчик прерывания"
)
[uquote="rai17",url="/forum/viewtopic.php?p=3663680#p3663680"]Можно поподробней, что есть "на ПК под VS"?[/uquote]
ПК - компьютер, VS - "Visual Studio". Ну или любая другая среда разработки для ПК. В 32-битном режиме позволяет отлаживать код, который потом легко перенести на ARM. Так как он тоже - 32-битный.
PS: Да - некоторые МК умеют останавливать тактирование указанной периферии во время останова отладчиком. И тогда счётчики таймеров не будут бежать пока стоите на бряке. Где это включается - смотреть мануал на свой МК.
Где смотрите? Поди в окне "Watch" отладчика?
Если у вас такой большой опыт в отладке девайсов на МК как писали
Надо на входе в ISR скопировать нужный регистр в переменную и смотреть её.
(Если что: ISR - это "обработчик прерывания"
[uquote="rai17",url="/forum/viewtopic.php?p=3663680#p3663680"]Можно поподробней, что есть "на ПК под VS"?[/uquote]
ПК - компьютер, VS - "Visual Studio". Ну или любая другая среда разработки для ПК. В 32-битном режиме позволяет отлаживать код, который потом легко перенести на ARM. Так как он тоже - 32-битный.
PS: Да - некоторые МК умеют останавливать тактирование указанной периферии во время останова отладчиком. И тогда счётчики таймеров не будут бежать пока стоите на бряке. Где это включается - смотреть мануал на свой МК.
- Реклама
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: STM32 новичку в ARM что к чему
[uquote="rai17",url="/forum/viewtopic.php?p=3663680#p3663680"]О каком "R" идёт речь?[/uquote]
Имеется в виду язык прогаммирования R. Он прост для изучения и позволяет легко генерировать заданные последовательности с управляемым распределением ошибок (искажений, шумов и т.п.). Несмотря на то, что он, преимущественно, направлен на статистический анализ данных, R предоставляет отличные возможности для генерации тестовых данных. Чем я и пользуюсь )
Имеется в виду язык прогаммирования R. Он прост для изучения и позволяет легко генерировать заданные последовательности с управляемым распределением ошибок (искажений, шумов и т.п.). Несмотря на то, что он, преимущественно, направлен на статистический анализ данных, R предоставляет отличные возможности для генерации тестовых данных. Чем я и пользуюсь )
Re: STM32 новичку в ARM что к чему
dosikus, Конечно прочел, притом внимательно...
-таймер фризился надо конфигурировать Debug MCU configuration register-
Это видимо имеется ввиду. Читал, сравнивал, работаю над этим.
Кажет ерунду, это когда ожидаешь увидеть в счетчике 0x0000, а видишь совершенно различные варианты, чередующиеся по непредсказуемому порядку...
Добавлено after 2 minutes 8 seconds:
ПростоНуб, Спасибо, познакомлюсь.
Добавлено after 39 minutes 6 seconds:
jcxz, Спасибо.
Опыт отладки девайсов на МК у меня небольшой (только avr).
Отлично получалось отлаживать устройства в Proteus.
В "Watch" не смотрю.
Смотрю в View-System Viewer-TIM-TIM1-CNT (повторюсь, пользуюсь Keil).
Так вот (опять же повторяюсь), при установки breakpoint на вход в ISR TIM1 в симуляторе (Use Simulator) всё отлично - вижу 0х0000, а вот при подключении платы с прошитым камнем STM32F103С8Т6 по SWD через ST-Link V2 (Use: ST-Link Debugger) – получаются вообще случайные значения в View-System Viewer-TIM-TIM1-CNT.
Буду разбираться...
-таймер фризился надо конфигурировать Debug MCU configuration register-
Это видимо имеется ввиду. Читал, сравнивал, работаю над этим.
Кажет ерунду, это когда ожидаешь увидеть в счетчике 0x0000, а видишь совершенно различные варианты, чередующиеся по непредсказуемому порядку...
Добавлено after 2 minutes 8 seconds:
ПростоНуб, Спасибо, познакомлюсь.
Добавлено after 39 minutes 6 seconds:
jcxz, Спасибо.
Опыт отладки девайсов на МК у меня небольшой (только avr).
Отлично получалось отлаживать устройства в Proteus.
В "Watch" не смотрю.
Смотрю в View-System Viewer-TIM-TIM1-CNT (повторюсь, пользуюсь Keil).
Так вот (опять же повторяюсь), при установки breakpoint на вход в ISR TIM1 в симуляторе (Use Simulator) всё отлично - вижу 0х0000, а вот при подключении платы с прошитым камнем STM32F103С8Т6 по SWD через ST-Link V2 (Use: ST-Link Debugger) – получаются вообще случайные значения в View-System Viewer-TIM-TIM1-CNT.
Буду разбираться...
- hosturik
- Потрогал лапой паяльник
- Сообщения: 354
- Зарегистрирован: Чт июл 24, 2014 23:09:23
- Откуда: Киев
Re: STM32 новичку в ARM что к чему
Подскажите по передаче через SPI с помощью DMA,
а точнее как избавиться от флага ожидания и чтобы при этом все работало
Каждый раз после отправки пакета данных через DMA, не важно 1 байт или 100 байт я передаю,
нужно ждать опустошение буфера передачи с помощью
while( SPI1->SR & SPI_I2S_FLAG_BSY )
Иначе не работает.
Так вот из за ожидания этого флага, особых преимуществ в DMA нет.
И все примеры в сети предполагают использования этого флага, но это ведь не правильно, какой тогда смысл в DMA.
Мне нужно добиться быстрое выполнение программы в главном цикле где вызываются все функции работы с дисплеем.
Сейчас главный цикл крутится всего 10 раз в секунду примерно, что очень мало.
а точнее как избавиться от флага ожидания и чтобы при этом все работало
Каждый раз после отправки пакета данных через DMA, не важно 1 байт или 100 байт я передаю,
нужно ждать опустошение буфера передачи с помощью
while( SPI1->SR & SPI_I2S_FLAG_BSY )
Иначе не работает.
Так вот из за ожидания этого флага, особых преимуществ в DMA нет.
И все примеры в сети предполагают использования этого флага, но это ведь не правильно, какой тогда смысл в DMA.
Мне нужно добиться быстрое выполнение программы в главном цикле где вызываются все функции работы с дисплеем.
Сейчас главный цикл крутится всего 10 раз в секунду примерно, что очень мало.
Re: STM32 новичку в ARM что к чему
[uquote="hosturik",url="/forum/viewtopic.php?p=3663997#p3663997"]Мне нужно добиться быстрое выполнение программы в главном цикле где вызываются все функции работы с дисплеем.[/uquote]
Это дисплей к SPI подключен?
Это дисплей к SPI подключен?
- hosturik
- Потрогал лапой паяльник
- Сообщения: 354
- Зарегистрирован: Чт июл 24, 2014 23:09:23
- Откуда: Киев
Re: STM32 новичку в ARM что к чему
Да, дисплей ILI9341 подключен по SPI1.
И еще тачскрин к нему подключен по другому SPI2.
И поскольку функции для работы тачскрина, в которых происходит обработка нажатия и рассчет коородинат нажатия тоже вызываются в главном цикле, время отклика на нажатие
не такое быстрое как хотелось, поскольку как я писал частота главного цикла где то 10 герц, которая ограничена скоростью обновления дисплея,
вернее скоростью передачи данных по SPI1 и ожиданием сброса флага BSY
И еще тачскрин к нему подключен по другому SPI2.
И поскольку функции для работы тачскрина, в которых происходит обработка нажатия и рассчет коородинат нажатия тоже вызываются в главном цикле, время отклика на нажатие
не такое быстрое как хотелось, поскольку как я писал частота главного цикла где то 10 герц, которая ограничена скоростью обновления дисплея,
вернее скоростью передачи данных по SPI1 и ожиданием сброса флага BSY
Последний раз редактировалось hosturik Ср июл 10, 2019 10:49:46, всего редактировалось 1 раз.
Re: STM32 новичку в ARM что к чему
[uquote="hosturik",url="/forum/viewtopic.php?p=3664029#p3664029"]Да, дисплей ILI9341 подключен по SPI.[/uquote]
Какой дисплей? Какой мк? Нигде при передаче случайно HAL не используется? Никакие шрифты по точкам не отрисовываются? Когда отправляешь 100 байт по DMA что делаешь? Некоторые сразу флаг проверяют
Какой дисплей? Какой мк? Нигде при передаче случайно HAL не используется? Никакие шрифты по точкам не отрисовываются? Когда отправляешь 100 байт по DMA что делаешь? Некоторые сразу флаг проверяют
- hosturik
- Потрогал лапой паяльник
- Сообщения: 354
- Зарегистрирован: Чт июл 24, 2014 23:09:23
- Откуда: Киев
Re: STM32 новичку в ARM что к чему
HAL не использую использую библиотеку LL. Это те же регистры только обернутые в удобочитаемые названия.
На регистрах тоже пробовал, разницы не заметил.
МК STM32F030C8T6, дисплей ILI9341
мне наверное нужно не ждать сброса флага в бесконечном цикле, а делать проверку установки пользовательского флага через if,
который я буду устанавливать в прерывании передачи DMA (transfer complete) и только после этого делать повторную отправку.
На регистрах тоже пробовал, разницы не заметил.
МК STM32F030C8T6, дисплей ILI9341
мне наверное нужно не ждать сброса флага в бесконечном цикле, а делать проверку установки пользовательского флага через if,
который я буду устанавливать в прерывании передачи DMA (transfer complete) и только после этого делать повторную отправку.
Код: Выделить всё
// Функция отправки данных по SPI
void Spi_Write_Data(uint8_t *data, uint16_t size){
spi_send_dma(data, size);
while(LL_SPI_IsActiveFlag_BSY(SPI1)){}
}
// Функция для отправки DMA запроса
void spi_send_dma(uint8_t *spi, uint16_t len){
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_3);
LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_3, (uint32_t)&SPI1->DR);
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_3, (uint32_t)spi);
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_3, (uint32_t)len);
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_3);
}
Последний раз редактировалось hosturik Ср июл 10, 2019 11:02:30, всего редактировалось 1 раз.
Re: STM32 новичку в ARM что к чему
[uquote="hosturik",url="/forum/viewtopic.php?p=3664038#p3664038"][/uquote]
Я про это и спрашивал
Чем эта отправка отличается от отправки без DMA, если ты ждешь ее окончания ничего больше не делая?
Код: Выделить всё
// Функция отправки данных по SPI
void Spi_Write_Data(uint8_t *data, uint16_t size){
spi_send_dma(data, size);
while(LL_SPI_IsActiveFlag_BSY(SPI1)){}
}Я про это и спрашивал
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Я особо с DMA не работал, но простая логика подсказывает, что ждать (цикл while) нужно не после spi_send_dma(), а до её вызова. Тем самым, данные по DMA будут себе в фоне отправляться, и уже только когда понадобится отправить новую порцию данных, мы снова вернёмся в Spi_Write_Data(), где и будем ждать окончания предыдущей передачи. Или не будем, если она успеет к тому времени завершиться.
Разве что ещё проследить, чтобы никто в буфер не писал (подготовка новой передачи), пока он по DMA занят.
Разве что ещё проследить, чтобы никто в буфер не писал (подготовка новой передачи), пока он по DMA занят.
Re: STM32 новичку в ARM что к чему
[uquote="WiseLord",url="/forum/viewtopic.php?p=3664043#p3664043"]Я особо с DMA не работал, но простая логика подсказывает, что ждать (цикл while) нужно не после spi_send_dma(), а до её вызова.[/uquote]
Естественно.
Естественно.
Если хочется быстро, то лучше сразу сделать два буфера.Разве что ещё проследить, чтобы никто в буфер не писал (подготовка новой передачи), пока он по DMA занят.
- hosturik
- Потрогал лапой паяльник
- Сообщения: 354
- Зарегистрирован: Чт июл 24, 2014 23:09:23
- Откуда: Киев
Re: STM32 новичку в ARM что к чему
Да я понимаю что так делать не правильно, но по другому у меня не получилось заставить заработать.
Вы имеете ввиду вот так?Так не работает
Мне наверное нужно не ждать сброса флага в бесконечном цикле, а делать проверку установки пользовательского флага через if,
который я буду устанавливать в прерывании передачи DMA (transfer complete) и только после этого делать повторную отправку. Но
у меня такой вариант почему то не заработал.
Или мне не прерывание DMA нужно ждать в прерывании SPI? Что то я запутался
Вот так я делал. Но не заработало. И я догадываюся почему. Данные для инициализации дисплея к напримеру пытаются отправиться, но я их попросту игнорирую,
если флаг не установился, из за чего не проходит даже инициализация.
Вы имеете ввиду вот так?
Код: Выделить всё
void Spi_Write_Data(uint8_t *data, uint16_t size){
while(LL_SPI_IsActiveFlag_BSY(SPI1)){}
spi_send_dma(data, size);
}Мне наверное нужно не ждать сброса флага в бесконечном цикле, а делать проверку установки пользовательского флага через if,
который я буду устанавливать в прерывании передачи DMA (transfer complete) и только после этого делать повторную отправку. Но
у меня такой вариант почему то не заработал.
Или мне не прерывание DMA нужно ждать в прерывании SPI? Что то я запутался
Вот так я делал. Но не заработало. И я догадываюся почему. Данные для инициализации дисплея к напримеру пытаются отправиться, но я их попросту игнорирую,
если флаг не установился, из за чего не проходит даже инициализация.
Код: Выделить всё
uint8_t flag = 0;
// Функция отправки данных по SPI
void Spi_Write_Data(uint8_t *data, uint16_t size){
if(flag == 0){
spi_send_dma(data, size);
flag = 1;
}
}
// Обработчик прерывания DMA
void DMA1_Channel1_IRQHandler(void)
{
if(LL_DMA_IsEnabledIT_TC(DMA1, LL_DMA_CHANNEL_3) && LL_DMA_IsActiveFlag_TC3(DMA1)) { // флаг окончания передачи через DMA
LL_DMA_ClearFlag_TC3(DMA1);
flag = 0;
}
}
Последний раз редактировалось hosturik Ср июл 10, 2019 11:19:02, всего редактировалось 1 раз.
Re: STM32 новичку в ARM что к чему
[uquote="hosturik",url="/forum/viewtopic.php?p=3664047#p3664047"]Вот так я делал. Но не заработало.[/uquote]
Как минимум нужен volatile для flag. Только зачем так делать, если можно проверять флаг и без прерывания...
Как минимум нужен volatile для flag. Только зачем так делать, если можно проверять флаг и без прерывания...
Re: STM32 новичку в ARM что к чему
[uquote="rai17",url="/forum/viewtopic.php?p=3663950#p3663950"]dosikus, Конечно прочел, притом внимательно...
-таймер фризился надо конфигурировать Debug MCU configuration register-
Это видимо имеется ввиду. Читал, сравнивал, работаю над этим.
Кажет ерунду, это когда ожидаешь увидеть в счетчике 0x0000, а видишь совершенно различные варианты, чередующиеся по непредсказуемому порядку...
////////
Так вот (опять же повторяюсь), при установки breakpoint на вход в ISR TIM1 в симуляторе (Use Simulator) всё отлично - вижу 0х0000, а вот при подключении платы с прошитым камнем STM32F103С8Т6 по SWD через ST-Link V2 (Use: ST-Link Debugger) – получаются вообще случайные значения в View-System Viewer-TIM-TIM1-CNT.
Буду разбираться...[/uquote]
Еще раз- счетчик таймера не останавливается при бряках...
-таймер фризился надо конфигурировать Debug MCU configuration register-
Это видимо имеется ввиду. Читал, сравнивал, работаю над этим.
Кажет ерунду, это когда ожидаешь увидеть в счетчике 0x0000, а видишь совершенно различные варианты, чередующиеся по непредсказуемому порядку...
////////
Так вот (опять же повторяюсь), при установки breakpoint на вход в ISR TIM1 в симуляторе (Use Simulator) всё отлично - вижу 0х0000, а вот при подключении платы с прошитым камнем STM32F103С8Т6 по SWD через ST-Link V2 (Use: ST-Link Debugger) – получаются вообще случайные значения в View-System Viewer-TIM-TIM1-CNT.
Буду разбираться...[/uquote]
Еще раз- счетчик таймера не останавливается при бряках...
- hosturik
- Потрогал лапой паяльник
- Сообщения: 354
- Зарегистрирован: Чт июл 24, 2014 23:09:23
- Откуда: Киев
Re: STM32 новичку в ARM что к чему
Так тоже пробовалНо как я выше написал, такой вариант не работает, потому что я просто пропускаю необходимые данные, например для инициализации дисплея
Код: Выделить всё
// Функция отправки данных по SPI
void Spi_Write_Data(uint8_t *data, uint16_t size){
if(!LL_SPI_IsActiveFlag_BSY(SPI1)){
spi_send_dma(data, size);
}
}
Re: STM32 новичку в ARM что к чему
[uquote="hosturik",url="/forum/viewtopic.php?p=3664061#p3664061"]Но как я выше написал, такой вариант не работает, потому что я просто пропускаю необходимые данные, например для инициализации дисплея[/uquote]
Не нужно пропускать, нужно ждать. Смысл DMA в том, что запустил отправку и что-то делаешь, например, заполняешь данными другой буфер, а когда опять нужна запись в SPI, то уже ждешь завершения предыдущей передачи.
Не нужно пропускать, нужно ждать. Смысл DMA в том, что запустил отправку и что-то делаешь, например, заполняешь данными другой буфер, а когда опять нужна запись в SPI, то уже ждешь завершения предыдущей передачи.


