Существует ли функция ISR библиотеки HAL, которая автоматически срабатывает при получении байта в буфер Rx SPIx на STM32L4xx? - PullRequest
1 голос
/ 21 апреля 2020

Мне интересно, есть ли определяемая пользователем встроенная функция ISR в библиотеке HAL, которая срабатывает, как только байт получен в буфере SPIx Rx на MCM STM32L4xx? Например, в качестве теста запуска я хотел бы послать один байт (0xB C) от базовой платы ядра STM32L452 через SPI2 на подчиненную плату ядра STM32L452. Как только ведомая плата получает байт, она мигает светодиодом 2 и передает другой байт (0xCD) обратно ведущему. Как только мастер получает байт, он мигает LED2 в качестве подтверждения. Я инициализировал обе платы как Master / Slave, включил DMA и глобальные прерывания, 8 бит на передачу, используя MXcube. Я могу добиться того, что хочу, используя функции HAL_SPI_Transmit_DMA () и HAL_SPI_Receive_DMA () и задержки, записанные в часть while (1) моей основной подпрограммы (как показано ниже). Однако я хотел бы добиться того же, используя функцию ISR, которая автоматически выполняется при получении байта в буфер приема SPI.

Мастер-код:

   uint8_t spiDataReceive = 0;
   uint8_t spiDataTransmit = 0xBC;

   while(1) {
       if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) {
             //Transmit byte 0xBC to Slave and Receive Response
             HAL_SPI_Transmit_DMA(&hspi2, &spiDataTransmit, 1);
             HAL_Delay(20);
             HAL_SPI_Receive_DMA(&hspi2, &spiDataReceive, 1);

             if(spiDataReceive == 0xCD) {
                 flashLED2();
                 spiDataReceive = 0x00;
             }
        }
   }

Код ведомого:

 uint8_t spiDataReceive = 0;
 uint8_t spiDataTransmit = 0xCD;

 while(1) {
      HAL_SPI_Receive_DMA(&hspi2, &spiDataReceive, 1);
      HAL_Delay(10);

      if(spiDataReceive == 0xBC) {
         HAL_SPI_Transmit_DMA(&hspi2, &spiDataTransmit, 1);
         flashLED2();
         spiDataReceive = 0x00;
      }
 }

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Библиотека не требуется. Вам необходимо установить бит RNE IE в регистре SPI CR и включить в NVI C прерывание. 2 строки кода. Библиотеки не нужны.

Единственным необходимым ресурсом является Справочное руководство с веб-сайта STM.

0 голосов
/ 25 апреля 2020

Да, HAL предоставляет пользовательские обратные вызовы. Чтобы использовать их, вы должны активировать соответствующее прерывание в NVI C и вызвать обработчик HAL из таблицы векторов прерываний (пожалуйста, посмотрите также stm32l4xx_it.c).

Но прежде чем сделать это, вам следует рассмотреть следующие вопросы:

  • Если вы чувствуете растерянность или разочарование в связи со сложностью библиотек ST HAL, прочитайте Справочное руководство и следуйте совету P__J__ (см. другой ответ). Если вы чувствуете растерянность или разочарование в связи со сложностью аппаратного интерфейса, следуйте настоящему ответу.

  • Оба HAL_SPI_Transmit_DMA() и HAL_SPI_Transmit_IT() поддерживают переменное число байтов передачи. Если все, что вам нужно, это однобайтовая передача, функции HAL могут быть излишними. Их преимущество заключается в том, что вы можете запускать некоторые C библиотечные функции, не имея дело с доступом к регистру HW в C (если это довольно ново для вас, происходящее из экосистемы arduino). И, конечно, для передачи более одного байта через один и тот же интерфейс при расширении приложения.

  • Вы должны решить, хотите ли вы получить прерывание от DMA, к которому вы привязали UART, или если вы хотите избежать DMA и получить прерывание от самого UART. С моей точки зрения, вы на самом деле не должны запускать ISR с помощью того же события прерывания, которое используется для запуска передачи DMA для извлечения данных!

  • In Точно так же, как вы найдете описание регистров HW в Справочном руководстве и Таблица данных контроллера, вы найдете документацию по HAL (концепция расслоения, требования к использованию и т.д. * 1061). *.) в Руководстве пользователя STM32L4 / L4 + HAL и низкоуровневых драйверов (см. разделы 70 и 102, соответственно, и главу 3). Конечно, этот интерфейс предназначен главным образом для абстракции и переносимости, тогда как непосредственная адресация интерфейса HW обычно позволяет намного повысить эффективность с точки зрения задержки / загрузки ЦП и использования ПЗУ / ОЗУ. Драйверы библиотеки «низкого уровня» нацелены на определенный компромисс, но если вы новичок во всей этой топике c и не знаете, с чего начать, вам следует либо начать с интерфейса регистра HW, либо с API переносимой библиотеки HAL .

  • Если документы спецификации (описание HW или Lib) слишком абстрактны для вас, и вы предпочитаете некоторый практический источник информации, вы можете сначала взглянуть на примеры прошивок STM32Cube для STM32CubeL4 . К ним также относятся случаи использования обмена данными SPI (например, SPI_FullDuplex_ComIT), которые доступны для NUCLEO-L4532RE (и других) и описаны в замечании по применению AN4726 (стр. 16).


Помимо выбора / обработки прерываний, вам следует проверить еще два аспекта вашей программы:

  • Если вы получаете прерывание от оборудования, есть нет никаких причин для вызовов HAL_Delay().

  • Имейте в виду, что в SPI вы можете только «возвращать» данные от подчиненного к ведущему, пока ведущий передает данные (которые могут быть нулевыми данные). В противном случае вызов «передача» на ведомой стороне будет только помещать данные в регистр TX, а периферийное устройство SPI будет бесконечно ожидать триггера SCK от ведущего ...

...