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