Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 12:34:50

Притомился искать - решил уточнить у честнОй кампании... :)
Is it correct?
Код:
void ADC_IRQHandler (void) {
   
   if ((ADC1->IER & ADC_IER_ADRDYIE) && (ADC1->ISR & ADC_ISR_ADRDY)) {
      ADC1->ISR |= ADC_ISR_ADRDY;   // флаг сбрасываю правильно?
      
   //бла...бла...бла   
      
   }
}

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 12:57:12

Там же все поля помечены как rc_w1, т.е. очистка записью единицы, ноль ни на что не влияет:
Код:
ADC1->ISR = ADC_ISR_ADRDY;

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 12:58:11

непонятно, зачем его сбрасывать в 1, если он равен 1

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:06:26

зачем его сбрасывать в 1

Bit 0 ADRDY: ADC ready
This bit is set by hardware after the ADC has been enabled (bit ADEN=1) and when the ADC reaches
a state where it is ready to accept conversion requests.
It is cleared by software writing 1 to it.
0: ADC not yet ready to start conversion (or the flag event was already acknowledged and cleared
by software)
1: ADC is ready to start conversion


ноль ни на что не влияет:

Ааа, ну да. Хотя по результату разница только в количестве инструкций.
Спасибо.

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:12:27

Ааа, ну да. Хотя по результату разница только в количестве инструкций.
Спасибо.

Нет, rc_w1 - это read/clear, причем очистка атомарная. Если оставить RMW, то будут прочитаны единицы для всех установленных флагов и, соответственно, сброшены будут тоже ни все, а не только ADRDY.

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:15:18

А я бы ещё никому не нужные проверки выкинул.
Код:
if ((ADC1->IER & ADC_IER_ADRDYIE) && (ADC1->ISR & ADC_ISR_ADRDY))
Вы что, можете попасть в прерывание если оно не разрешено?

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:17:04

Вы что, можете попасть в прерывание если оно не разрешено?

Прерывание одно, флагов много, прерывания включены не для всех, а сами флаги при этом все равно могут выставляться...

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:17:13

Ааа, ну да. Хотя по результату разница только в количестве инструкций.

Это не так. Прочитайте в RM описание этого регистра.
Исходя из этого описания, можно понять что:
операция: ADC1->ISR = 1; сбросит в 0 только бит0;
операция: ADC1->ISR |= 1; сбросит в 0 бит0 и все другие биты которые были==1 на момент операции чтения.
Т.е. - во втором случае между делом потеряете также флаги-уведомления о других событиях кроме ADRDY которые успеют установиться до чтения.

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:18:17

Включаете одно нужное вам для работы.

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:18:47

VladislavS, я тоже об этом подумал, но на самом деле, можно попасть.

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:19:28

Куда попасть?

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:20:41

в функцию, которую вызывает прерывание.

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:23:40

Прерывание одно, флагов много, прерывания включены не для всех, а сами флаги при этом все равно могут выставляться...
ISR написан очевидно для обработки данного события (о котором флаг), а значит видимо оно должно быть включено. Логично? Значит - проверка бита разрешения в IER - не нужна.

PS: Странно что вообще компилятор такое позволяет без варнинга:
if ((ADC1->IER & ADC_IER_ADRDYIE) && (ADC1->ISR & ADC_ISR_ADRDY))
по идее - должен ругнуться на такое. Или ТС игнорирует этот варнинг (а зря!) или регистр периферии определён неправильно. Имха.

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:24:09

Куда попасть?

Попасть впросак. Потому что сегодня мне нужен один флаг, а завтра - еще один.
Проверка разрешений - стандартная процедура в случаях с групповыми прерываниями. Эеономит на спичках тут как то некуртуазно.
Однако всем большое спасибо. Действительно, RMW тут не катит.

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:24:45

в функцию, которую вызывает прерывание.
Как?

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:26:19

стандартным вызовом. Разве это запрещено?

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:26:24

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

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:27:20

Странно что вообще компилятор такое позволяет без варнинга:
if ((ADC1->IER & ADC_IER_ADRDYIE) && (ADC1->ISR & ADC_ISR_ADRDY))
по идее - должен ругнуться на такое. Или ТС игнорирует этот варнинг (а зря!) или регистр периферии определён неправильно. Имха.

Варнинга нет и быть не может. Регистр периферии определен не мной, а в CMSIS. Мало того, я следую в написании имен по всплывающим подсказкам. Как в именах, так и в константах. Что не так?

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:28:05

Потому что сегодня мне нужен один флаг, а завтра - еще один.
Вот когда нужен будет, тогда и напишете. А в первом сообщени две избыточных проверки. Одна из которых избыточна при любом количестве используемых флагов.

Re: STM32F030 ADC Handler CMSIS

Чт янв 07, 2021 13:29:26

бита разрешения - скорей всего нет.

Вообще то я пользуюсь практикой SPL, не прибегая к ней самой. Там все выглядит именно так - проверка разрешения && проверка флага - сброс флага - обработчик.
Ответить