Виж темите без отговор | Виж активните теми
Дата и час: Чет Мар 28, 2024 3:34 pm
|
Страница 1 от 1
|
[ 11 мнения ] |
|
STM32F4: помощ за ADC/IT последователност
Автор |
Съобщение |
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 9:32 pm Мнения: 710
|
STM32F4: помощ за ADC/IT последователност
Здравейте, С ADC на stm32F413 преобразувам 16 входа. Понякога прекъсванията спират (или не се стартират - не ми е ясно ). Всички прекъсвания (UART, CAN, Timers, вкл и ADC) са с приоритет 0 (никой не се е занимавал да ги разпределя). KAK да дебъгна защо спират прекъсванията?Определно спирането на прекъсванията се забелязва при ADC SampleRate 3 cycles. Ако задам ADC SampleRate 15 cycles не се забелязва спиране (за няколко часа, но това нищо не значи). Като гледам последователността на стартиране (без да съм експерт) си представам, че може преобразуването да завършва преди да се инициализира прекъсването (например, ако между старта на преобразуването и инизиализацията на прекъсването дойдат други прекъсвания и преобразуването завърши. Не съм наясно и ако инициализирам прекъсването след завършване на преобразуванетоп дали прекъсването срабтова). Процедурата за иницализация на канала и стартиране на прекъсването:
|
Съб Сеп 25, 2021 4:45 pm |
|
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 1:01 pm Мнения: 1952 Местоположение: Варна
|
Re: STM32F4: помощ за ADC/IT последователност
Ползваш ли из кода, забраняване/разрешаване на прекъсвания?
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
Съб Сеп 25, 2021 6:23 pm |
|
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 9:32 pm Мнения: 710
|
Re: STM32F4: помощ за ADC/IT последователност
Кодът е генериран предимно от CubeMX. Това, което е добавено - разрешавам прекъснването от ADC еднократно, в режим ADC_SOFTWARE_START: hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; (1) стартирам с викане на ISF_ADC_IRQ_START_HAL()прихванал съм void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) в която: чета данните, сменям канала, ако не съм обходил всички, отново (2) стартирам ADC irq с ISF_ADC_IRQ_START_HAL(). В таймера на всяка милисекунда проверям дали са свършили всички преобразувания (те свършват за около 100us - винаги са свършили) и отново (3) стартирам ADC irq с ISF_ADC_IRQ_START_HAL(). Преди няколко дни взе да спира, сякаш в (2) не се стартира правилно. Вчера, като написах темата, му сложих дебъг броячи и направих механизъм да го запуска, ако спре. Сега виждам, че от тогава не е спирал въобще. (Мамата! Ще вземе да излезе, че докато съм си играл с дебъга съм объркал нещо!)
|
Нед Сеп 26, 2021 9:47 am |
|
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 1:01 pm Мнения: 1952 Местоположение: Варна
|
Re: STM32F4: помощ за ADC/IT последователност
Т.е. има две места от които се вика: ISF_ADC_IRQ_START_HAL() 1. Прекъсване от ADC за край на преобразуването от даден канал. 2. Таймер на 1[ms], който сритва нова поредица от измервания на канали. По проект тези две извиквания са разделени във времето, и не би трябвало да има състезаване(racing) между тях. Освен ако по някаква причина измерванията на всички канали не свършват за 100 [us] ами някъде на период кратен на 1 [ms]. Освен това предполагам, че и двете места на извикване са в IRQ контекст(ADC, Timer). И двата контекста имат еднакъв приоритет(0). А някой някъде из този генериран код на Cube-MX, изполва ли критични секции с забраняване/разрешаване глобално на прекъсванията? Предполагам че да и че там всико е наред, но ако имаш съмнения, ти също може да използваш критична секция. Или да вдигнеш нивото на приотитет на прекъсването от 1[ms] Timer-a. А сега като имаш дебъг броячи и сритваш измерванията ако са спрели, предполагам имаш и брояч, колко пъти се е налагало принудително сритване. И последно... за да не оставаш с чувството, че работи, но всеки момент може да очакваш проблем, опитай се да възпроизведеш ситуацията и да предизвикаш счупването, като нагласиш периода на таймера или времената на преобразуване на АЦП-то така че да са близки и джитера да определя ту единия ту другия да бъде първи. Но това изисква спокойна глава и прецизни измервания на времената. Поне ще си изясниш какво се случва и при какви условия. И няма да си във фаза - работи но не знам защо и докога.
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
Нед Сеп 26, 2021 10:33 am |
|
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 9:32 pm Мнения: 710
|
Re: STM32F4: помощ за ADC/IT последователност
Благодаря ти много за съдействието! Да, сложил съм "всякакви" броячи и не, не е сработвал тоя за спирането и не се е налагало да "сритвам" - от вчера си работи нормално. Благодаря ти за предложението да намеря причината за спиранията - върху това се съсредоточавам. Но в таймера винаги (и когато спираше) проверявам дали е изброил всички канали - ползвах флаг, който се вдига при прочитане на данните от последния канал. Сега ще сложа някакво забавяне между старта на ADC и разрешаване на прекъсванията му - това може да стане по причина, която си посочил - друго прекъсване.
|
Нед Сеп 26, 2021 10:51 am |
|
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 9:32 pm Мнения: 710
|
Re: STM32F4: помощ за ADC/IT последователност
ПП Сега се задълбочих и изчетох сорсовете - не съм прав. Превключването на канала не стартира преобразуването. Преобразуването се стартира от функцията, която разрешава и прекъсванията и в нея съвсем точно си ползват __HAL_LOCK(hadc); Хм. Освен да съм се заблудил и по някаква моя грешка при дебъгване да е спирала джаджата
|
Нед Сеп 26, 2021 10:59 am |
|
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 1:01 pm Мнения: 1952 Местоположение: Варна
|
Re: STM32F4: помощ за ADC/IT последователност
Едно е сигурно. Темата не е за "Микроконтролери-Хардуер". Може ли да постнеш тук имплементацията на __HAL_LOCK(hadc) така както е в твоя код. Интересно е да се види, какво прави.
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
Нед Сеп 26, 2021 2:48 pm |
|
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 1:01 pm Мнения: 1952 Местоположение: Варна
|
Re: STM32F4: помощ за ADC/IT последователност
Намерих го. От тук: https://github.com/STMicroelectronics/STM32CubeF4Как мислиш това може ли да се ползва за правене на критична секция при preemptive multitasking?
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
Нед Сеп 26, 2021 3:12 pm |
|
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 9:32 pm Мнения: 710
|
Re: STM32F4: помощ за ADC/IT последователност
(Извинявай за забавянето - нещото ми ме ангажира ) Да, разбирам те - когато HAL е зает просто се прави return HAL_BUSY; и нищо не се инициализира. Това обяснява нещата. Благодаря ти, че ми показа простотата
|
Нед Сеп 26, 2021 8:39 pm |
|
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 1:01 pm Мнения: 1952 Местоположение: Варна
|
Re: STM32F4: помощ за ADC/IT последователност
Зависи как се ползва __HAL_LOCK() По-вероятната употреба е който го ползва да зависне чакайки докато __HAL_LOCK() върне HAL_LOCKED. В този случай няма как да пропусне каквото там а заградено с този LOCK. Но пък ако полирането на __HAL_LOCK() не извиква някаква форма на yeld()/sleep(), тогава рано или късно влизаме в deadlock. При положение че се ползва в прекъсваем код(preemptable). Ако пък не се ползва в прекъсваем код а в някаква форма на cooperative multitasking, тогава какъв е смисъла от подобно заключване?
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
Пон Сеп 27, 2021 5:48 am |
|
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 9:32 pm Мнения: 710
|
Re: STM32F4: помощ за ADC/IT последователност
Да кажа за проблема, че сега видях, че не съм описал глупостта: по IT и по-късно по DMA гличовете се случваха, защото понякога се е активирала заявка за едно извънредно мерене, което историчски си е останало на poll. Естествено е работите да се объркат, когато се ползва едно и също ADC и по прекъсване и извън прекъсванията.
|
Вто Ное 09, 2021 2:35 pm |
|
|
|
Страница 1 от 1
|
[ 11 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|