Отговори на тема  [ 11 мнения ] 
STM32F4: помощ за ADC/IT последователност 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 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 не се забелязва спиране (за няколко часа, но това нищо не значи).

Като гледам последователността на стартиране (без да съм експерт) си представам, че може преобразуването да завършва преди да се инициализира прекъсването (например, ако между старта на преобразуването и инизиализацията на прекъсването дойдат други прекъсвания и преобразуването завърши. Не съм наясно и ако инициализирам прекъсването след завършване на преобразуванетоп дали прекъсването срабтова).


Процедурата за иницализация на канала и стартиране на прекъсването:
Код:
static bool ISF_ADC_IRQ_START_HAL(uint32_t sConfig_Channel)
{
   sConfig.Channel = sConfig_Channel;
   sConfig.Rank = 1;
   sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES; //<<<???

   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
   {
       // ADC error
      isf_adc_Result = 0x81000000 | (1<<sConfig_Channel);
      return false;
   }

   if (HAL_ADC_Start_IT( &hadc1 )!= HAL_OK)
   {
      isf_adc_Result = 0x82000000 | (1<<sConfig_Channel);
      return false;
   }

   isf_adc_Result = 0x80000000 | (1<<sConfig_Channel);

   return true;
}


Съб Сеп 25, 2021 4:45 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: STM32F4: помощ за ADC/IT последователност
Ползваш ли из кода, забраняване/разрешаване на прекъсвания?

_________________
Най-опасният враг на истината и свободата е мнозинството.


Съб Сеп 25, 2021 6:23 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 9:32 pm
Мнения: 710
Мнение Re: STM32F4: помощ за ADC/IT последователност
Zdrav написа:
Ползваш ли из кода, забраняване/разрешаване на прекъсвания?

Кодът е генериран предимно от 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
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 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
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 9:32 pm
Мнения: 710
Мнение Re: STM32F4: помощ за ADC/IT последователност
Zdrav написа:
Т.е. има две места ...

Благодаря ти много за съдействието!

Да, сложил съм "всякакви" броячи :) и не, не е сработвал тоя за спирането и не се е налагало да "сритвам" - от вчера си работи нормално.

Благодаря ти за предложението да намеря причината за спиранията - върху това се съсредоточавам.
Но в таймера винаги (и когато спираше) проверявам дали е изброил всички канали - ползвах флаг, който се вдига при прочитане на данните от последния канал.
Сега ще сложа някакво забавяне между старта на ADC и разрешаване на прекъсванията му - това може да стане по причина, която си посочил - друго прекъсване.


Нед Сеп 26, 2021 10:51 am
Профил ICQ WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 9:32 pm
Мнения: 710
Мнение Re: STM32F4: помощ за ADC/IT последователност
Zdrav написа:
Т.е. има две места ...


ПП
Сега се задълбочих и изчетох сорсовете - не съм прав.
Превключването на канала не стартира преобразуването.
Преобразуването се стартира от функцията, която разрешава и прекъсванията и в нея съвсем точно си ползват __HAL_LOCK(hadc);
Хм. Освен да съм се заблудил и по някаква моя грешка при дебъгване да е спирала джаджата :?


Нед Сеп 26, 2021 10:59 am
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: STM32F4: помощ за ADC/IT последователност
Едно е сигурно. Темата не е за "Микроконтролери-Хардуер".
Може ли да постнеш тук имплементацията на __HAL_LOCK(hadc) така както е в твоя код. Интересно е да се види, какво прави.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Нед Сеп 26, 2021 2:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: STM32F4: помощ за ADC/IT последователност
Намерих го. От тук:
https://github.com/STMicroelectronics/STM32CubeF4
Код:

#define __HAL_LOCK(__HANDLE__)                                           \
                                do{                                        \
                                    if((__HANDLE__)->Lock == HAL_LOCKED)   \
                                    {                                      \
                                       return HAL_BUSY;                    \
                                    }                                      \
                                    else                                   \
                                    {                                      \
                                       (__HANDLE__)->Lock = HAL_LOCKED;    \
                                    }                                      \
                                  }while (0U)


Как мислиш това може ли да се ползва за правене на критична секция при preemptive multitasking?

_________________
Най-опасният враг на истината и свободата е мнозинството.


Нед Сеп 26, 2021 3:12 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 9:32 pm
Мнения: 710
Мнение Re: STM32F4: помощ за ADC/IT последователност
Zdrav написа:
Намерих го. От тук: ...

(Извинявай за забавянето - нещото ми ме ангажира :) )

Да, разбирам те - когато HAL е зает просто се прави
return HAL_BUSY;
и нищо не се инициализира. Това обяснява нещата.
Благодаря ти, че ми показа простотата :)


Нед Сеп 26, 2021 8:39 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 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
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 9:32 pm
Мнения: 710
Мнение Re: STM32F4: помощ за ADC/IT последователност
Да кажа за проблема, че сега видях, че не съм описал глупостта: по IT и по-късно по DMA гличовете се случваха, защото понякога се е активирала заявка за едно извънредно мерене, което историчски си е останало на poll. Естествено е работите да се объркат, когато се ползва едно и също ADC и по прекъсване и извън прекъсванията.


Вто Ное 09, 2021 2:35 pm
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 11 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


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

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни