STM Урок 193. LL. STM32F1. ADC. Injected Once. Interrupt
Продолжаем работать с АЦП (ADC) контроллера STM32F1 с использованием библиотеки LL. Также работать мы пока будем с однократным преобразованием и с инжектированным каналом, только отслеживать окончание процесса преобразования мы будем при помощи механизма прерываний от АЦП.
В уроке 186 мы уже работали с прерываниями от АЦП, правда работали мы тогда с регулярным каналом, но, думаю, что с инжекторным каналом использование механизма прерываний будет аналогичным.
Схема урока у нас также не изменится
Проект мы будем использовать с прошлого урока с именем LL_ADC_INJ_ONCE и назовём его LL_ADC_INJ_ONCE_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 |
/* 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); |
Добавим строку на дисплей
|
1 2 3 |
LCD_String("Jnjected Once"); LCD_SetPos(0,2); LCD_String("Intrrupt"); |
Удалим вот эти строки из бесконечного цикла
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 (нажмите на картинку)





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