STM Урок 197. LL. STM32F1. ADC. Injected Once Scan. Interrupt
Продолжаем работать с АЦП (ADC) контроллера STM32F1 с использованием библиотеки LL. Также работать мы пока будем с однократным преобразованием и с инжектированным каналом, используя при этом режим последовательного сканирования нескольких каналов, только отслеживать окончание процесса преобразования мы будем при помощи механизма прерываний от АЦП.
С данным механизмом мы уже неоднократно работали, поэтому, думаю, нам будет в данном уроке несложно.
Схема наша также осталась прежней
Проект мы будем использовать с прошлого урока с именем LL_ADC_INJ_ONCE_SCAN и назовём его LL_ADC_INJ_ONCE_SCAN_INT.
Откроем проект в Cube MX и в настройках ADC1 включим глобальные прерывания

Сгенерируем проект для Keil, откроем его, настроим автоперезагрузку после прошивки, отключим оптимизацию, подключим к дереву проекта файлы lcd.c и i2c_user.c, откроем main.c и добавим глобальный пользовательский флаг
|
1 2 |
/* USER CODE BEGIN PV */ __IO uint8_t fl_adc; |
Добавим функцию, в которой данный флаг будет устанавливаться
|
1 2 3 4 5 |
/* USER CODE BEGIN 4 */ void ADC_ConvCpltCallback(void) { fl_adc = 1; } |
Добавим прототип для данной функции в файле stm32f1xx_it.c
|
1 2 |
/* USER CODE BEGIN PFP */ void ADC_ConvCpltCallback(void); |
В функции-обработчике прерываний ADC1_2_IRQHandler сбросим флаг прерывания, если он установлен, и вызовем нашу функцию
|
1 2 3 4 5 6 7 8 |
void ADC1_2_IRQHandler(void) { /* USER CODE BEGIN ADC1_2_IRQn 0 */ if(LL_ADC_IsActiveFlag_JEOS(ADC1) != 0) { LL_ADC_ClearFlag_JEOS(ADC1); ADC_ConvCpltCallback(); } |
Вернёмся в main.c и включим локальные прерывания по событию окончания преобразования в функции main()
|
1 2 |
LCD_ini(); LL_ADC_EnableIT_JEOS(ADC1); |
Добавим в строку на дисплее слово
LCD_String("Scan Interrupt");
Удалим вот эти строки из бесконечного цикла
while (!LL_ADC_IsActiveFlag_JEOS(ADC1)) {}
LL_ADC_ClearFlag_JEOS(ADC1);
Вместо них обработаем установку нашего пользовательского флага
|
1 2 3 |
LL_ADC_INJ_StartConversionSWStart(ADC1); while (!fl_adc) {} fl_adc = 0; |
Всё готово. Проверим, как наш код будет работать с практической схемой




Всё отлично работает, все каналы сканируются и все преобразованные в вольты показатели выводятся на экран дисплея.
Таким образом, в данном уроке нам удалось, используя наши накопленные знания, запустить механизм обработки прерываний АЦП, используя при этом инжектированную группу каналов, в результате чего мы теперь можем отслеживать событие окончания преобразования в отдельном обработчике, не затрагивая ход основной программы. Хотя сейчас это у нас не особо заметно, так как процедуру перерасчёта в вольты сырого значения сигнала и вывод его на дисплей мы проделываем по-прежнему в основном коде, и также висим перед этим, дожидаясь пользовательского флага, ибо мы не можем столь не совсем короткие вещи поручить обработчику прерываний, тем не менее мы знаем, как данный обработчик организовать, что в будущем позволит нам более короткие процедуры обработки окончания преобразования вынести именно туда.
Всем спасибо за внимание!
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Программатор недорогой можно купить здесь ST-Link V2
Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004
Логический анализатор 16 каналов можно приобрести здесь
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)




Добавить комментарий