STM Урок 183. CMSIS. STM32F1. USART. Interrupt



В данном занятии мы поработаем с механизмом обработки прерываний от шины USART.

С такими прерываниями мы с вами знакомы давно. Мы пользовались ими с применением библиотеки HAL в уроке 14, с применением библиотеки LL в уроке 163.

Ко всему этому, зная всю аппаратную организацию шины USART в контроллере STM32F1, нам будет не сложно проделать данную работу и с применением библиотеки CMSIS.

Схема наша также не изменилась, поэтому можем смело приступить к практической части урока.

Проект занятия был сделан из проекта прошлого урока с именем CMSIS_USART_RX и получил новое имя CMSIS_USART_INT.

Откроем наш проект в Keil и в файле main.c добавим ещё две глобальные переменные — пользовательский флаг и целую беззнаковую для хранения байта данных

 

 

В функции USART1_Init разрешим глобальные прерывания от USART1

 

 

Также в функции main() разрешим от данного модуля локальные прерывания — по заполнению приёмного буфера и по ошибке передачи данных

 

 

В бесконечном цикле мы практически код вообще не трогаем, только проведём небольшую оптимизацию. Мы применим для взятия подстроки из строки приёма адресную арифметику.

Вот эту строку удалим

 

strncpy(tmp_str,rx_str+7,4);

 

 

Символ перевода каретки, переданный из ПК, заменим нулём

 

 

А в следующей строке в качестве аргумента в функцию преобразования строки в число возьмём указатель на седьмой элемент нашего приёмного символьного массива, воспользовавшись адресной арифметикой

 

i = atoi (rx_str+7);

 

Добавим обработчик прерывания от модуля USART в самом низу файла

 

 

Здесь практически всё так же, как и в уроке 163. Если мы попали в данный обработчик по флагу RXNE, то младший байт регистра данных мы присвоим нашей глобальной переменной и также установим пользовательский флаг, а если по какой-либо ошибке, то просто прочитаем данный регистр вникуда, как предусматривает техническая документация.

 

 

Из функции обмена данными USART_RX_TX_Str удалим вот эти строки, так как мы теперь здесь отслеживать флаг RXNE уже не будем. Удаляем в обоих местах

 

while (READ_BIT(USART1->SR, USART_SR_RXNE) != (USART_SR_RXNE)) {}

rx_dt[ind] = (uint8_t)(USART1->DR & 0x00FF);

 

А вместо этого мы дождёмся установки пользовательского флага, сбросим его

 

 

 

Больше в нашем коде ничего не меняется.

Соберём код, прошьём контроллер, включим обмен в терминальной программе и запустим наш скрипт, который мы писали в прошлом уроке.

А вот и результат работы кода

 

 

 

 

Итак, на данном уроке мы научились пользоваться механизмом обработки прерываний от шины USART с применением библиотеки CMSIS. Какие достоинства прерываний существуют для работы программы, думаю, объяснять не нужно.

Всем спасибо за внимание!

 

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

Переходник USB to TTL можно приобрести здесь ftdi ft232rl

Индикатор светодиодный семиразрядный с драйвером MAX7219

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM CMSIS. STM32F1. USART. Interrupt

5 комментариев на “STM Урок 183. CMSIS. STM32F1. USART. Interrupt
  1. Alex:

    Bylo by kstati primery s dma.

  2. Alex:

    Hochu Vas poprosit' sdelat' odin, ili neskol'ko urokov na cmsis po kaskadirovaniyu modulej pereferii. Ya sam chasto programmiruyu stm i kak pravilo mnogo otdel'nyh blokov prihoditsya sobit' v kaskady. Dabit'sya neohodimogo rezul'tata byvaet ne prosto, osobeno na cmsis. Seichas u menya stm32f334r8 , tak , kak u nego est' hrtim modul'. Na cmsis vystavlyat' hrtim , hoobshe truba. A mne eshe prishlos' cheres eventy ot hrtima sapuskat' mnogo kanalov adc. ADC dolzhen k tomuzhe vse znacheniya sohranyat' cherez dma + CAN. Koroche cherez Interrupty ne vyshlo, tak kak slischkom mnogo interruptov ne uspevali obrabatyvatsya u znacheniya ot ADC Regulara s naskol'kih kanalov nachanali putatsya. Chastichno projekt zapilil na HAL , no adc_DMA_START funkciya pochemu-to ne zapuskala adc_dma , prishlos mnogoe samomu na cmcsis dopisyvat'. Hochju otkazat'sya polnost'yu ot hal i pereiti na cmsis . Nadoelo pri bolee menee bol'shih projektah, razbirat'sya pochemu ne rabotayut hal funkcii, da i po vremyani hal medlyannyj . A pri O3 optimizacii voobshe mnogie funkcii hal perestayut rabotat'. Esli by Vi pomogli , sdelav neskol'ko urokov po sovmesheniyu neskol'kih blokov (3-4)pereferii na cmsis, bylo by prosto zamechatel'no.

  3. Николай:

    Здравствуйте. Пытаюсь запусти ть дисплей на ili9486, на stm32f103c8t6 с помощью ногодрыга. Взял под копирку код с avr до чтения регистра с кодом контроллера дисплея. Никак не получается. Не могли бы вы помочь мне разобраться с этим?

    • Alex:

      Zachem nogodryg ? Voz'mi gotovie faili .c .h kak biblioteku( sdes ili k primeru v github). Nu a spi ili i2c v CubeMX za 5 minut i vse poletit. U menya na stm32f407ve cherez i2c zarabotal, no ne srazu. Pochemu to otkazalsya na 1 i2c rabotat', A na vtorom bez problem. Bylo kakoi-to zapadlo na optimezacii O3 na pervom ic2 s hal funkcionalom.

  4. Тут в коде есть непонятка как битREAD_BIT(USART1->CR1, USART_CR1_RXNEIE) == (USART_CR1_RXNEIE))) можно писать в прерывании?

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*