Программирование 32-х разрядных МК

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

У тебя initDmfDevice реализована в cpp файле, а вызывается из с файла. С не знает ничего о срр. Функцию надо засунуть внутрь extern "C"{}

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Andy пишет:

У тебя initDmfDevice реализована в cpp файле, а вызывается из с файла. С не знает ничего о срр. Функцию надо засунуть внутрь extern "C"{}

Э...не понял, main.c подключает dmfcomm.h, в которой прописано определение процедуры, которая в dmfcomm.cpp. Просьба разъяснить что не так.

mixail844
Offline
Зарегистрирован: 30.04.2012

andycat пишет:
Andy пишет:

У тебя initDmfDevice реализована в cpp файле, а вызывается из с файла. С не знает ничего о срр. Функцию надо засунуть внутрь extern "C"{}

Э...не понял, main.c подключает dmfcomm.h, в которой прописано определение процедуры, которая в dmfcomm.cpp. Просьба разъяснить что не так.

 

точно не знаю как и где  этот механизм работает ,наверное в каждой среде по разному - в IARe вроде среда программирования решает какой компилятор вызывать(с или с++) на основании окончания файла . то есть если у вас "обычная функция" в файле *.cpp , вызываеться из файла *.c , то есть шанс ,что линковщик Си, просто не увидит вашу фунцию в .cpp .Для того что бы увидел ,для этого в файле .cpp , явно указывается что некие функции должны копмилироваться/линковаться при помощи Си компилятора/линкера. , в GCC делается так  

foo.h


#ifdef __cplusplus
extern "C" {
#endif


// заголовки фунций 

#ifdef __cplusplus
}
#endif

 

foo.cpp

#include "foo.h"

// имплементация фунцкий
​

 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

mixail844 пишет:

 

 

да, видел эти конструкции в исходниках SPL, понял, спасибо.

В итоге собрал проект с нуля с те ми же файликами - все заработало, так что где то просто ошибся или глюк.

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

вопрос опытным по логике работы USART 

сделал обработчик по прерыванию , все хорошо, все работает

во многих инструкциях интернета используется вот такая строка в прерывании

while (!(USART2->ISR & USART_ISR_TC));

т е ждет как байт уйдет и в USART2->TDR кладем следующий. Но ведь получается что мы ждем....и утекают лишние микро и милли секунды. Пока вышел из положения в основной цикл поставил проверку если что отправлять и МК готов - кладем байт из fIFO буфера

void processSendUART(void){ // отправка
    if (fifoCountTXlog) if (USART2->ISR & USART_ISR_TC) { // UASART2
        unsigned char currOut;
        if (fifoCountTXlog <= fifoPosTXlog) {
            currOut = fifoBufTXlog[fifoPosTXlog-fifoCountTXlog];
            --fifoCountTXlog;
        } else {
            currOut = fifoBufTXlog[max_size_fifo_log_buf-(fifoCountTXlog-fifoPosTXlog)]; 
            --fifoCountTXlog;
        }
        USART2->TDR = currOut;
    }
}

но как то это грубо и не кошерно :( 

вижу только одну мысль как от этого избавиться - сделать новый таймер на несколько микросекунд

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Флаг TC используется для потока а не для отправки одиночного байта, и проверяется конец передачи фрейма . Используйте TXE для одиночных транзакций.

 

 void Usart_Transmit(uint8_t Data)
{
  while(!(USART1->ISR & USART_ISR_TXE));
  USART1->TDR = Data;
}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dosikus пишет:

Флаг TC используется для потока а не для отправки одиночного байта, и проверяется конец передачи фрейма . Используйте TXE для одиночных транзакций.

 

 void Usart_Transmit(uint8_t Data)
{
  while(!(USART1->ISR & USART_ISR_TXE));
  USART1->TDR = Data;
}

 

да, точно, спасибо, ща исправлю

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Если что - вот картинкО из RM .

 

Обратите внимание на то когда какой флаг выставляется и на последовательность в комментах...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Вот и вопрос у меня, получается что software wait из диаграммы я могу засунуть только в основной while(1) программы.

mixail844
Offline
Зарегистрирован: 30.04.2012

andycat пишет:
Вот и вопрос у меня, получается что software wait из диаграммы я могу засунуть только в основной while(1) программы.

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Прерывание на отправку срабатывает один раз или по окончании байта или всей отправки, соответственно если в буфер пусто, то отправка не пройдёт и это логично. А теперь какая то другая часть программы через X время положил в буфер байт, прерывание уже до него не доберётся. Я уже попробовал данный вариант.
Вижу ещё решение при складировании в fifo очередной партии данных, смотреть флаг МК и выкладывать из очереди. Но что то не нравиться мне этот вариант.

ssss
Offline
Зарегистрирован: 01.07.2016

mixail844 пишет:

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

Ви картинко хот сматрель ??? ))))))))

"Не давайте глупых советов, ибо это уже выглядит глупо!"(с)...

ssss
Offline
Зарегистрирован: 01.07.2016

andycat пишет:
Прерывание на отправку срабатывает один раз или по окончании байта или всей отправки.

Если просто чтобы работало... найдите чужой код... готовый...

Если хотите разобраться в железе... основательно... логанализатор вам в помощь... иначе в трех байтах запутаетесь...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ssss, при всем уважении, я за последние несколько дней пересмотрел много чужого кода в интернете. Они все такое ощущение копипаст с одной статьи. Если есть код который отправляет без условий ожидания флага окончания отправки байта МК, просьба показать.
Uodate: в смысле не флага, а как проверять буфер по какому то времени или сигналу или таймеру чтоб байт в отправку послать.
Думаю прикрутить к миллисекундному таймеру...

dosikus
Offline
Зарегистрирован: 11.03.2017

Используйте DMA. А вообще - что изобретаете, не modbus часом ?

b707
Offline
Зарегистрирован: 26.05.2017

andycat пишет:
ssss, при всем уважении, я за последние несколько дней пересмотрел много чужого кода в интернете. Они все такое ощущение копипаст с одной статьи. .

Посмотрите эту книжку(первая в списке, доступно бесплатно) в ней в разделе 11.5 есть подробное обьяснение с примерами кода:

https://www.st.com/content/st_com/en/support/learning/stm32-education/text-books.html

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
Чем мне DMA поможет?
По факту та же проверка наличия данных с буфер отправки и отдавать их в регистр МК. 
Смысл понятен, тема раскрыта, подумаю.,всем спасибо. 
PS. Нет, это устройство, которое должно быть постоянно на связи  с mqtt брокером, используется три uart, связь с модемом, лог и снятие кадров с фотокамеры. + чтение с пина по таймеру сигнала с контрольного устройства доступа + управление исполнительным устройством и все это в режиме 27/7 без участия человека с восстановлением связи. На atmega328p уже все сделал, но на чтение фото с камеры уже быстродействия и uart тупо не хватает, вот и пришлось на stm32 сесть. 
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

b707 пишет:

andycat пишет:
ssss, при всем уважении, я за последние несколько дней пересмотрел много чужого кода в интернете. Они все такое ощущение копипаст с одной статьи. .

Посмотрите эту книжку(первая в списке, доступно бесплатно) в ней в разделе 11.5 есть подробное обьяснение с примерами кода:

https://www.st.com/content/st_com/en/support/learning/stm32-education/text-books.html

Спасибо, скачал, изучаю 

dosikus
Offline
Зарегистрирован: 11.03.2017

Хорошо, спрошу по другому - что отправляете, строку, пакет или что?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dosikus пишет:
Хорошо, спрошу по другому - что отправляете, строку, пакет или что?

в UART ? в log который - строки, в UART для модема и камеры все подряд. Т е все потоки данных uart должны быть максимально независимы.

dosikus
Offline
Зарегистрирован: 11.03.2017

Все подряд -это ниочем.
Если нужно максимальное быстродействие то только DMA.
У меня такое ощущение что вы пытаетесь софтовый ногодрыг с авр натянуть на стм.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dosikus пишет:
Все подряд -это ниочем.
Если нужно максимальное быстродействие то только DMA.
У меня такое ощущение что вы пытаетесь софтовый ногодрыг с авр натянуть на стм.

Возможно и не прав, пошёл повторно читать про DMA

ssss
Offline
Зарегистрирован: 01.07.2016

andycat пишет:

Чем мне DMA поможет?
По факту та же проверка наличия данных с буфер отправки и отдавать их в регистр МК. 
Смысл понятен, тема раскрыта, подумаю.,всем спасибо. 
PS. Нет, это устройство, которое должно быть постоянно на связи  с mqtt брокером, используется три uart, связь с модемом, лог и снятие кадров с фотокамеры. + чтение с пина по таймеру сигнала с контрольного устройства доступа + управление исполнительным устройством и все это в режиме 27/7 без участия человека с восстановлением связи. 

Три ЮАРТ... И как... позвольте узнать... вы все это хотите разруливать... чтобы все быстро и не мешало друг другу... без ДМА???

Операционку тулить будете ??? И чего вы так ДМА  боитесь ??? Таймера и ДМА... основная фишка СТМ32...

Логанализатор... референс... и терпение... Потом сами удивитесь... как все легко и просто...

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Заносим указатель на буфер, заносим длину транзакции, включаем трансфер.
Все. В прерывании DMA по окончанию трансфера проверяем флаг TC(это мизер по сравнению с ручной посылкой) выставляем флаг окончания транзакции посылки. Сей флаг мониторим перед очередной посылкой.
Процессор свободен транзакция происходит автоматически...
Вообщем связка DMA и UART создает полный автомат .
Для которого достаточно ввести параметры и пнуть..

ssss
Offline
Зарегистрирован: 01.07.2016

andycat пишет:
как проверять буфер по какому то времени или сигналу или таймеру чтоб байт в отправку послать. Думаю прикрутить к миллисекундному таймеру...

Можно и таймером... но это если данные постоянной длины... но опять... чтобы все выровнять до такта... нужен логанализатор... Лучше ДМА... железо само крутить будет...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ssss пишет:

andycat пишет:

Чем мне DMA поможет?
По факту та же проверка наличия данных с буфер отправки и отдавать их в регистр МК. 
Смысл понятен, тема раскрыта, подумаю.,всем спасибо. 
PS. Нет, это устройство, которое должно быть постоянно на связи  с mqtt брокером, используется три uart, связь с модемом, лог и снятие кадров с фотокамеры. + чтение с пина по таймеру сигнала с контрольного устройства доступа + управление исполнительным устройством и все это в режиме 27/7 без участия человека с восстановлением связи. 

Три ЮАРТ... И как... позвольте узнать... вы все это хотите разруливать... чтобы все быстро и не мешало друг другу... без ДМА???

Операционку тулить будете ??? И чего вы так ДМА  боитесь ??? Таймера и ДМА... основная фишка СТМ32...

Логанализатор... референс... и терпение... Потом сами удивитесь... как все легко и просто...

 

Легко)

Два uart прекрасно на atmega328p работает. Я не говорю что DMA боюсь)

Фразу сейчас нашёл хорошую "Если вам нужно передавать (или принимать) через USART массыв данных, тогда есть смысл использовать DMA"

На уже провереной практике стабильно по gprs одним потоком на mqtt брокер уходит за раз байт 600, при размере фотки ~5 кбайт, это уйдёт за 10 частей. Для этого случая да, DMA нужен, реализую. Во всх остальных отправках несколько байт это бессмысленно.

Всем спасибо, начну реализовывать.

vganin
Offline
Зарегистрирован: 03.07.2019

Всем привет. Может не в тему. Есть вопрос. Может и глупый( я не спец). Может кто найдет минутку и ответит. Приехала платка с АЛИ STM32F103CB . случайно наверно положили. Вот 2 день изучаю. У меня нет программатора для нее, но зато в стационарном компе 4 компорта. есть программатор SPI - USBASP для ардуино.

1 . Почему нельзя достучаться до флешпамяти контроллера через SPI(или ни кто загрузчик не хочет писать)

2.Можно ли использовать компорт(другие TTL технологии без проблем, например LON)

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Загрузчик есть у любого стм32 с завода.
Минимально нужен USB-UART...

vganin
Offline
Зарегистрирован: 03.07.2019

USB-UART это переходник на последовательный(RX,TX, GRD) поскольку в современных компах их(компортов) нет. Все чипы программаторов и 2303 и 2102 и CH340 являются конвертерами в RS232(компорт)

nik182
Offline
Зарегистрирован: 04.05.2015

vganin пишет:

Всем привет. Может не в тему. Есть вопрос. Может и глупый( я не спец). Может кто найдет минутку и ответит. Приехала платка с АЛИ STM32F103CB . случайно наверно положили. Вот 2 день изучаю. У меня нет программатора для нее, но зато в стационарном компе 4 компорта. есть программатор SPI - USBASP для ардуино.

1 . Почему нельзя достучаться до флешпамяти контроллера через SPI(или ни кто загрузчик не хочет писать)

2.Можно ли использовать компорт(другие TTL технологии без проблем, например LON)

https://easystm32.ru/useful-things/42-bootloader-stm32/ Все ответы можно найти здесь в ещё в куче мест.

vganin
Offline
Зарегистрирован: 03.07.2019

это все понятно, может кто глубже копался, но все равно спасибо за интересную ссылку

nik182
Offline
Зарегистрирован: 04.05.2015

Простите а глубже это куда? Есть мануал на чип. RM00008 называется. Там всё расписано. 

И это не AVR. По spi не программируется. А что такое LON?

vganin
Offline
Зарегистрирован: 03.07.2019

Я понял.. Хотел обойти тему с программатором. Попробую с физическим компортом завтра .

vganin
Offline
Зарегистрирован: 03.07.2019

А лон , так это просто можно было через USB-COM  2102 чип, а можно напрямую через COM1 c этими контроллерами соединятся. Я даже тут где то нашел человека, который исполдьзует программатор для STM как компорт.

b707
Offline
Зарегистрирован: 26.05.2017

vganin пишет:

Я понял.. Хотел обойти тему с программатором. Попробую с физическим компортом завтра .

не нужен там никакой "физический компорт", все отлично работает через USB-UART, можно даже через ардуину

nik182
Offline
Зарегистрирован: 04.05.2015

Присоединяюсь. Физический компорт убьёт стмку. Не переносит она -12 вольт.

vganin
Offline
Зарегистрирован: 03.07.2019

А как через ардуинку

vganin
Offline
Зарегистрирован: 03.07.2019

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

dosikus
Offline
Зарегистрирован: 11.03.2017

Bootloader вы не смените и не затрете ни чем, залочить/запороть чип сможете ...

b707
Offline
Зарегистрирован: 26.05.2017

dosikus пишет:

Bootloader вы не смените и не затрете ни чем, залочить/запороть чип сможете ...

да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?

b707
Offline
Зарегистрирован: 26.05.2017

vganin пишет:

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

блин, вам же дали ссылку выше, где все описано? - но вы явно ее не читали, а вместо этого стали нести бред про "железный компорт". Прочитайте ссылку-то уже...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

b707 пишет:

dosikus пишет:

Bootloader вы не смените и не затрете ни чем, залочить/запороть чип сможете ...

да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?

нет, читать про ноги BOOT0 и BOOT1.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?

Нет, бутлодер прошивается на заводе, он нестираемый. А вот потом, он позволяет прошить usb загрущик. Это 2 разные вещи

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

DetSimen пишет:

b707 пишет:

да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?

Нет, бутлодер прошивается на заводе, он нестираемый. А вот потом, он позволяет прошить usb загрущик. Это 2 разные вещи

дед,  usb загрузчик и по SWD/JTAG можно записать.

ssss
Offline
Зарегистрирован: 01.07.2016

b707 пишет:

dosikus пишет:

Bootloader вы не смените и не затрете ни чем, залочить/запороть чип сможете ...

да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?

Не спорьте с Алексеем... "Это вредно для вашего здоровья!"(с)...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

xDriver пишет:

DetSimen пишет:

b707 пишет:

да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?

Нет, бутлодер прошивается на заводе, он нестираемый. А вот потом, он позволяет прошить usb загрущик. Это 2 разные вещи

дед,  usb загрузчик и по SWD/JTAG можно записать.

Можно, да.  Но можно и железным загрузчиком по Uart. Переходники ch340 у всех есть, а swd нет. У мня вот нету. 

nik182
Offline
Зарегистрирован: 04.05.2015

COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка generic_boot20_pc13.bin >>> получаем мапл мини,  через USB на плате грузим программы для себя.  

COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка stlinkv2_1.bin>>> припаиваем 3 резистора и 1 конденсатор, получаем программатор ST-LINK и через него в любой среде по SWD грузим прошивки в другие СТМки и отлаживаем где можно. Каждый выбирает сам. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

nik182 пишет:

COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка generic_boot20_pc13.bin >>> получаем мапл мини,  через USB на плате грузим программы для себя.  

COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка stlinkv2_1.bin>>> припаиваем 3 резистора и 1 конденсатор, получаем программатор ST-LINK и через него в любой среде по SWD грузим прошивки в другие СТМки и отлаживаем где можно. Каждый выбирает сам. 

Столь далеко мои познания в stm не простираюца

nik182
Offline
Зарегистрирован: 04.05.2015

Простиреть или расширшить познания не вопрос, если тебе это надо и есть над чем поиздеваться. Готов поучаствовать в простирации в мере сил, опять же если ты сам хочешь. В принципе к завтрашнему утру уже можно в руках иметь полный рабочий набор начинающего стмщика.   

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я его еще только начал щюпать. Пока мне для моих нехитрых задач хватает 328й, не вижу, куда можно применить монстра stm. :-)