24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Не нашёл трэда про микроконтроллеры - создал. На микроконтроллере STM32F303VCT6 запустил прерывания по завершению преобразования АЦП (End of conversion of a regular group) выстави соответствующие биты EOC. Но когда увеличиваю значение sampling time больше 2 (010 в двоичном), то прерывания перестают происходить. АЛУ при этом нормально работает, взаимодействует с портами (для проверки кнопкой зажигаю светодиод, а при отжатой кнопки светодиод мигает от прерываний) Как и почему sampling time отключает прерывания?
Код настройки АЦП: NVIC->ISER[0] = (1 << ((uint32_t)(18)));////установить прерывание 18, под которым АЦП ADC1->CR = ADC_CR_ADVREGEN_0; // напряжение ADC1->IER |= ADC_IER_EOCIE; // прерывание по готовности ADC1->CFGR |= ADC_CFGR_CONT; // непрерывный режим ADC1->SQR1 |= ADC_SQR1_SQ1_0; // канал 1 ADC1->SMPR1 |= ADC_SMPR1_SMP1_1;// Вот тут не работает при больших sampling time ADC12_COMMON->CCR |= ADC12_CCR_VBATEN | ADC12_CCR_TSEN | ADC12_CCR_VREFEN | ADC12_CCR_CKMODE_0 | ADC12_CCR_CKMODE_1; // включения дополнений и предделитель 4 ADC1->CR = ADC_CR_ADVREGEN_0 | ADC_CR_ADEN; // включение ADC1->ISR = ADC_ISR_EOC; // сбросить бит прерывания по готовности ADC1->CR = ADC_CR_ADVREGEN_0 | ADC_CR_ADEN | ADC_CR_ADSTART; // пуск
>>2208183 (OP) > Не нашёл трэда про микроконтроллеры Это тонкий намёк на то, что на этой доске одни вебмакаки, и в микроконтроллерах никто не разбирается.
Контроллер не выставляет бит события при больших sampling timeАнонимOP10/11/21 Срд 14:36:08#4№2208784
>>2208183 (OP) Оказывает при sampling time больше 4,5 ADC clock cycles (то есть биты SMP в регистре SMPR равны 011 или больше) не появляется единица в бите события EOC в регистре ISR после простого запуска АЦП. Это проверил прочтением EOC в замкнутом цикле при выключенных прерываниях.
>>2208667 >hw Это где? Я искал в гугле по запросу STM32 ADC interrupt sampling time.
>>2208784 Бля. Вот это прикол. В реф. мануале что-то сказано по этому поводу? Если такое время ок согласно мануалу (сложилось так, что на стм мало с АЦП работал и не помню нихуя) - то, подозреваю, дьявол может крыться в тактовой частоте шины, на которой сидит АЦП.
>>2211604 >мануале что-то сказано по этому поводу? Нет, лишь влияние минимального значения на качество оцифровки, но не максимального и не работы модуля.
>>2211604 >тактовой частоте шины, на которой сидит АЦП Менял от 0,25МГц до 4МГц, никакой разницы.
На микроконтроллере STM32F303VCT6 запустил прерывания по завершению преобразования АЦП (End of conversion of a regular group) выстави соответствующие биты EOC. Но когда увеличиваю значение sampling time больше 2 (010 в двоичном), то прерывания перестают происходить. АЛУ при этом нормально работает, взаимодействует с портами (для проверки кнопкой зажигаю светодиод, а при отжатой кнопки светодиод мигает от прерываний)
Как и почему sampling time отключает прерывания?
Код настройки АЦП:
NVIC->ISER[0] = (1 << ((uint32_t)(18)));////установить прерывание 18, под которым АЦП
ADC1->CR = ADC_CR_ADVREGEN_0; // напряжение
ADC1->IER |= ADC_IER_EOCIE; // прерывание по готовности
ADC1->CFGR |= ADC_CFGR_CONT; // непрерывный режим
ADC1->SQR1 |= ADC_SQR1_SQ1_0; // канал 1
ADC1->SMPR1 |= ADC_SMPR1_SMP1_1;// Вот тут не работает при больших sampling time
ADC12_COMMON->CCR |= ADC12_CCR_VBATEN | ADC12_CCR_TSEN | ADC12_CCR_VREFEN | ADC12_CCR_CKMODE_0 | ADC12_CCR_CKMODE_1; // включения дополнений и предделитель 4
ADC1->CR = ADC_CR_ADVREGEN_0 | ADC_CR_ADEN; // включение
ADC1->ISR = ADC_ISR_EOC; // сбросить бит прерывания по готовности
ADC1->CR = ADC_CR_ADVREGEN_0 | ADC_CR_ADEN | ADC_CR_ADSTART; // пуск