| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| STM32F4: помощ за ADC/IT последователност http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=18028 |
Страница 1 от 1 |
| Автор: | NikB [ Съб Сеп 25, 2021 5:45 pm ] | |||||||||
| Заглавие: | STM32F4: помощ за ADC/IT последователност | |||||||||
Здравейте, С ADC на stm32F413 преобразувам 16 входа. Понякога прекъсванията спират (или не се стартират - не ми е ясно Всички прекъсвания (UART, CAN, Timers, вкл и ADC) са с приоритет 0 (никой не се е занимавал да ги разпределя). KAK да дебъгна защо спират прекъсванията? Определно спирането на прекъсванията се забелязва при ADC SampleRate 3 cycles. Ако задам ADC SampleRate 15 cycles не се забелязва спиране (за няколко часа, но това нищо не значи). Като гледам последователността на стартиране (без да съм експерт) си представам, че може преобразуването да завършва преди да се инициализира прекъсването (например, ако между старта на преобразуването и инизиализацията на прекъсването дойдат други прекъсвания и преобразуването завърши. Не съм наясно и ако инициализирам прекъсването след завършване на преобразуванетоп дали прекъсването срабтова). Процедурата за иницализация на канала и стартиране на прекъсването:
|
||||||||||
| Автор: | Zdrav [ Съб Сеп 25, 2021 7:23 pm ] |
| Заглавие: | Re: STM32F4: помощ за ADC/IT последователност |
Ползваш ли из кода, забраняване/разрешаване на прекъсвания? |
|
| Автор: | NikB [ Нед Сеп 26, 2021 10:47 am ] | |||||||||
| Заглавие: | 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) не се стартира правилно. Вчера, като написах темата, му сложих дебъг броячи и направих механизъм да го запуска, ако спре. Сега виждам, че от тогава не е спирал въобще. (Мамата! Ще вземе да излезе, че докато съм си играл с дебъга съм объркал нещо!) |
||||||||||
| Автор: | Zdrav [ Нед Сеп 26, 2021 11:33 am ] |
| Заглавие: | 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. А сега като имаш дебъг броячи и сритваш измерванията ако са спрели, предполагам имаш и брояч, колко пъти се е налагало принудително сритване. И последно... за да не оставаш с чувството, че работи, но всеки момент може да очакваш проблем, опитай се да възпроизведеш ситуацията и да предизвикаш счупването, като нагласиш периода на таймера или времената на преобразуване на АЦП-то така че да са близки и джитера да определя ту единия ту другия да бъде първи. Но това изисква спокойна глава и прецизни измервания на времената. Поне ще си изясниш какво се случва и при какви условия. И няма да си във фаза - работи но не знам защо и докога. |
|
| Автор: | NikB [ Нед Сеп 26, 2021 11:51 am ] | |||||||||
| Заглавие: | Re: STM32F4: помощ за ADC/IT последователност | |||||||||
Благодаря ти много за съдействието! Да, сложил съм "всякакви" броячи Благодаря ти за предложението да намеря причината за спиранията - върху това се съсредоточавам. Но в таймера винаги (и когато спираше) проверявам дали е изброил всички канали - ползвах флаг, който се вдига при прочитане на данните от последния канал. Сега ще сложа някакво забавяне между старта на ADC и разрешаване на прекъсванията му - това може да стане по причина, която си посочил - друго прекъсване. |
||||||||||
| Автор: | NikB [ Нед Сеп 26, 2021 11:59 am ] | |||||||||
| Заглавие: | Re: STM32F4: помощ за ADC/IT последователност | |||||||||
ПП Сега се задълбочих и изчетох сорсовете - не съм прав. Превключването на канала не стартира преобразуването. Преобразуването се стартира от функцията, която разрешава и прекъсванията и в нея съвсем точно си ползват __HAL_LOCK(hadc); Хм. Освен да съм се заблудил и по някаква моя грешка при дебъгване да е спирала джаджата |
||||||||||
| Автор: | Zdrav [ Нед Сеп 26, 2021 3:48 pm ] |
| Заглавие: | Re: STM32F4: помощ за ADC/IT последователност |
Едно е сигурно. Темата не е за "Микроконтролери-Хардуер". Може ли да постнеш тук имплементацията на __HAL_LOCK(hadc) така както е в твоя код. Интересно е да се види, какво прави. |
|
| Автор: | Zdrav [ Нед Сеп 26, 2021 4:12 pm ] | |||||||||
| Заглавие: | Re: STM32F4: помощ за ADC/IT последователност | |||||||||
Намерих го. От тук: https://github.com/STMicroelectronics/STM32CubeF4
Как мислиш това може ли да се ползва за правене на критична секция при preemptive multitasking? |
||||||||||
| Автор: | NikB [ Нед Сеп 26, 2021 9:39 pm ] | |||||||||
| Заглавие: | Re: STM32F4: помощ за ADC/IT последователност | |||||||||
(Извинявай за забавянето - нещото ми ме ангажира Да, разбирам те - когато HAL е зает просто се прави return HAL_BUSY; и нищо не се инициализира. Това обяснява нещата. Благодаря ти, че ми показа простотата |
||||||||||
| Автор: | Zdrav [ Пон Сеп 27, 2021 6:48 am ] |
| Заглавие: | Re: STM32F4: помощ за ADC/IT последователност |
Зависи как се ползва __HAL_LOCK() По-вероятната употреба е който го ползва да зависне чакайки докато __HAL_LOCK() върне HAL_LOCKED. В този случай няма как да пропусне каквото там а заградено с този LOCK. Но пък ако полирането на __HAL_LOCK() не извиква някаква форма на yeld()/sleep(), тогава рано или късно влизаме в deadlock. При положение че се ползва в прекъсваем код(preemptable). Ако пък не се ползва в прекъсваем код а в някаква форма на cooperative multitasking, тогава какъв е смисъла от подобно заключване? |
|
| Автор: | NikB [ Вто Ное 09, 2021 3:35 pm ] |
| Заглавие: | Re: STM32F4: помощ за ADC/IT последователност |
Да кажа за проблема, че сега видях, че не съм описал глупостта: по IT и по-късно по DMA гличовете се случваха, защото понякога се е активирала заявка за едно извънредно мерене, което историчски си е останало на poll. Естествено е работите да се объркат, когато се ползва едно и също ADC и по прекъсване и извън прекъсванията. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|